为什么不在中断

时间:2017-11-10 04:20:16

标签: c operating-system embedded interrupt safety-critical

这是故事。

它是一个安全关键项目,需要以20KHz运行时间关键的功能程序。现在的设计是将功能程序放入20KHz FIQ中断,同时在FIQ中也有安全中断。这是系统中唯一的两个FIQ。 (当然,MCU中有一对IRQ启用)

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

该例程大约需要10us(主时钟300MHz),所以基本上它不会在不可接受的时间内阻止IRQ / FIQ。与使用OS任务运行功能例程相比,它甚至可以节省额外上下文切换的时间。对我而言,目前感觉这种设计违背了大学教科书中的每一项原则,但却找不到拒绝理由的理由。

我怎么能说服自己将功能常规从ISR转移到OS?我应该吗?

3 个答案:

答案 0 :(得分:3)

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

  1. 您正在编写安全关键系统
  2. 未指定软件架构,否则您不会问手头的问题
  3. 系统要求未正确处理,否则2)不会有问题
  4. 有人告诉你“如果可能的话,在安全关键系统中使用最小中断”
  5. 你想要使用最高优先级& “只是一些数学工作”的不可中断代码
  6. 抱歉有点苛刻,但我不想使用/进入你的安全关键系统。

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

    • FIQ中的代码必须是确定性的并且经过WCET测试
    • 必须保护和监督计时器的寄存器。为什么?通过较低的安全级别代码对定时器寄存器进行不必要/错误的操作会使CPU大量拥塞,除了处理中断之外没有任何其他操作。

    所有这一切都假设您的安全状态完全取决于外部硬件监视器。

    PS:您的系统用户有哪些危险?烦恼?伤?致死?你是在SIL还是ASIL?

答案 1 :(得分:0)

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

您说明您的处理时间不长,所以在ISR中这样做!否则你只是添加臃肿。

答案 2 :(得分:0)

20Khz =中断之间50us,处理时间为10us,只为此“任务”提供大约20%的CPU时间,并且在CPU中运行的任何其他例程中抖动为10us,它也将总和为10us每个40us的处理时间,任何其他任务将完成,如果你的项目可以,并且你的总CPU处理时间低于70%(这是关键系统可接受的常见最大值),恕我直言它应该没有任何工作问题。