【发布时间】: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