]> git.sur5r.net Git - freertos/commitdiff
Update to the latest atomic.h.
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 18 Nov 2019 16:28:03 +0000 (16:28 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 18 Nov 2019 16:28:03 +0000 (16:28 +0000)
Improve commenting in RISC-V GCC port.
Fix IAR RISC-V port so the first task starts with interrupts enabled.
Add references to third party page ref using newlib with FreeRTOS into the tasks.c file in each place newlib is referenced.
Move the position of the traceTASK_DELETE() trace macro in case of use with a memory allocator that writes over freed memory even when inside a critical section.
Efficiency improvement:  Make sure xTaskIncrementTick() does not return pdTRUE when the scheduler is locked.  This just prevents an unnecessary yield interrupt (unnecessary as it is ignored) when xYieldPending happens to be pdTRUE.

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

FreeRTOS/Source/include/atomic.h
FreeRTOS/Source/portable/GCC/RISC-V/portASM.S
FreeRTOS/Source/portable/GCC/RISC-V/portmacro.h
FreeRTOS/Source/portable/IAR/RISC-V/port.c
FreeRTOS/Source/portable/IAR/RISC-V/portASM.s
FreeRTOS/Source/portable/IAR/RISC-V/portmacro.h
FreeRTOS/Source/tasks.c

index b1789a057fbd334248220c2324d6007d6e844658..e0d0af3a4f38922c0c06fafd1be47ef2e87500f3 100644 (file)
@@ -29,9 +29,9 @@
  * @file atomic.h\r
  * @brief FreeRTOS atomic operation support.\r
  *\r
- * This file implements atomic by disabling interrupts globally.\r
- * Implementation with architecture specific atomic instructions\r
- * are to be provided under each compiler directory.\r
+ * This file implements atomic functions by disabling interrupts globally.\r
+ * Implementations with architecture specific atomic instructions can be\r
+ * provided under each compiler directory.\r
  */\r
 \r
 #ifndef ATOMIC_H\r
 extern "C" {\r
 #endif\r
 \r
-/* Port specific definitions -- entering/exiting critical section.\r
+/*\r
+ * Port specific definitions -- entering/exiting critical section.\r
  * Refer template -- ./lib/FreeRTOS/portable/Compiler/Arch/portmacro.h\r
  *\r
  * Every call to ATOMIC_EXIT_CRITICAL() must be closely paired with\r
  * ATOMIC_ENTER_CRITICAL().\r
- *  */\r
+ *\r
+ */\r
 #if defined( portSET_INTERRUPT_MASK_FROM_ISR )\r
 \r
        /* Nested interrupt scheme is supported in this port. */\r
@@ -71,11 +73,12 @@ extern "C" {
 \r
 #endif /* portSET_INTERRUPT_MASK_FROM_ISR() */\r
 \r
-/* Port specific definition -- "always inline".\r
- * Inline is compiler specific, and may not always get inlined depending on your optimization level.\r
- * Also, inline is considerred as performance optimization for atomic.\r
- * Thus, if portFORCE_INLINE is not provided by portmacro.h, instead of resulting error,\r
- * simply define it.\r
+/*\r
+ * Port specific definition -- "always inline".\r
+ * Inline is compiler specific, and may not always get inlined depending on your\r
+ * optimization level.  Also, inline is considered as performance optimization\r
+ * for atomic.  Thus, if portFORCE_INLINE is not provided by portmacro.h,\r
+ * instead of resulting error, simply define it away.\r
  */\r
 #ifndef portFORCE_INLINE\r
        #define portFORCE_INLINE\r
@@ -91,97 +94,98 @@ extern "C" {
  *\r
  * @brief Performs an atomic compare-and-swap operation on the specified values.\r
  *\r
- * @param[in, out] pDestination  Pointer to memory location from where value is\r
- *                                                        to be loaded and checked.\r
- * @param[in] ulExchange                If condition meets, write this value to memory.\r
- * @param[in] ulComparand              Swap condition.\r
+ * @param[in, out] pulDestination  Pointer to memory location from where value is\r
+ *                               to be loaded and checked.\r
+ * @param[in] ulExchange         If condition meets, write this value to memory.\r
+ * @param[in] ulComparand        Swap condition.\r
  *\r
  * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped.\r
  *\r
- * @note This function only swaps *pDestination with ulExchange, if previous\r
- *        *pDestination value equals ulComparand.\r
+ * @note This function only swaps *pulDestination with ulExchange, if previous\r
+ *       *pulDestination value equals ulComparand.\r
  */\r
-static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32(\r
-               uint32_t volatile * pDestination,\r
-               uint32_t ulExchange,\r
-               uint32_t ulComparand )\r
+static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( uint32_t volatile * pulDestination,\r
+                                                                                                                       uint32_t ulExchange,\r
+                                                                                                                       uint32_t ulComparand )\r
 {\r
-\r
-       uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;\r
+uint32_t ulReturnValue;\r
 \r
        ATOMIC_ENTER_CRITICAL();\r
-\r
-       if ( *pDestination == ulComparand )\r
        {\r
-               *pDestination = ulExchange;\r
-               ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;\r
+               if( *pulDestination == ulComparand )\r
+               {\r
+                       *pulDestination = ulExchange;\r
+                       ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;\r
+               }\r
+               else\r
+               {\r
+                       ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;\r
+               }\r
        }\r
-\r
        ATOMIC_EXIT_CRITICAL();\r
 \r
        return ulReturnValue;\r
-\r
 }\r
+/*-----------------------------------------------------------*/\r
 \r
 /**\r
  * Atomic swap (pointers)\r
  *\r
- * @brief Atomically sets the address pointed to by *ppDestination to the value\r
- *             of *pExchange.\r
+ * @brief Atomically sets the address pointed to by *ppvDestination to the value\r
+ *        of *pvExchange.\r
  *\r
- * @param[in, out] ppDestination  Pointer to memory location from where a pointer\r
- *                                                             value is to be loaded and written back to.\r
- * @param[in] pExchange                   Pointer value to be written to *ppDestination.\r
+ * @param[in, out] ppvDestination  Pointer to memory location from where a pointer\r
+ *                                 value is to be loaded and written back to.\r
+ * @param[in] pvExchange           Pointer value to be written to *ppvDestination.\r
  *\r
- * @return The initial value of *ppDestination.\r
+ * @return The initial value of *ppvDestination.\r
  */\r
-static portFORCE_INLINE void * Atomic_SwapPointers_p32(\r
-               void * volatile * ppDestination,\r
-               void * pExchange )\r
+static portFORCE_INLINE void * Atomic_SwapPointers_p32( void * volatile * ppvDestination,\r
+                                                                                                               void * pvExchange )\r
 {\r
-       void * pReturnValue;\r
+void * pReturnValue;\r
 \r
        ATOMIC_ENTER_CRITICAL();\r
-\r
-       pReturnValue = *ppDestination;\r
-\r
-       *ppDestination = pExchange;\r
-\r
+       {\r
+               pReturnValue = *ppvDestination;\r
+               *ppvDestination = pvExchange;\r
+       }\r
        ATOMIC_EXIT_CRITICAL();\r
 \r
        return pReturnValue;\r
 }\r
+/*-----------------------------------------------------------*/\r
 \r
 /**\r
  * Atomic compare-and-swap (pointers)\r
  *\r
  * @brief Performs an atomic compare-and-swap operation on the specified pointer\r
- *             values.\r
+ *        values.\r
  *\r
- * @param[in, out] ppDestination  Pointer to memory location from where a pointer\r
- *                                                             value is to be loaded and checked.\r
- * @param[in] pExchange                   If condition meets, write this value to memory.\r
- * @param[in] pComparand                 Swap condition.\r
+ * @param[in, out] ppvDestination  Pointer to memory location from where a pointer\r
+ *                                 value is to be loaded and checked.\r
+ * @param[in] pvExchange           If condition meets, write this value to memory.\r
+ * @param[in] pvComparand          Swap condition.\r
  *\r
  * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped.\r
  *\r
- * @note This function only swaps *ppDestination with pExchange, if previous\r
- *        *ppDestination value equals pComparand.\r
+ * @note This function only swaps *ppvDestination with pvExchange, if previous\r
+ *       *ppvDestination value equals pvComparand.\r
  */\r
-static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32(\r
-               void * volatile * ppDestination,\r
-               void * pExchange, void * pComparand )\r
+static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( void * volatile * ppvDestination,\r
+                                                                                                                                       void * pvExchange,\r
+                                                                                                                                       void * pvComparand )\r
 {\r
-       uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;\r
+uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;\r
 \r
        ATOMIC_ENTER_CRITICAL();\r
-\r
-       if ( *ppDestination == pComparand )\r
        {\r
-               *ppDestination = pExchange;\r
-               ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;\r
+               if( *ppvDestination == pvComparand )\r
+               {\r
+                       *ppvDestination = pvExchange;\r
+                       ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;\r
+               }\r
        }\r
-\r
        ATOMIC_EXIT_CRITICAL();\r
 \r
        return ulReturnValue;\r
@@ -195,103 +199,100 @@ static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32(
  *\r
  * @brief Atomically adds count to the value of the specified pointer points to.\r
  *\r
- * @param[in,out] pAddend  Pointer to memory location from where value is to be\r
- *                                              loaded and written back to.\r
- * @param[in] ulCount    Value to be added to *pAddend.\r
+ * @param[in,out] pulAddend  Pointer to memory location from where value is to be\r
+ *                         loaded and written back to.\r
+ * @param[in] ulCount      Value to be added to *pulAddend.\r
  *\r
- * @return previous *pAddend value.\r
+ * @return previous *pulAddend value.\r
  */\r
-static portFORCE_INLINE uint32_t Atomic_Add_u32(\r
-               uint32_t volatile * pAddend,\r
-               uint32_t ulCount )\r
+static portFORCE_INLINE uint32_t Atomic_Add_u32( uint32_t volatile * pulAddend,\r
+                                                                                                uint32_t ulCount )\r
 {\r
        uint32_t ulCurrent;\r
 \r
        ATOMIC_ENTER_CRITICAL();\r
-\r
-       ulCurrent = *pAddend;\r
-\r
-       *pAddend += ulCount;\r
-\r
+       {\r
+               ulCurrent = *pulAddend;\r
+               *pulAddend += ulCount;\r
+       }\r
        ATOMIC_EXIT_CRITICAL();\r
 \r
        return ulCurrent;\r
 }\r
+/*-----------------------------------------------------------*/\r
 \r
 /**\r
  * Atomic subtract\r
  *\r
  * @brief Atomically subtracts count from the value of the specified pointer\r
- *             pointers to.\r
+ *        pointers to.\r
  *\r
- * @param[in,out] pAddend  Pointer to memory location from where value is to be\r
- *                                              loaded and written back to.\r
- * @param[in] ulCount    Value to be subtract from *pAddend.\r
+ * @param[in,out] pulAddend  Pointer to memory location from where value is to be\r
+ *                         loaded and written back to.\r
+ * @param[in] ulCount      Value to be subtract from *pulAddend.\r
  *\r
- * @return previous *pAddend value.\r
+ * @return previous *pulAddend value.\r
  */\r
-static portFORCE_INLINE uint32_t Atomic_Subtract_u32(\r
-               uint32_t volatile * pAddend,\r
-               uint32_t ulCount )\r
+static portFORCE_INLINE uint32_t Atomic_Subtract_u32( uint32_t volatile * pulAddend,\r
+                                                                                                         uint32_t ulCount )\r
 {\r
        uint32_t ulCurrent;\r
 \r
        ATOMIC_ENTER_CRITICAL();\r
-\r
-       ulCurrent = *pAddend;\r
-\r
-       *pAddend -= ulCount;\r
-\r
+       {\r
+               ulCurrent = *pulAddend;\r
+               *pulAddend -= ulCount;\r
+       }\r
        ATOMIC_EXIT_CRITICAL();\r
 \r
        return ulCurrent;\r
 }\r
+/*-----------------------------------------------------------*/\r
 \r
 /**\r
  * Atomic increment\r
  *\r
  * @brief Atomically increments the value of the specified pointer points to.\r
  *\r
- * @param[in,out] pAddend  Pointer to memory location from where value is to be\r
- *                                              loaded and written back to.\r
+ * @param[in,out] pulAddend  Pointer to memory location from where value is to be\r
+ *                         loaded and written back to.\r
  *\r
- * @return *pAddend value before increment.\r
+ * @return *pulAddend value before increment.\r
  */\r
-static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pAddend )\r
+static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pulAddend )\r
 {\r
-       uint32_t ulCurrent;\r
+uint32_t ulCurrent;\r
 \r
        ATOMIC_ENTER_CRITICAL();\r
-\r
-       ulCurrent = *pAddend;\r
-\r
-       *pAddend += 1;\r
-\r
+       {\r
+               ulCurrent = *pulAddend;\r
+               *pulAddend += 1;\r
+       }\r
        ATOMIC_EXIT_CRITICAL();\r
 \r
        return ulCurrent;\r
 }\r
+/*-----------------------------------------------------------*/\r
 \r
 /**\r
  * Atomic decrement\r
  *\r
  * @brief Atomically decrements the value of the specified pointer points to\r
  *\r
- * @param[in,out] pAddend  Pointer to memory location from where value is to be\r
- *                                              loaded and written back to.\r
+ * @param[in,out] pulAddend  Pointer to memory location from where value is to be\r
+ *                         loaded and written back to.\r
  *\r
- * @return *pAddend value before decrement.\r
+ * @return *pulAddend value before decrement.\r
  */\r
-static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pAddend )\r
+static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pulAddend )\r
 {\r
-       uint32_t ulCurrent;\r
+uint32_t ulCurrent;\r
 \r
        ATOMIC_ENTER_CRITICAL();\r
-\r
-       ulCurrent = *pAddend;\r
-\r
-       *pAddend -= 1;\r
-\r
+       {\r
+               ulCurrent = *pulAddend;\r
+               *pulAddend -= 1;\r
+       }\r
        ATOMIC_EXIT_CRITICAL();\r
 \r
        return ulCurrent;\r
@@ -304,108 +305,103 @@ static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pAdde
  *\r
  * @brief Performs an atomic OR operation on the specified values.\r
  *\r
- * @param [in, out] pDestination  Pointer to memory location from where value is\r
- *                                                             to be loaded and written back to.\r
- * @param [in] ulValue                 Value to be ORed with *pDestination.\r
+ * @param [in, out] pulDestination  Pointer to memory location from where value is\r
+ *                                to be loaded and written back to.\r
+ * @param [in] ulValue            Value to be ORed with *pulDestination.\r
  *\r
- * @return The original value of *pDestination.\r
+ * @return The original value of *pulDestination.\r
  */\r
-static portFORCE_INLINE uint32_t Atomic_OR_u32(\r
-               uint32_t volatile * pDestination,\r
-               uint32_t ulValue )\r
+static portFORCE_INLINE uint32_t Atomic_OR_u32( uint32_t volatile * pulDestination,\r
+                                                                                               uint32_t ulValue )\r
 {\r
-       uint32_t ulCurrent;\r
+uint32_t ulCurrent;\r
 \r
        ATOMIC_ENTER_CRITICAL();\r
-\r
-       ulCurrent = *pDestination;\r
-\r
-       *pDestination |= ulValue;\r
-\r
+       {\r
+               ulCurrent = *pulDestination;\r
+               *pulDestination |= ulValue;\r
+       }\r
        ATOMIC_EXIT_CRITICAL();\r
 \r
        return ulCurrent;\r
 }\r
+/*-----------------------------------------------------------*/\r
 \r
 /**\r
  * Atomic AND\r
  *\r
  * @brief Performs an atomic AND operation on the specified values.\r
  *\r
- * @param [in, out] pDestination  Pointer to memory location from where value is\r
- *                                                             to be loaded and written back to.\r
- * @param [in] ulValue                 Value to be ANDed with *pDestination.\r
+ * @param [in, out] pulDestination  Pointer to memory location from where value is\r
+ *                                to be loaded and written back to.\r
+ * @param [in] ulValue            Value to be ANDed with *pulDestination.\r
  *\r
- * @return The original value of *pDestination.\r
+ * @return The original value of *pulDestination.\r
  */\r
-static portFORCE_INLINE uint32_t Atomic_AND_u32(\r
-               uint32_t volatile * pDestination,\r
-               uint32_t ulValue )\r
+static portFORCE_INLINE uint32_t Atomic_AND_u32( uint32_t volatile * pulDestination,\r
+                                                                                                uint32_t ulValue )\r
 {\r
-       uint32_t ulCurrent;\r
+uint32_t ulCurrent;\r
 \r
        ATOMIC_ENTER_CRITICAL();\r
-\r
-       ulCurrent = *pDestination;\r
-\r
-       *pDestination &= ulValue;\r
-\r
+       {\r
+               ulCurrent = *pulDestination;\r
+               *pulDestination &= ulValue;\r
+       }\r
        ATOMIC_EXIT_CRITICAL();\r
 \r
        return ulCurrent;\r
 }\r
+/*-----------------------------------------------------------*/\r
 \r
 /**\r
  * Atomic NAND\r
  *\r
  * @brief Performs an atomic NAND operation on the specified values.\r
  *\r
- * @param [in, out] pDestination  Pointer to memory location from where value is\r
- *                                                             to be loaded and written back to.\r
- * @param [in] ulValue                 Value to be NANDed with *pDestination.\r
+ * @param [in, out] pulDestination  Pointer to memory location from where value is\r
+ *                                to be loaded and written back to.\r
+ * @param [in] ulValue            Value to be NANDed with *pulDestination.\r
  *\r
- * @return The original value of *pDestination.\r
+ * @return The original value of *pulDestination.\r
  */\r
-static portFORCE_INLINE uint32_t Atomic_NAND_u32(\r
-               uint32_t volatile * pDestination,\r
-               uint32_t ulValue )\r
+static portFORCE_INLINE uint32_t Atomic_NAND_u32( uint32_t volatile * pulDestination,\r
+                                                                                                 uint32_t ulValue )\r
 {\r
-       uint32_t ulCurrent;\r
+uint32_t ulCurrent;\r
 \r
        ATOMIC_ENTER_CRITICAL();\r
-\r
-       ulCurrent = *pDestination;\r
-\r
-       *pDestination = ~(ulCurrent & ulValue);\r
-\r
+       {\r
+               ulCurrent = *pulDestination;\r
+               *pulDestination = ~( ulCurrent & ulValue );\r
+       }\r
        ATOMIC_EXIT_CRITICAL();\r
 \r
        return ulCurrent;\r
 }\r
+/*-----------------------------------------------------------*/\r
 \r
 /**\r
  * Atomic XOR\r
  *\r
  * @brief Performs an atomic XOR operation on the specified values.\r
  *\r
- * @param [in, out] pDestination  Pointer to memory location from where value is\r
- *                                                             to be loaded and written back to.\r
- * @param [in] ulValue                 Value to be XORed with *pDestination.\r
+ * @param [in, out] pulDestination  Pointer to memory location from where value is\r
+ *                                to be loaded and written back to.\r
+ * @param [in] ulValue            Value to be XORed with *pulDestination.\r
  *\r
- * @return The original value of *pDestination.\r
+ * @return The original value of *pulDestination.\r
  */\r
-static portFORCE_INLINE uint32_t Atomic_XOR_u32(\r
-               uint32_t volatile * pDestination,\r
-               uint32_t ulValue )\r
+static portFORCE_INLINE uint32_t Atomic_XOR_u32( uint32_t volatile * pulDestination,\r
+                                                                                                uint32_t ulValue )\r
 {\r
-       uint32_t ulCurrent;\r
+uint32_t ulCurrent;\r
 \r
        ATOMIC_ENTER_CRITICAL();\r
-\r
-       ulCurrent = *pDestination;\r
-\r
-       *pDestination ^= ulValue;\r
-\r
+       {\r
+               ulCurrent = *pulDestination;\r
+               *pulDestination ^= ulValue;\r
+       }\r
        ATOMIC_EXIT_CRITICAL();\r
 \r
        return ulCurrent;\r
index d6157c4d74965c14031951a90d570ea07e88b0d6..fc1236e4678119bd436acb989136568911fa74e8 100644 (file)
@@ -172,7 +172,7 @@ handle_asynchronous:
                        li t4, -1\r
                        lw t2, 0(t1)                            /* Load the low word of ullNextTime into t2. */\r
                        lw t3, 4(t1)                            /* Load the high word of ullNextTime into t3. */\r
-                       sw t4, 0(t0)                            /* Low word no smaller than old value to start with - will be overwritten below. */\r
+                       sw t4, 0(t0)                            /* Low word no smaller than old value. */\r
                        sw t3, 4(t0)                            /* Store high word of ullNextTime into compare register.  No smaller than new value. */\r
                        sw t2, 0(t0)                            /* Store low word of ullNextTime into compare register. */\r
                        lw t0, uxTimerIncrementsForOneTick      /* Load the value of ullTimerIncrementForOneTick into t0 (could this be optimized by storing in an array next to pullNextTime?). */\r
@@ -402,7 +402,7 @@ xPortStartFirstTask:
 pxPortInitialiseStack:\r
 \r
        csrr t0, mstatus                                        /* Obtain current mstatus value. */\r
-       addi t1, x0, 0x188                                      /* Generate the value 0x1888, which are the MIE, MPIE and privilege bits to set in mstatus. */\r
+       addi t1, x0, 0x188                                      /* Generate the value 0x1880, which are the MPIE and MPP bits to set in mstatus. */\r
        slli t1, t1, 4\r
        or t0, t0, t1                                           /* Set MPIE and MPP bits in mstatus value. */\r
 \r
index 6f79672aa0ea3f295c09c2fb4c812401ad7b399a..8e185d6f68e13c30254dac7be85e8118b18c4151 100644 (file)
@@ -65,6 +65,13 @@ typedef portBASE_TYPE BaseType_t;
 typedef portUBASE_TYPE UBaseType_t;\r
 typedef portUBASE_TYPE TickType_t;\r
 \r
+/* Legacy type definitions. */\r
+#define portCHAR               char\r
+#define portFLOAT              float\r
+#define portDOUBLE             double\r
+#define portLONG               long\r
+#define portSHORT              short\r
+\r
 /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do\r
 not need to be guarded with a critical section. */\r
 #define portTICK_TYPE_IS_ATOMIC 1\r
index 8c59aef2ff29f9d46d7960dedf5f8937479f9ba0..dd32a8e50ef5b072d4742cb0dc302b3b975ca273 100644 (file)
@@ -152,6 +152,12 @@ extern void xPortStartFirstTask( void );
                stack that was being used by main() prior to the scheduler being\r
                started. */\r
                configASSERT( ( xISRStackTop & portBYTE_ALIGNMENT_MASK ) == 0 );\r
+\r
+               #ifdef configISR_STACK_SIZE_WORDS\r
+               {\r
+                       memset( ( void * ) xISRStack, portISR_STACK_FILL_BYTE, sizeof( xISRStack ) );\r
+               }\r
+               #endif   /* configISR_STACK_SIZE_WORDS */\r
        }\r
        #endif /* configASSERT_DEFINED */\r
 \r
index 84cf6c950d4f02364152fa9e78f8cd3b99c33c8e..c4082c7b3c49e6f07d8c47d5c5a576b9538602b0 100644 (file)
@@ -180,7 +180,7 @@ handle_asynchronous:
                        li t4, -1\r
                        lw t2, 0(t1)                            /* Load the low word of ullNextTime into t2. */\r
                        lw t3, 4(t1)                            /* Load the high word of ullNextTime into t3. */\r
-                       sw t4, 0(t0)                            /* Low word no smaller than old value. */\r
+                       sw t4, 0(t0)                            /* Low word no smaller than old value to start with - will be overwritten below. */\r
                        sw t3, 4(t0)                            /* Store high word of ullNextTime into compare register.  No smaller than new value. */\r
                        sw t2, 0(t0)                            /* Store low word of ullNextTime into compare register. */\r
                        lw t0, uxTimerIncrementsForOneTick      /* Load the value of ullTimerIncrementForOneTick into t0 (could this be optimized by storing in an array next to pullNextTime?). */\r
@@ -304,6 +304,7 @@ xPortStartFirstTask:
        portasmRESTORE_ADDITIONAL_REGISTERS     /* Defined in freertos_risc_v_chip_specific_extensions.h to restore any registers unique to the RISC-V implementation. */\r
 \r
        load_x  t0, 29 * portWORD_SIZE( sp )    /* mstatus */\r
+       addi t0, t0, 0x08                                               /* Set MIE bit so the first task starts with interrupts enabled - required as returns with ret not eret. */\r
        csrrw  x0, CSR_MSTATUS, t0                                      /* Interrupts enabled from here! */\r
 \r
        load_x  x5, 2 * portWORD_SIZE( sp )             /* t0 */\r
index c2a15ddbfb90afe4fff2a7f13e1bff232de44090..4fbaeb5fb04ce0d036a863948d6b8a86c298d1de 100644 (file)
@@ -67,6 +67,13 @@ typedef portBASE_TYPE BaseType_t;
 typedef portUBASE_TYPE UBaseType_t;\r
 typedef portUBASE_TYPE TickType_t;\r
 \r
+/* Legacy type definitions. */\r
+#define portCHAR               char\r
+#define portFLOAT              float\r
+#define portDOUBLE             double\r
+#define portLONG               long\r
+#define portSHORT              short\r
+\r
 /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do\r
 not need to be guarded with a critical section. */\r
 #define portTICK_TYPE_IS_ATOMIC 1\r
index dfff3ec5efdb4b4da95bafb0a1df480873cdbfd7..c5b2256817f68571d2911f504f5bbd61a66877dd 100644 (file)
@@ -300,7 +300,10 @@ typedef struct tskTaskControlBlock                         /* The old naming convention is used to pr
                responsible for resulting newlib operation.  User must be familiar with\r
                newlib and must provide system-wide implementations of the necessary\r
                stubs. Be warned that (at the time of writing) the current newlib design\r
-               implements a system-wide malloc() that must be provided with locks. */\r
+               implements a system-wide malloc() that must be provided with locks.\r
+\r
+               See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html\r
+               for additional information. */\r
                struct  _reent xNewLib_reent;\r
        #endif\r
 \r
@@ -993,7 +996,9 @@ UBaseType_t x;
 \r
        #if ( configUSE_NEWLIB_REENTRANT == 1 )\r
        {\r
-               /* Initialise this task's Newlib reent structure. */\r
+               /* Initialise this task's Newlib reent structure.\r
+               See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html\r
+               for additional information. */\r
                _REENT_INIT_PTR( ( &( pxNewTCB->xNewLib_reent ) ) );\r
        }\r
        #endif\r
@@ -1218,12 +1223,12 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
                        else\r
                        {\r
                                --uxCurrentNumberOfTasks;\r
+                               traceTASK_DELETE( pxTCB );\r
                                prvDeleteTCB( pxTCB );\r
 \r
                                /* Reset the next expected unblock time in case it referred to\r
                                the task that has just been deleted. */\r
                                prvResetNextTaskUnblockTime();\r
-                               traceTASK_DELETE( pxTCB );\r
                        }\r
                }\r
                taskEXIT_CRITICAL();\r
@@ -2044,7 +2049,9 @@ BaseType_t xReturn;
                #if ( configUSE_NEWLIB_REENTRANT == 1 )\r
                {\r
                        /* Switch Newlib's _impure_ptr variable to point to the _reent\r
-                       structure specific to the task that will run first. */\r
+                       structure specific to the task that will run first.\r
+                       See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html\r
+                       for additional information. */\r
                        _impure_ptr = &( pxCurrentTCB->xNewLib_reent );\r
                }\r
                #endif /* configUSE_NEWLIB_REENTRANT */\r
@@ -2846,6 +2853,19 @@ BaseType_t xSwitchRequired = pdFALSE;
                        }\r
                }\r
                #endif /* configUSE_TICK_HOOK */\r
