\r
/* Used to program the machine timer compare register. */\r
static uint64_t ullNextTime = 0ULL;\r
+static const uint64_t ullTimerIncrementsForOneTick = ( uint64_t ) ( configCPU_CLOCK_HZ / configTICK_RATE_HZ );\r
static volatile uint64_t * const pullMachineTimerCompareRegister = ( volatile uint64_t * const ) ( configCTRL_BASE + 0x4000 );\r
\r
/*-----------------------------------------------------------*/\r
void vPortSetupTimerInterrupt( void )\r
{\r
uint32_t ulCurrentTimeHigh, ulCurrentTimeLow;\r
-volatile uint32_t * const pulTimeHigh = ( volatile uint32_t * const ) ( configCTRL_BASE + 0xBFF8 );\r
-volatile uint32_t * const pulTimeLow = ( volatile uint32_t * const ) ( configCTRL_BASE + 0xBFFc );\r
+volatile uint32_t * const pulTimeHigh = ( volatile uint32_t * const ) ( configCTRL_BASE + 0xBFFC );\r
+volatile uint32_t * const pulTimeLow = ( volatile uint32_t * const ) ( configCTRL_BASE + 0xBFF8 );\r
\r
do\r
{\r
ullNextTime = ( uint64_t ) ulCurrentTimeHigh;\r
ullNextTime <<= 32ULL;\r
ullNextTime |= ( uint64_t ) ulCurrentTimeLow;\r
- ullNextTime += ( configCPU_CLOCK_HZ / configTICK_RATE_HZ );\r
+ ullNextTime += ullTimerIncrementsForOneTick;\r
*pullMachineTimerCompareRegister = ullNextTime;\r
\r
+ /* Prepare the time to use after the next tick interrupt. */\r
+ ullNextTime += ullTimerIncrementsForOneTick;\r
+\r
/* Enable timer interrupt */\r
__asm volatile( "csrs mie, %0" :: "r"(0x80) );\r
}\r
vTaskSwitchContext();\r
\r
/* Clear software interrupt. */\r
- *ulSoftInterrupt = 0UL;\r
+ *( ( uint32_t * ) configCTRL_BASE ) = 0UL;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void Timer_IRQHandler( void )\r
+{\r
+ /* Reload for the next timer interrupt. */\r
+ *pullMachineTimerCompareRegister = ullNextTime;\r
+ ullNextTime += ullTimerIncrementsForOneTick;\r
+\r
+ if( xTaskIncrementTick() != pdFALSE )\r
+ {\r
+ portYIELD();\r
+ }\r
}\r
/*-----------------------------------------------------------*/\r
\r
+BaseType_t xPortStartScheduler( void )\r
+{\r
+extern void xPortStartFirstTask( void );\r
+\r
+ vPortSetupTimerInterrupt();\r
+ xPortStartFirstTask();\r
+\r
+ /* Should not get here as after calling xPortStartFirstTask() only tasks\r
+ should be executing. */\r
+ return pdFAIL;\r
+}\r
+\r
+\r
\r