【发布时间】:2014-12-03 14:01:21
【问题描述】:
使用:
- Stm32F10x、F2xx、F4xx
- FreeRtos 8.1.1
- gcc-arm-none-eabi-4_8-2014q2
我有一个必须以高中断优先级运行的 ISR,因此禁止在此 ISR 中调用 FreeRtos Api(请参阅 here 和 here)。
在某些情况下,这些 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 周期)。
有什么建议可以更好地解决这个问题,尤其是延迟更短?
【问题讨论】: