使用:
- Stm32F10x、F2xx、F4xx
- FreeRtos 8.1.1
- gcc-arm-none-eabi-4_8-2014q2
我有一个必须以高中断优先级运行的 ISR,因此禁止在此 ISR 中调用 FreeRtos Api(请参阅此处和此处)。
在某些情况下,这些 ISR 会检测条件,在这些条件下,休眠的 FreeRtos 任务应该以至少可能的延迟唤醒。
通常(如果由于足够低的优先级而允许 ISR 调用 FreeRtos Api)我会使用队列或信号量来解决这个问题。
但是如何通过高优先级 ISR 实现这一点?
我目前的临时方法是这样的(简要概述):
volatile int flag = 0;
void XYZ_IRQHandler() {
if (someCondition)
flag = 1
}
void FreeRtosTaskFunction(void* parameters) {
for (;;) {
if (flag == 1)
doSomething();
vTaskDelay(1); // sleep 10ms (tick frequency is 100Hz)
}
}
但这种方法有以下缺点:
- 延迟(从在 ISR 中设置标志直到任务唤醒)最多为 1 个 FreeRtos 滴答。
- 需要轮询标志(浪费 cpu 周期)。
有什么建议可以更好地解决这个问题,尤其是延迟更少?