]> git.sur5r.net Git - freertos/commitdiff
Complete additions of portASSERT_IF_INTERRUPT_PRIORITY_INVALID() for all RX compiler...
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Thu, 11 Jul 2013 10:05:06 +0000 (10:05 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Thu, 11 Jul 2013 10:05:06 +0000 (10:05 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1970 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS/Source/portable/GCC/RX100/portmacro.h
FreeRTOS/Source/portable/GCC/RX600/portmacro.h
FreeRTOS/Source/portable/IAR/RX100/portmacro.h
FreeRTOS/Source/portable/IAR/RX600/portmacro.h
FreeRTOS/Source/portable/Renesas/RX100/portmacro.h
FreeRTOS/Source/portable/Renesas/RX200/portmacro.h
FreeRTOS/Source/portable/Renesas/RX600/portmacro.h

index f5317c07b4db5562fb393a1dbc10115a8f6abaf2..b3cff6084f015b7515fa4b3a9e3d34e1e763a750 100644 (file)
@@ -115,6 +115,10 @@ portSTACK_TYPE and portBASE_TYPE. */
 #define portTICK_RATE_MS                       ( ( portTickType ) 1000 / configTICK_RATE_HZ )\r
 #define portNOP()                                      __asm volatile( "NOP" )\r
 \r
+#ifdef configASSERT\r
+       #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( ulPortGetIPL() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) )\r
+#endif\r
+\r
 /* Save clobbered register, set ITU SWINR (at address 0x872E0), read the value\r
 back to ensure it is set before continuing, then restore the clobbered\r
 register. */\r
@@ -131,10 +135,15 @@ register. */
 \r
 /*\r
  * These macros should be called directly, but through the taskENTER_CRITICAL()\r
- * and taskEXIT_CRITICAL() macros.\r
+ * and taskEXIT_CRITICAL() macros.  If the RTOS is being used correctly then\r
+ * the check to ensure the IPL is not being lowered will not be needed.  It is\r
+ * included to ensure assert()s triggered by using an incorrect interrupt\r
+ * priority do not result in the assert() handler inadvertently lowering the\r
+ * priority mask, and in so doing allowing the offending interrupt to continue\r
+ * triggering until stack space is exhausted.\r
  */\r
 #define portENABLE_INTERRUPTS()        __asm volatile ( "MVTIPL        #0" );\r
-#define portDISABLE_INTERRUPTS()       __asm volatile ( "MVTIPL        %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) )\r
+#define portDISABLE_INTERRUPTS()       if( ulPortGetIPL() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __asm volatile ( "MVTIPL    %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) )\r
 \r
 /* Critical nesting counts are stored in the TCB. */\r
 #define portCRITICAL_NESTING_IN_TCB ( 1 )\r
index f92bf459a6874a68d87d6d4b03a51f252ff554c9..0e6c6d3e3c2a3fc704456adf7015885da0029a49 100644 (file)
@@ -115,6 +115,11 @@ portSTACK_TYPE and portBASE_TYPE. */
 #define portTICK_RATE_MS                       ( ( portTickType ) 1000 / configTICK_RATE_HZ )          \r
 #define portNOP()                                      __asm volatile( "NOP" )\r
 \r
+#ifdef configASSERT\r
+       #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( ulPortGetIPL() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) )\r
+#endif\r
+\r
+\r
 /* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;"\r
 where portITU_SWINTR is the location of the software interrupt register\r
 (0x000872E0).  Don't rely on the assembler to select a register, so instead \r
@@ -133,10 +138,15 @@ save and restore clobbered registers manually. */
 \r
 /*\r
  * These macros should be called directly, but through the taskENTER_CRITICAL()\r
- * and taskEXIT_CRITICAL() macros.\r
+ * and taskEXIT_CRITICAL() macros.  If the RTOS is being used correctly then\r
+ * the check to ensure the IPL is not being lowered will not be needed.  It is\r
+ * included to ensure assert()s triggered by using an incorrect interrupt\r
+ * priority do not result in the assert() handler inadvertently lowering the\r
+ * priority mask, and in so doing allowing the offending interrupt to continue\r
+ * triggering until stack space is exhausted.\r
  */\r
 #define portENABLE_INTERRUPTS()        __asm volatile ( "MVTIPL        #0" );\r
-#define portDISABLE_INTERRUPTS()       __asm volatile ( "MVTIPL        %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) )\r
+#define portDISABLE_INTERRUPTS()       if( ulPortGetIPL() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __asm volatile ( "MVTIPL    %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) )\r
 \r
 /* Critical nesting counts are stored in the TCB. */\r
 #define portCRITICAL_NESTING_IN_TCB ( 1 )\r
index d8c421fb9c9fbfef3336f0e7d20962b2bee82b64..0c50981af8a32e4292e6dd649689cd129a6489bf 100644 (file)
@@ -120,6 +120,10 @@ portSTACK_TYPE and portBASE_TYPE. */
 #define portTICK_RATE_MS                       ( ( portTickType ) 1000 / configTICK_RATE_HZ )\r
 #define portNOP()                                      __no_operation()\r
 \r
+#ifdef configASSERT\r
+       #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) )\r
+#endif\r
+\r
 #define portYIELD()                                                    \\r
        __asm volatile                                                  \\r
        (                                                                               \\r
@@ -133,10 +137,15 @@ portSTACK_TYPE and portBASE_TYPE. */
 \r
 /*\r
  * These macros should be called directly, but through the taskENTER_CRITICAL()\r
- * and taskEXIT_CRITICAL() macros.\r
+ * and taskEXIT_CRITICAL() macros.  If the RTOS is being used correctly then\r
+ * the check to ensure the IPL is not being lowered will not be needed.  It is\r
+ * included to ensure assert()s triggered by using an incorrect interrupt\r
+ * priority do not result in the assert() handler inadvertently lowering the\r
+ * priority mask, and in so doing allowing the offending interrupt to continue\r
+ * triggering until stack space is exhausted.\r
  */\r
 #define portENABLE_INTERRUPTS()        __set_interrupt_level( ( unsigned char ) 0 )\r
-#define portDISABLE_INTERRUPTS()       __set_interrupt_level( ( unsigned char ) configMAX_SYSCALL_INTERRUPT_PRIORITY )\r
+#define portDISABLE_INTERRUPTS()       if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( unsigned char ) configMAX_SYSCALL_INTERRUPT_PRIORITY )\r
 \r
 /* Critical nesting counts are stored in the TCB. */\r
 #define portCRITICAL_NESTING_IN_TCB ( 1 )\r
index 3f409cf6e07ef72d9e46724c5d1334c088a043fb..45b373af50b57d84c88f06263e446e4cabd9af61 100644 (file)
@@ -117,6 +117,10 @@ portSTACK_TYPE and portBASE_TYPE. */
 #define portTICK_RATE_MS                       ( ( portTickType ) 1000 / configTICK_RATE_HZ )\r
 #define portNOP()                                      __no_operation()\r
 \r
+#ifdef configASSERT\r
+       #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) )\r
+#endif\r
+\r
 /* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;"\r
 where portITU_SWINTR is the location of the software interrupt register\r
 (0x000872E0).  Don't rely on the assembler to select a register, so instead\r
@@ -135,10 +139,15 @@ save and restore clobbered registers manually. */
 \r
 /*\r
  * These macros should be called directly, but through the taskENTER_CRITICAL()\r
- * and taskEXIT_CRITICAL() macros.\r
+ * and taskEXIT_CRITICAL() macros.  If the RTOS is being used correctly then\r
+ * the check to ensure the IPL is not being lowered will not be needed.  It is\r
+ * included to ensure assert()s triggered by using an incorrect interrupt\r
+ * priority do not result in the assert() handler inadvertently lowering the\r
+ * priority mask, and in so doing allowing the offending interrupt to continue\r
+ * triggering until stack space is exhausted.\r
  */\r
 #define portENABLE_INTERRUPTS()        __set_interrupt_level( ( unsigned char ) 0 )\r
-#define portDISABLE_INTERRUPTS()       __set_interrupt_level( ( unsigned char ) configMAX_SYSCALL_INTERRUPT_PRIORITY )\r
+#define portDISABLE_INTERRUPTS()       if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( unsigned char ) configMAX_SYSCALL_INTERRUPT_PRIORITY )\r
 \r
 /* Critical nesting counts are stored in the TCB. */\r
 #define portCRITICAL_NESTING_IN_TCB ( 1 )\r
index 66a59be34c200090c9f8bb9f611c73b0411713a2..736375eb1b451467f4ddb24c3c878259bb723024 100644 (file)
@@ -142,10 +142,15 @@ static void vPortYield( void )
 \r
 /*\r
  * These macros should be called directly, but through the taskENTER_CRITICAL()\r
- * and taskEXIT_CRITICAL() macros.\r
+ * and taskEXIT_CRITICAL() macros.  If the RTOS is being used correctly then\r
+ * the check to ensure the IPL is not being lowered will not be needed.  It is\r
+ * included to ensure assert()s triggered by using an incorrect interrupt\r
+ * priority do not result in the assert() handler inadvertently lowering the\r
+ * priority mask, and in so doing allowing the offending interrupt to continue\r
+ * triggering until stack space is exhausted.\r
  */\r
 #define portENABLE_INTERRUPTS()        set_ipl( 0 )\r
-#define portDISABLE_INTERRUPTS()       set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY )\r
+#define portDISABLE_INTERRUPTS()       if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( unsigned char ) configMAX_SYSCALL_INTERRUPT_PRIORITY )\r
 \r
 /* Critical nesting counts are stored in the TCB. */\r
 #define portCRITICAL_NESTING_IN_TCB ( 1 )\r
index 4c9c88e588abceccf10a67b5dab6a67594b9833b..721334a4866b3263d659f8da217e16f8c2699a89 100644 (file)
@@ -142,10 +142,15 @@ static void vPortYield( void )
 \r
 /*\r
  * These macros should be called directly, but through the taskENTER_CRITICAL()\r
- * and taskEXIT_CRITICAL() macros.\r
+ * and taskEXIT_CRITICAL() macros.  If the RTOS is being used correctly then\r
+ * the check to ensure the IPL is not being lowered will not be needed.  It is\r
+ * included to ensure assert()s triggered by using an incorrect interrupt\r
+ * priority do not result in the assert() handler inadvertently lowering the\r
+ * priority mask, and in so doing allowing the offending interrupt to continue\r
+ * triggering until stack space is exhausted.\r
  */\r
 #define portENABLE_INTERRUPTS()        set_ipl( 0 )\r
-#define portDISABLE_INTERRUPTS()       set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY )\r
+#define portDISABLE_INTERRUPTS()       if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( unsigned char ) configMAX_SYSCALL_INTERRUPT_PRIORITY )\r
 \r
 /* Critical nesting counts are stored in the TCB. */\r
 #define portCRITICAL_NESTING_IN_TCB ( 1 )\r
index 4c9c88e588abceccf10a67b5dab6a67594b9833b..5a249d371fc295a0bfc09b99b7b861ad42a4294e 100644 (file)
     ***************************************************************************\r
 \r
 \r
-    http://www.FreeRTOS.org - Documentation, books, training, latest versions, \r
+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,\r
     license and Real Time Engineers Ltd. contact details.\r
 \r
     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
     including FreeRTOS+Trace - an indispensable productivity tool, and our new\r
     fully thread aware and reentrant UDP/IP stack.\r
 \r
-    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High \r
-    Integrity Systems, who sell the code with commercial support, \r
+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High\r
+    Integrity Systems, who sell the code with commercial support,\r
     indemnification and middleware, under the OpenRTOS brand.\r
-    \r
-    http://www.SafeRTOS.com - High Integrity Systems also provide a safety \r
-    engineered and independently SIL3 certified version for use in safety and \r
+\r
+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
+    engineered and independently SIL3 certified version for use in safety and\r
     mission critical applications that require provable dependability.\r
 */\r
 \r
@@ -84,7 +84,7 @@ extern "C" {
 #include "machine.h"\r
 \r
 /*-----------------------------------------------------------\r
- * Port specific definitions.  \r
+ * Port specific definitions.\r
  *\r
  * The settings in this file configure FreeRTOS correctly for the\r
  * given hardware and compiler.\r
@@ -115,7 +115,7 @@ portSTACK_TYPE and portBASE_TYPE. */
 /* Hardware specifics. */\r
 #define portBYTE_ALIGNMENT                             8       /* Could make four, according to manual. */\r
 #define portSTACK_GROWTH                               -1\r
-#define portTICK_RATE_MS                               ( ( portTickType ) 1000 / configTICK_RATE_HZ )          \r
+#define portTICK_RATE_MS                               ( ( portTickType ) 1000 / configTICK_RATE_HZ )\r
 #define portNOP()                                              nop()\r
 \r
 #ifdef configASSERT\r
@@ -142,10 +142,15 @@ static void vPortYield( void )
 \r
 /*\r
  * These macros should be called directly, but through the taskENTER_CRITICAL()\r
- * and taskEXIT_CRITICAL() macros.\r
+ * and taskEXIT_CRITICAL() macros.  If the RTOS is being used correctly then\r
+ * the check to ensure the IPL is not being lowered will not be needed.  It is\r
+ * included to ensure assert()s triggered by using an incorrect interrupt\r
+ * priority do not result in the assert() handler inadvertently lowering the\r
+ * priority mask, and in so doing allowing the offending interrupt to continue\r
+ * triggering until stack space is exhausted.\r
  */\r
 #define portENABLE_INTERRUPTS()        set_ipl( 0 )\r
-#define portDISABLE_INTERRUPTS()       set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY )\r
+#define portDISABLE_INTERRUPTS()       if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( unsigned char ) configMAX_SYSCALL_INTERRUPT_PRIORITY )\r
 \r
 /* Critical nesting counts are stored in the TCB. */\r
 #define portCRITICAL_NESTING_IN_TCB ( 1 )\r