RTOS开发学习记录(8):测试

成元 2026-04-22 { 教程, 笔记 } [ RTOS ]

前言

前面几篇文章主要记录了 Yuan RTOS 的任务调度、软件定时器和 IPC 机制。功能写出来之后,还需要做一些基本测试,至少要确认常见路径能跑起来,而且长时间运行不会出现明显异常。

这篇文章记录一下目前做过的初步测试,包括资源占用、队列收发测试方法和长时间运行结果。

完整代码请访问我的Github仓库,网址为:yuan-rtos

值得注意是本文的测试结果只代表当前版本和当前测试条件,后续代码修改、编译选项变化、BSP 示例变化都可能导致结果不同。

测试平台

当前主要测试平台如下:

串口日志通过 socat 读取,并使用 ts 添加时间戳,类似如下:

sudo socat -u /dev/ttyACM0,b115200,raw,echo=0 STDOUT | ts '[%Y-%m-%d %H:%M:%.S]' | tee uart.log

这样可以同时在终端观察输出,并把日志保存到文件中,方便后续统计。

资源占用

先记录一下资源占用。README 中使用“相较于不使用 Yuan RTOS 的基线程序”的增量口径进行了测试。

测试条件如下:

优化等级 -Os 下:

场景 RAM 增量 ROM 增量
仅内核 640B 2476B
快速上手程序 1752B 3216B

优化等级 -O3 下:

场景 RAM 增量 ROM 增量
仅内核 640B 3976B
快速上手程序 1752B 4704B

可以看到,对于这个项目来说,-O3 主要增加的是 ROM 占用,RAM 基本不变。

当前用于队列长时间测试的 BSP 固件,使用 arm-none-eabi-size 看到的结果如下:

   text    data     bss     dec     hex filename
  14144      12   14988   29144    71d8 rtos.elf

这里的 bss 比较大,主要和 BSP 示例中创建了多个任务栈、多个队列缓冲区有关。也就是说,这个数字不能简单看成内核本身的资源占用,而是“当前测试程序整体”的资源占用。

初步测试方法

目前比较主要的测试是队列长时间收发测试。

测试程序创建了 5 组队列,每组对应一个发送任务和一个接收任务。发送任务周期性递增发送整数,接收任务从队列读取整数,并统计自己已经接收了多少次。

接收任务会检查并打印类似下面的信息:

[INFO] queue 0 : count = 1000, receive = 1000
[INFO] queue 1 : count = 2000, receive = 2000
[INFO] queue 2 : count = 3000, receive = 3000

其中:

发送任务从 1 开始递增发送,因此在正常情况下,接收端的 countreceive 应该一直相等。

为了减少串口输出压力,不是每次接收都打印,而是按不同队列设置不同打印间隔:

这样既可以观察多个队列是否都在工作,也不会让串口输出过于频繁。

检查思路

日志保存后,可以从几个角度检查:

我使用脚本对日志进行了统计。核心不是脚本本身,而是确认日志中有没有出现“计数不一致、跳变、倒退、任务停止输出”等现象。

最终结果

这次日志文件为 test/uart.log,记录时间如下:

first=2026-04-21 11:55:48.689349
last=2026-04-21 23:44:47.151256
lines=97134

也就是说,测试程序连续运行了接近 11 小时 49 分钟。日志中只有一次 Start,没有发现重复启动迹象。

队列日志统计结果如下:

total_parsed=97133 mismatch=0
queue 0 lines=42540 jumps=0 last_count=42540000 last_receive=42540000
queue 1 lines=21270 jumps=0 last_count=42540000 last_receive=42540000
queue 2 lines=14180 jumps=0 last_count=42540000 last_receive=42540000
queue 3 lines=10635 jumps=0 last_count=42540000 last_receive=42540000
queue 4 lines=8508  jumps=0 last_count=42540000 last_receive=42540000

这里可以看到:

从这个结果看,当前队列的基本收发、阻塞、唤醒、超时相关路径没有暴露出明显问题。

当然,这个测试不能证明 RTOS 已经完全没有 bug。它只能说明在当前 BSP、当前负载和当前运行时间下,队列相关的主路径表现稳定。后续还需要继续补充更多测试,比如:

总结

目前 Yuan RTOS 的初步测试主要覆盖了资源占用和队列长时间运行。

资源占用方面,内核本身增量较小,当前长测 BSP 的 RAM 占用主要来自任务栈和队列缓冲区。

功能测试方面,队列长时间运行接近 12 小时,最终没有发现数据错位、跳变、复位或异常日志。这个结果不能代表完全可靠,但至少说明当前实现已经具备继续扩展和继续测试的基础。