]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c
Add "is inside interrupt" function to MPU ports.
[freertos] / FreeRTOS / Source / portable / GCC / ARM_CM33_NTZ / non_secure / portasm.c
index b6f1bbcef95a21a9c508bc764e7121ddb5d1e7a0..dc5179fb3502a7eb7eef59a003668aa79f09ae60 100644 (file)
@@ -171,24 +171,29 @@ void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-uint32_t ulSetInterruptMaskFromISR( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */\r
+uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */\r
 {\r
        __asm volatile\r
        (\r
-       "       mrs r0, PRIMASK                                                                 \n"\r
-       "       cpsid i                                                                                 \n"\r
-       "       bx lr                                                                                   \n"\r
-       ::: "memory"\r
+       "       mrs r0, basepri                                                                 \n" /* r0 = basepri. Return original basepri value. */\r
+       "       mov r1, %0                                                                              \n" /* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */\r
+       "       msr basepri, r1                                                                 \n" /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */\r
+       "       dsb                                                                                             \n"\r
+       "       isb                                                                                             \n"\r
+       "       bx lr                                                                                   \n" /* Return. */\r
+       :: "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory"\r
        );\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-void vClearInterruptMaskFromISR( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */\r
+void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */\r
 {\r
        __asm volatile\r
        (\r
-       "       msr PRIMASK, r0                                                                 \n"\r
-       "       bx lr                                                                                   \n"\r
+       "       msr basepri, r0                                                                 \n" /* basepri = ulMask. */\r
+       "       dsb                                                                                             \n"\r
+       "       isb                                                                                             \n"\r
+       "       bx lr                                                                                   \n" /* Return. */\r
        ::: "memory"\r
        );\r
 }\r
@@ -221,9 +226,13 @@ void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
        "       ldr r1, [r2]                                                                    \n" /* Read pxCurrentTCB. */\r
        "       str r0, [r1]                                                                    \n" /* Save the new top of stack in TCB. */\r
        "                                                                                                       \n"\r
-       "       cpsid i                                                                                 \n"\r
+       "       mov r0, %0                                                                              \n" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */\r
+       "       msr basepri, r0                                                                 \n" /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */\r
+       "       dsb                                                                                             \n"\r
+       "       isb                                                                                             \n"\r
        "       bl vTaskSwitchContext                                                   \n"\r
-       "       cpsie i                                                                                 \n"\r
+       "       mov r0, #0                                                                              \n" /* r0 = 0. */\r
+       "       msr basepri, r0                                                                 \n" /* Enable interrupts. */\r
        "                                                                                                       \n"\r
        "       ldr r2, pxCurrentTCBConst                                               \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */\r
        "       ldr r1, [r2]                                                                    \n" /* Read pxCurrentTCB. */\r
@@ -284,6 +293,7 @@ void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
        "xRNRConst: .word 0xe000ed98                                            \n"\r
        "xRBARConst: .word 0xe000ed9c                                           \n"\r
        #endif /* configENABLE_MPU */\r
+       :: "i"( configMAX_SYSCALL_INTERRUPT_PRIORITY )\r
        );\r
 }\r
 /*-----------------------------------------------------------*/\r