【问题标题】:ARM Detect when an interrupt is taking too much CPU timeARM 检测中断占用过多 CPU 时间时
【发布时间】:2018-10-24 15:31:29
【问题描述】:

我在裸机 ARM C 代码中有一个中断,每秒发生几次,需要执行大量计算。 我希望能够检测这些计算是否占用了过多的 cpu 时间(当前中断在下一次发生时尚未完成)。

我已经尝试过这种算法,但它不起作用:

bool isWorking=false;

void interrupt()
{
if(isWorking) errorCpuLoad();

isWorking = true;

... do the work...

isWorking = false;

}

你知道为什么它不起作用,我可以使用什么更好的策略吗?在 ARM C/assembly 中是否有特定的方法?

编辑:工作负载是用户可配置的,因此这样做的目的是在处理过多时发出警报,而不是崩溃或创建不正确的结果。当负载太高时,中断会返回而不是处理事情,因此它可以保持中断的节奏,而不会累积越来越多的延迟

【问题讨论】:

  • 不要在中断中进行大量计算。
  • 定义(在您的问题中)当处理前一个中断仍在运行时再次出现中断时应该发生什么。否则你的问题不清楚,因为不完整
  • 通常中断在中断例程中被锁定,因此代码最终在响应以后的中断时落后。您可以执行诸如前台/后台“内核”之类的操作,其中中断例程将计算请求排队,然后退出到队列处理程序,该处理程序进行计算,然后在队列清空时返回主级别代码。这也可以通过抢占式内核来完成。如果队列使用的池用完,则需要加快计算速度。
  • 立即清除中断标志。在赋予例程时,对其进行测试。如果已设置,则您花费的时间太长。但是,如前所述,不要在 ISR 中进行大量计算。
  • “进行大量计算”是否包括调用大量“C”或“C++”库例程?您可能会炸毁您的堆栈或调用侥幸工作的不可重入函数。除了你所拥有的,你能抓住一个本地的计时器,然后在最后向一个全局添加一个增量吗?在开发例程以查看编译器生成的内容时,您应该在 ISR 上运行反汇编程序。

标签: c assembly arm interrupt bare-metal


【解决方案1】:

一种方法是测量完成中断处理和启动后续中断之间的时间。这意味着,您无需尝试检测“过载”情况,而是可以衡量您离极限有多近。

如果您有一个空闲线程,您也可以尝试计算那里的进度(针对计时器),这意味着您可以避免在异常代码中添加任何开销。只有在有空闲周期可以进行测量时,您才需要测量空闲时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多