]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/portable/GCC/RISC-V-RV32/port.c
Continue work on Risc V port.
[freertos] / FreeRTOS / Source / portable / GCC / RISC-V-RV32 / port.c
index 24611a9bef5d34802ec83323f953fa2c7e05a8c6..4f09da8ca3972c796d615c95f806145ff68e94d6 100644 (file)
@@ -50,6 +50,7 @@ static void prvTaskExitError( void );
 \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
@@ -165,8 +166,8 @@ StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t px
 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
@@ -177,9 +178,12 @@ volatile uint32_t * const pulTimeLow = ( volatile uint32_t * const ) ( configCTR
        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
@@ -192,8 +196,34 @@ volatile uint32_t * const ulSoftInterrupt = ( uint32_t * ) configCTRL_BASE;
        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