【发布时间】:2021-01-27 21:34:49
【问题描述】:
我有一个SysTick中断每秒触发4次任务切换,如下图。
void SysTick_Handler(void) {
SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk; // Set PendSV
}
main 中的任务偶尔会通过其中一个 UART 输出一些消息,并且为了确保它们具有独占 I/O 访问权限,输出例程受到由 LDREX 和 STREX 设置的互斥锁保护。代码在 90% 以上的情况下都能完美运行。
但是,这种保护的一个副作用似乎是,在设置互斥锁期间发生 SysTick 时,不会发生任务切换,并且当时正在运行的任务将继续运行,直到下一次任务切换。
有没有办法在 10 毫秒后再次触发 SysTick,并一直这样做,直到当前正在运行的任务清除互斥锁?例如:
void SysTick_Handler(void) {
if (mutex) {
// set SysTick to trigger again in 10 ms
} else {
SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk; // Set PendSV
}
}
如果是,如何。
TIA
【问题讨论】:
标签: timer arm interrupt cortex-m