@@ -124,7 +124,6 @@ void vPortExitCritical( void );
124124#endif 
125125
126126/*-----------------------------------------------------------*/ 
127- 
128127#if  configUSE_PORT_OPTIMISED_TASK_SELECTION  ==  1 
129128
130129    /* Check the configuration. */ 
@@ -135,36 +134,14 @@ void vPortExitCritical( void );
135134    /* Store/clear the ready priorities in a bit map. */ 
136135    #define  portRECORD_READY_PRIORITY ( uxPriority , uxReadyPriorities  )    ( uxReadyPriorities ) |= ( ( ( UBaseType_t ) 1 ) << ( uxPriority ) )
137136    #define  portRESET_READY_PRIORITY ( uxPriority , uxReadyPriorities  )     ( uxReadyPriorities ) &= ~( ( ( UBaseType_t ) 1 ) << ( uxPriority ) )
138- 
139-     #ifdef  __GNUC__ 
140- 
141-         #define  portGET_HIGHEST_PRIORITY ( uxTopPriority , uxReadyPriorities  )    \
142-         __asm volatile ( "bsr %1, %0\n\t"                                       \
143-                          : "=r" ( uxTopPriority )                               \
144-                          : "rm" ( uxReadyPriorities )                           \
145-                          : "cc" )
146- 
147-     #else  /* __GNUC__ */ 
148- 
149-         /* BitScanReverse returns the bit position of the most significant '1' 
150-          * in the word. */ 
151-         #if  defined( __x86_64__  ) ||  defined( _M_X64  )
152- 
153-             #define  portGET_HIGHEST_PRIORITY ( uxTopPriority , uxReadyPriorities  )    \
154-             do                                                                      \
155-             {                                                                       \
156-                 DWORD ulTopPriority;                                                \
157-                 _BitScanReverse64( &ulTopPriority, ( uxReadyPriorities ) );         \
158-                 uxTopPriority = ulTopPriority;                                      \
159-             } while( 0 )
160- 
161-         #else  /* #if defined( __x86_64__ ) || defined( _M_X64 ) */ 
162- 
163-             #define  portGET_HIGHEST_PRIORITY ( uxTopPriority , uxReadyPriorities  )    _BitScanReverse( ( DWORD * ) &( uxTopPriority ), ( uxReadyPriorities ) )
164- 
165-         #endif  /* #if defined( __x86_64__ ) || defined( _M_X64 ) */ 
166- 
167-     #endif  /* __GNUC__ */ 
137+     #define  portGET_HIGHEST_PRIORITY ( uxTopPriority , uxReadyPriorities  ) \
138+     do {                                                                 \
139+         unsigned i = sizeof(UBaseType_t) * 8 - 1;                        \
140+         while ((uxReadyPriorities & ((UBaseType_t)1 << i)) == 0) {       \
141+             i--;                                                         \
142+         }                                                                \
143+         uxTopPriority = i;                                               \
144+     } while( 0 )
168145
169146#endif  /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ 
170147
0 commit comments