一、背景
已经基于 RT-Thread 实现了小车的基本控制,由于小车的编码器较为简陋,为实现PID调速,算法上做了不少处理,故增加了不少运算量。虽说从现象上看,程序运行正常,预期的功能均已实现。
但如何要想得到一个可靠的程序,必须知道程序运行时的几个关键指标:堆栈使用情况、MCU的占用率、中断响应时间。这些对实时操作系统而言是至关重要的,合理的堆栈剩余空间、MCU占用率及中断响应时间是嵌入式设备连续运行状态下可靠性的保障。
为此,打算基于前面所完成的程序,测试一下上述指标。
二、需求
在最接近真实运行状态下,检测:
- 具备堆栈使用情况监测手段
- CPU(MCU)占用率
- 外部中断响应时间
所谓“真实”,是指:所添加的测试代码尽量不影响原来程序的运行,同时又能反映程序在正常运行状态下,各种情况所对应的上述参数。
至于为何选择这三个指标,网上应该有很多相关讨论,在此就不详述了。
三、测试方式及结果
3.1 堆栈使用情况监测
一般多任务操作系统都需要监测堆栈使用情况,因为栈溢出将会导致程序跑飞,故一般OS会提供一个函数获取栈的最大使用情况。在FreeRTOS中,我就是用此方式获取的。
但在RT-Thread中未找到类似函数,但它提供了两个更好的方式:
- 支持监测栈溢出:就是在程序出现栈溢出时,会通过FinSH 从串口输出信息,这个对使用者还是十分友好的,在使用FreeRTOS时,我是发现程序异常再打开栈监测(因为栈监测输出有点耗资源,故只在需要时打开),此时如果程序已经不能运行基本功能,则需要通过“试”来确定是不是栈溢出所致?是那个任务的栈不够?有点麻烦。在RT-Thread中直接就可以通过输出信息知道那个线程栈不够,很方便。
- 可以通过FinSH交互命令,通过串口终端命令,看到所有线程的栈使用情况;这个和之前我在 Arduino+FreeRTOS 下实现的功能类似,但无需自己编写代码,也是一个对用户十分友好的手段。
有了栈溢出监测,为何还需