我正在接管一个“遗留的”嵌入式系统应用程序,而不是很遗传,我首先关心的是我发现在开发过程中,某些时候应用程序的时间限制丢失了在项目的要求。现在我的任务是重构它并使它成为实际的时间。
该项目是针对C和C ++的ATMEL UC3完成的。它运行在FreeRTOS上,有6个任务。 5用于管理外部设备,另一个用于具有最低优先级和最重任务作为主程序。 我做的第一件事就是测量主要任务所花费的时间,并且有时它离开死线并不奇怪,因此完成的任务在几个周期内完成。
任何人都可以建议我在这种情况下可能采取的主要观点是什么?
你会做什么? 我知道我应该遵循所有执行路径的流程并计算指令,然后采用最差的执行路径,并且芯片的频率将给我实时执行。从理论上讲,是否有任何工具,技巧或程序可以更轻松地完成它?的更新: 的
由于保密原因,我无法分享来源。此外,我一直在深入挖掘,我发现主要的延迟,显然是由队列大小产生的。创建大多数队列用于保存2或3条消息。我需要做一些测试,以便在此提供更多信息。从理论上讲,如果队列被填满,则其他进程将无法再发送,直到再次有可用空间来获取更多消息。然后进程暂停,导致连续重新调度。我的想法是将队列大小增加到10只是为了看它是否改善了性能和时间。
更新2 从建议开始,当我在黑暗中时,我发现它们非常有用,我遇到了一个名为“理解”的工具,它不是免费的,但可以帮助我获得分析和字符。您还可以看到复杂函数的字符串流,因此您可以看到流的最长执行路径。
答案 0 :(得分:3)
在这里提出答案因为Rock'n Roll racing是有史以来最好的比赛之一。那就是说......
根据你的措辞,这听起来像你正在测量的任务,绝对必须使其截止日期是最低优先级。那是对的。您希望您的任务需要保证完成为最高优先级的任务。这将是第一步。 如果我从如何阅读你的问题中弄错了,那么你需要做出最后期限的线程是最优先考虑的问题,那么还有其他事情要看。
确保中断不被任何其他任务长时间禁用,因为这会影响线程调度。如果低优先级任务正在禁用中断然后在循环中旋转一段时间,则RTOS调度程序无法取回控制权并将其提供给高优先级线程。
检查优先级倒置(http://en.wikipedia.org/wiki/Priority_inversion)。如果您的低优先级线程与此关键线程之间存在资源共享,那么您可以进入一种情况,即使您的关键线程具有高优先级,它也可能会阻止等待较低优先级线程完成资源使用。不确定FreeRTOS是否具有优先级互斥锁/信号量,但您也可以检查它。
另一件可能是最简单的解释是分析线程。这在嵌入式系统上很难做到,但你可以制作某种光记录缓冲区或类似的东西。找出什么时候它有时会错过它的截止日期与代码路径的不同之处与它使它成功的时间相比。您可能必须找到一种方法来加快某些路径。例如,在慢速运行中,它可能正在写入比正常情况更多的数据,因此可能会更改这些数据写入以使用DMA而不是手动编写的线程。
这不是一个详尽的清单,而是一些很好的入门提示。