2

我正在接管一个“遗留”嵌入式系统应用程序,不是很遗留,我首先担心的是我发现在开发过程中,在某些时候应用程序的时间限制在需求中丢失了的项目。现在,我的任务是重构它并使其按预期实时化。

该项目是为 C 和 C++ 中的 ATMEL UC3 完成的。它在 FreeRTOS 上运行,有 6 个任务。5 用于管理外部设备和另一个,以最低优先级和最重的任务为主程序。我做的第一件事是测量主要任务所花费的时间,有时它会脱离死线并不奇怪,因此完整的任务是在几个周期内执行的。

谁能建议我在这种情况下可能采取的主要观点是什么?

你会怎么做?我知道我应该遵循所有执行路径的流程并计算指令,然后选择最差的执行路径,并以芯片的频率给我实时执行。那是理论上的,是否有任何工具,技巧或程序可以让它更容易一些?

更新:

出于保密原因,我无法分享来源。此外,我一直在深入挖掘,发现主要延迟显然是由队列大小产生的。大多数队列是为保存 2 或 3 条消息而创建的。我需要做一些测试才能在此处提供更多信息。理论上,如果队列被填满,那么其余进程将无法再发送,直到再次有空闲空间来接收更多消息。然后进程暂停,导致连续重新调度。我的想法是将队列大小增加到 10,以查看它是否可以提高性能和时间。

更新 2 从建议开始,当我在黑暗中发现它们非常有帮助时,我遇到了一个名为“理解”的工具,它不是免费的,但可以帮助我获得分析和字符。您还可以看到复杂函数的字符流,因此您可以看到最长的执行路径。

4

1 回答 1

3

在这里抛出一个答案,因为摇滚赛车是有史以来最好的游戏之一。话虽如此...

从你这里的措辞听起来你正在衡量的任务绝对必须使其截止日期是最低优先级。那里的权利是倒退的。您希望您的任务需要保证其作为最高优先级任务完成。那将是第一步。如果我从阅读您的问题的方式上弄错了,并且您需要在截止日期前完成的线程是最高优先级,那么还有其他事情需要考虑。

确保任何其他任务不会长时间禁用中断,因为这会影响线程调度。如果低优先级任务禁用中断,然后在循环中旋转一段时间,则 RTOS 调度程序无法收回控制权并将其交给高优先级线程。

检查优先级反转(http://en.wikipedia.org/wiki/Priority_inversion)。如果您的低优先级线程和该关键线程之间存在资源共享,那么您可能会遇到这样一种情况:即使您的关键线程是高优先级的,它也可能会阻塞等待低优先级线程完成使用资源。不确定 FreeRTOS 是否具有优先互斥量/信号量,但这也是您可以检查的。

可能是最简单的解释的另一件事是分析线程。这在嵌入式系统上很难做到,但您可以制作某种光记录缓冲区或类似的东西。找出有时会错过最后期限的时间,该代码路径与使其正常的时间有何不同。您可能必须找到一种方法来加快某些路径。例如,在慢速运行中,它可能会写入比正常情况更多的数据,因此可能会将这些数据写入更改为使用 DMA 而不是手动写入的线程。

这不是一个详尽的列表,而是一些很好的入门技巧。

于 2014-02-13T12:07:11.103 回答