为什么不将任务上下文置于中断中

Why not put task context in interrupt

这是故事。

它是一个安全关键项目,需要 运行 20KHz 的时间关键功能例程。现在的设计是将功能程序放在一个20KHz的FIQ中断中,同时安全中断也在FIQ中。那是系统中仅有的两个 FIQ。 (肯定有几个 IRQ 在 MCU 中启用)

我知道将任务上下文放在中断 ISR 中是不好的,正确的做法是在 OS 任务中设置标记和 运行。但似乎目前的设计伤害了任何人。

例程耗时10us左右(主时钟300MHz),所以基本上不会阻塞IRQ/FIQ不可接受的时间。与使用 OS 任务到 运行 功能例程相比,它甚至可以节省额外的上下文切换时间。对我来说,目前感觉这个设计违背了大学教科书上写的所有原则,但找不到拒绝的理由。

我如何说服自己将功能例程从 ISR 转移到 OS?我应该吗?

将复杂代码从 ISR 移开的原因恰恰是为了避免在 ISR 中进行冗长的处理,从而避免由此导致的时序抖动和延迟中断服务。

您是说您的处理时间不长,所以在 ISR 中进行!否则你只是在增加膨胀。

20Khz = 50us 中断之间,10us 的处理时间,它给你大约 20% 的 CPU 时间只是为了这个 "task",并且在运行的任何其他例程中有 10us 的抖动您的 CPU,它还会为任何其他任务消耗的每 40us 计算 10us 的处理时间,如果它对您的项目没问题,并且您将总 CPU 处理时间保持在 70% 以下(是关键系统可接受的常见最大值),恕我直言,它应该可以正常工作。

让我们回忆一下你的情况:

  1. 您正在编写一个安全关键系统
  2. 没有指定软件架构,否则你不会问手头的问题
  3. 没有正确处理系统要求,否则 2) 不会有问题
  4. 有人告诉你 "use minimum interrupt if possible in safety critical system"
  5. 您想为 "just some math work"
  6. 使用最高优先级和不可中断的代码

抱歉有点苛刻,但我不想 use/be 在您的安全关键系统中。

针对你的实际问题: 你必须确保两件事

  • FIQ 中的代码必须是确定性的并且经过 WCET 测试
  • 定时器的寄存器必须受到保护和监督。为什么? unwanted/erroneous 由较低安全级别的代码对定时器寄存器的操作可能会使 CPU 非常拥塞,以至于除了中断之外没有其他有效的处理。

所有这一切都假设您的安全状态完全取决于外部硬件看门狗。

PS:你们系统的用户有哪些危害?烦恼?受伤?致命?您处于 SIL 或 ASIL 环境中吗?