gpt4 book ai didi

stm32 - 如何从高优先级 ISR 唤醒 FreeRtos 任务?

转载 作者:行者123 更新时间:2023-12-01 03:46:53 24 4
gpt4 key购买 nike

使用:

  • Stm32F10x、F2xx、F4xx
  • FreeRtos 8.1.1
  • gcc-arm-none-eabi-4_8-2014q2

  • 我有一个必须以高中断优先级运行的 ISR,因此禁止从该 ISR 中调用 FreeRtos Api(参见 herehere)。

    在某些情况下,这些 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 周期)。

  • 有什么建议可以以更好的方式解决这个问题,尤其是在延迟更少的情况下?

    最佳答案

    我有一个想法,虽然未经测试似乎应该可行。

    我假设你的 ISR 是一个高优先级,因为它需要极低的延迟来做一些不受其他中断影响的事情(即,在准确的时间进行测量),并且任务应该很快完成,但并不像关键(即传输或显示值)。

    在您的高优先级 ISR 中,执行时序关键功能,然后触发低优先级内部中断。

    当高优先级 ISR 完成时(以及任何其他未决的),将调用低优先级 ISR。然后,这可以调用 FreeRTOS API 并立即启动任务,不再有任何延迟。

    关于stm32 - 如何从高优先级 ISR 唤醒 FreeRtos 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26264877/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com