+\r
+               #if ( configUSE_PREEMPTION == 1 )\r
+               {\r
+                       if( xYieldPending != pdFALSE )\r
+                       {\r
+                               xSwitchRequired = pdTRUE;\r
+                       }\r
+                       else\r
+                       {\r
+                               mtCOVERAGE_TEST_MARKER();\r
+                       }\r
+               }\r
+               #endif /* configUSE_PREEMPTION */\r
        }\r
        else\r
        {\r
@@ -2860,19 +2880,6 @@ BaseType_t xSwitchRequired = pdFALSE;
                #endif\r
        }\r
 \r
-       #if ( configUSE_PREEMPTION == 1 )\r
-       {\r
-               if( xYieldPending != pdFALSE )\r
-               {\r
-                       xSwitchRequired = pdTRUE;\r
-               }\r
-               else\r
-               {\r
-                       mtCOVERAGE_TEST_MARKER();\r
-               }\r
-       }\r
-       #endif /* configUSE_PREEMPTION */\r
-\r
        return xSwitchRequired;\r
 }\r
 /*-----------------------------------------------------------*/\r
@@ -3052,7 +3059,9 @@ void vTaskSwitchContext( void )
                #if ( configUSE_NEWLIB_REENTRANT == 1 )\r
                {\r
                        /* Switch Newlib's _impure_ptr variable to point to the _reent\r
-                       structure specific to this task. */\r
+                       structure specific to this task.\r
+                       See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html\r
+                       for additional information. */\r
                        _impure_ptr = &( pxCurrentTCB->xNewLib_reent );\r
                }\r
                #endif /* configUSE_NEWLIB_REENTRANT */\r
@@ -3874,7 +3883,9 @@ static void prvCheckTasksWaitingTermination( void )
                portCLEAN_UP_TCB( pxTCB );\r
 \r
                /* Free up the memory allocated by the scheduler for the task.  It is up\r
-               to the task to free any memory allocated at the application level. */\r
+               to the task to free any memory allocated at the application level.\r
+               See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html\r
+               for additional information. */\r
                #if ( configUSE_NEWLIB_REENTRANT == 1 )\r
                {\r
                        _reclaim_reent( &( pxTCB->xNewLib_reent ) );\r