]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/portable/MSVC-MingW/portmacro.h
Add extern 'C' to FreeRTOS.h.
[freertos] / FreeRTOS / Source / portable / MSVC-MingW / portmacro.h
index e6aa4606cf65d639a43fac8a65f8cd1f59912e9d..5535440dafc0a74585b4ae0f2dd7891e0f23b70d 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-    FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. \r
+    FreeRTOS V8.0.0:rc1 - Copyright (C) 2014 Real Time Engineers Ltd.\r
     All rights reserved\r
 \r
     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
 #define portDOUBLE             double\r
 #define portLONG               long\r
 #define portSHORT              short\r
-#define portSTACK_TYPE unsigned portLONG\r
-#define portBASE_TYPE  portLONG\r
+#define portSTACK_TYPE uint32_t\r
+#define portBASE_TYPE  long\r
+\r
+typedef portSTACK_TYPE StackType_t;\r
+typedef long BaseType_t;\r
+typedef unsigned long UBaseType_t;\r
+\r
 \r
 #if( configUSE_16_BIT_TICKS == 1 )\r
-    typedef unsigned portSHORT portTickType;\r
-    #define portMAX_DELAY ( portTickType ) 0xffff\r
+    typedef uint16_t TickType_t;\r
+    #define portMAX_DELAY ( TickType_t ) 0xffff\r
 #else\r
-    typedef unsigned portLONG portTickType;\r
-    #define portMAX_DELAY ( portTickType ) 0xffffffff\r
+    typedef uint32_t TickType_t;\r
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL\r
 #endif\r
 \r
 /* Hardware specifics. */\r
 #define portSTACK_GROWTH                       ( -1 )\r
-#define portTICK_RATE_MS                       ( ( portTickType ) 1000 / configTICK_RATE_HZ )  \r
+#define portTICK_PERIOD_MS                     ( ( TickType_t ) 1000 / configTICK_RATE_HZ )\r
 #define portBYTE_ALIGNMENT                     4\r
 \r
 #define portYIELD()                                    vPortGenerateSimulatedInterrupt( portINTERRUPT_YIELD )\r
 \r
+void vPortCloseRunningThread( void *pvTaskToDelete, volatile BaseType_t *pxPendYield );\r
 void vPortDeleteThread( void *pvThreadToDelete );\r
 #define portCLEAN_UP_TCB( pxTCB )      vPortDeleteThread( pxTCB )\r
-#define portDISABLE_INTERRUPTS()\r
-#define portENABLE_INTERRUPTS()\r
+#define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxPendYield ) vPortCloseRunningThread( ( pvTaskToDelete ), ( pxPendYield ) )\r
+#define portDISABLE_INTERRUPTS() vPortEnterCritical()\r
+#define portENABLE_INTERRUPTS() vPortExitCritical()\r
 \r
 /* Critical section handling. */\r
 void vPortEnterCritical( void );\r
@@ -107,28 +114,37 @@ void vPortExitCritical( void );
 #define portENTER_CRITICAL()           vPortEnterCritical()\r
 #define portEXIT_CRITICAL()                    vPortExitCritical()\r
 \r
-#ifndef __GNUC__\r
-       #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1\r
+#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1\r
 \r
        /* Check the configuration. */\r
        #if( configMAX_PRIORITIES > 32 )\r
                #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.\r
        #endif\r
 \r
-               /* Store/clear the ready priorities in a bit map. */\r
-               #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )\r
-               #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )\r
+       /* Store/clear the ready priorities in a bit map. */\r
+       #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )\r
+       #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )\r
 \r
 \r
-               /*-----------------------------------------------------------*/\r
+       /*-----------------------------------------------------------*/\r
 \r
+       #ifdef __GNUC__\r
+               #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities )      \\r
+                       __asm volatile( "mov %0, %%eax                                                                  \n\t" \\r
+                                                       "bsr %%eax, %%eax                                                               \n\t" \\r
+                                                       "mov %%eax, %1                                                                  \n\t" \\r
+                                                       :"=r"(uxTopPriority) : "r"(uxReadyPriorities) : "eax" )\r
+       #else\r
                /* BitScanReverse returns the bit position of the most significant '1'\r
                in the word. */\r
-               #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) _BitScanReverse( ( DWORD * ) &( uxTopPriority ), ( uxReadyPriorities ) )\r
+               #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) _BitScanReverse( ( DWORD * ) &( uxTopPriority ), ( uxReadyPriorities ) )           \r
+       #endif /* __GNUC__ */\r
 \r
-       #endif /* taskRECORD_READY_PRIORITY */\r
-#endif /* __GNUC__ */\r
+#endif /* taskRECORD_READY_PRIORITY */\r
 \r
+#ifndef __GNUC__\r
+       __pragma( warning( disable:4211 ) ) /* Nonstandard extension used, as extern is only nonstandard to MSVC. */\r
+#endif\r
 \r
 \r
 /* Task function macros as described on the FreeRTOS.org WEB site. */\r
@@ -139,22 +155,22 @@ void vPortExitCritical( void );
 #define portINTERRUPT_YIELD                            ( 0UL )\r
 #define portINTERRUPT_TICK                             ( 1UL )\r
 \r
-/* \r
+/*\r
  * Raise a simulated interrupt represented by the bit mask in ulInterruptMask.\r
  * Each bit can be used to represent an individual interrupt - with the first\r
  * two bits being used for the Yield and Tick interrupts respectively.\r
 */\r
-void vPortGenerateSimulatedInterrupt( unsigned long ulInterruptNumber );\r
+void vPortGenerateSimulatedInterrupt( uint32_t ulInterruptNumber );\r
 \r
 /*\r
- * Install an interrupt handler to be called by the simulated interrupt handler \r
+ * Install an interrupt handler to be called by the simulated interrupt handler\r
  * thread.  The interrupt number must be above any used by the kernel itself\r
  * (at the time of writing the kernel was using interrupt numbers 0, 1, and 2\r
- * as defined above).  The number must also be lower than 32. \r
+ * as defined above).  The number must also be lower than 32.\r
  *\r
  * Interrupt handler functions must return a non-zero value if executing the\r
- * handler resulted in a task switch being required. \r
+ * handler resulted in a task switch being required.\r
  */\r
-void vPortSetInterruptHandler( unsigned long ulInterruptNumber, unsigned long (*pvHandler)( void ) );\r
+void vPortSetInterruptHandler( uint32_t ulInterruptNumber, uint32_t (*pvHandler)( void ) );\r
 \r
 #endif\r