]> git.sur5r.net Git - freertos/commitdiff
RISC-V:
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Wed, 12 Sep 2018 16:33:05 +0000 (16:33 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Wed, 12 Sep 2018 16:33:05 +0000 (16:33 +0000)
Added code to setup the timer interrupt - not tested yet.
Added the taskYIELD() implementation - so far just checked it generates an interrupt.

git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2583 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS/Source/portable/GCC/RISC-V-RV32/port.c
FreeRTOS/Source/portable/GCC/RISC-V-RV32/portmacro.h

index 4fab2fd6a7fae41127274187ffcc67a60e727d33..17dbb0d8075a9b12f6efc1680483f97752dc83d3 100644 (file)
@@ -39,7 +39,7 @@
  * file is weak to allow application writers to change the timer used to\r
  * generate the tick interrupt.\r
  */\r
-void vPortSetupTimerInterrupt( void );\r
+void vPortSetupTimerInterrupt( void ) __attribute__(( weak ));\r
 \r
 /*\r
  * Used to catch tasks that attempt to return from their implementing function.\r
@@ -48,10 +48,16 @@ static void prvTaskExitError( void );
 \r
 /*-----------------------------------------------------------*/\r
 \r
+/* Used to program the machine timer compare register. */\r
+static uint64_t ullNextTime = 0ULL;\r
+static volatile uint64_t * const pullMachineTimerCompareRegister = ( volatile uint64_t * const ) 0x2004000;\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
 void prvTaskExitError( void )\r
 {\r
 volatile uint32_t ulx = 0;\r
-\r
+#warning prvTaskExitError not used yet.\r
        /* A function that implements a task must not exit or attempt to return to\r
        its caller as there is nothing to return to.  If a task wants to exit it\r
        should instead call vTaskDelete( NULL ).\r
@@ -154,6 +160,29 @@ StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t px
 }\r
 /*-----------------------------------------------------------*/\r
 \r
+void vPortSetupTimerInterrupt( void )\r
+{\r
+uint32_t ulCurrentTimeHigh, ulCurrentTimeLow;\r
+volatile uint32_t * const pulTimeHigh = ( volatile uint32_t * const ) 0x200BFF8;\r
+volatile uint32_t * const pulTimeLow = ( volatile uint32_t * const ) 0x200BFFc;\r
+\r
+       do\r
+       {\r
+               ulCurrentTimeHigh = *pulTimeHigh;\r
+               ulCurrentTimeLow = *pulTimeLow;\r
+       } while( ulCurrentTimeHigh != *pulTimeHigh );\r
+\r
+       ullNextTime = ( uint64_t ) ulCurrentTimeHigh;\r
+       ullNextTime <<= 32ULL;\r
+       ullNextTime |= ( uint64_t ) ulCurrentTimeLow;\r
+       ullNextTime += ( configCPU_CLOCK_HZ / configTICK_RATE_HZ );\r
+       *pullMachineTimerCompareRegister = ullNextTime;\r
+\r
+       /* Enable timer interrupt */\r
+       __asm volatile( "csrs mie, %0" :: "r"(0x80) );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
 BaseType_t xPortStartScheduler( void )\r
 {\r
        __asm volatile\r
@@ -189,6 +218,7 @@ BaseType_t xPortStartScheduler( void )
                "lw             x6, 100( sp )                   \r\n" /* X6 */\r
                "lw             x5, 104( sp )                   \r\n" /* X5 */\r
                "lw             x1, 108( sp )                   \r\n" /* X1 */\r
+               "csrs   mie, 8                                  \r\n" /* Enable soft interrupt. */\r
                "csrs   mstatus, 8                              \r\n" /* Enable interrupts. */\r
                "ret                                                            "\r
        );\r
@@ -198,8 +228,5 @@ BaseType_t xPortStartScheduler( void )
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-void vPortYield( void )\r
-{\r
-}\r
 \r
 \r
index 5d18ba34a0728cb17c2670003476d5c8cbe1c7d6..7132bf4bab32b48271a23ad2336946f92abb2510 100644 (file)
@@ -70,8 +70,7 @@ not need to be guarded with a critical section. */
 \r
 \r
 /* Scheduler utilities. */\r
-extern void vPortYield( void );\r
-#define portYIELD()                                    vPortYield()\r
+#define portYIELD() {  volatile uint32_t * const ulSoftInterrupt = ( uint32_t * ) 0x2000000;   *ulSoftInterrupt = 1UL; }\r
 #define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) vPortYield()\r
 #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )\r
 /*-----------------------------------------------------------*/\r