|
53 | 53 | #if ((__ARM_ARCH_7M__ == 1U) || \ |
54 | 54 | (__ARM_ARCH_7EM__ == 1U) || \ |
55 | 55 | (__ARM_ARCH_8M_MAIN__ == 1U)) |
56 | | -#define IS_IRQ_MASKED() ((KernelState == osKernelRunning) && ((__get_PRIMASK() != 0U) || (__get_BASEPRI() != 0U))) |
| 56 | +#define IS_IRQ_MASKED() ((__get_PRIMASK() != 0U) || (__get_BASEPRI() != 0U)) |
57 | 57 | #elif (__ARM_ARCH_6M__ == 1U) |
58 | | -#define IS_IRQ_MASKED() ((KernelState == osKernelRunning) && (__get_PRIMASK() != 0U)) |
| 58 | +#define IS_IRQ_MASKED() (__get_PRIMASK() != 0U) |
59 | 59 | #elif (__ARM_ARCH_7A__ == 1U) |
60 | 60 | /* CPSR mask bits */ |
61 | 61 | #define CPSR_MASKBIT_I 0x80U |
|
75 | 75 | #define IS_IRQ_MODE() (__get_IPSR() != 0U) |
76 | 76 | #endif |
77 | 77 |
|
78 | | -#define IS_IRQ() (IS_IRQ_MODE() || IS_IRQ_MASKED()) |
| 78 | +#define IS_IRQ() (IS_IRQ_MODE() || (IS_IRQ_MASKED() && (KernelState == osKernelRunning))) |
79 | 79 |
|
80 | 80 | /* Limits */ |
81 | 81 | #define MAX_BITS_TASK_NOTIFY 31U |
@@ -164,6 +164,18 @@ void SysTick_Handler (void) { |
164 | 164 | } |
165 | 165 | #endif /* SysTick */ |
166 | 166 |
|
| 167 | +/* |
| 168 | + Setup SVC to reset value. |
| 169 | +*/ |
| 170 | +__STATIC_INLINE void SVC_Setup (void) { |
| 171 | +#if (__ARM_ARCH_7A__ == 0U) |
| 172 | + /* Service Call interrupt might be configured before kernel start */ |
| 173 | + /* and when its priority is lower or equal to BASEPRI, svc intruction */ |
| 174 | + /* causes a Hard Fault. */ |
| 175 | + NVIC_SetPriority (SVCall_IRQn, 0U); |
| 176 | +#endif |
| 177 | +} |
| 178 | + |
167 | 179 | /*---------------------------------------------------------------------------*/ |
168 | 180 |
|
169 | 181 | osStatus_t osKernelInitialize (void) { |
@@ -242,7 +254,7 @@ osStatus_t osKernelStart (void) { |
242 | 254 | else { |
243 | 255 | if (KernelState == osKernelReady) { |
244 | 256 | /* Ensure SVC priority is at the reset value */ |
245 | | - NVIC_SetPriority (SVCall_IRQn, 0U); |
| 257 | + SVC_Setup(); |
246 | 258 | /* Change state to enable IRQ masking check */ |
247 | 259 | KernelState = osKernelRunning; |
248 | 260 | /* Start the kernel scheduler */ |
@@ -368,11 +380,11 @@ uint32_t osKernelGetTickFreq (void) { |
368 | 380 | } |
369 | 381 |
|
370 | 382 | uint32_t osKernelGetSysTimerCount (void) { |
371 | | - uint32_t irqmask; |
| 383 | + uint32_t irqmask = IS_IRQ_MASKED(); |
372 | 384 | TickType_t ticks; |
373 | 385 | uint32_t val; |
374 | 386 |
|
375 | | - irqmask = __disable_irq(); |
| 387 | + __disable_irq(); |
376 | 388 |
|
377 | 389 | ticks = xTaskGetTickCount(); |
378 | 390 | val = OS_Tick_GetCount(); |
|
0 commit comments