本帖最后由 杨为民 于 2024-4-11 21:53 编辑
(1)众所周知对于单片机RTOS的最重要指标是对事件发生的“实时响应时间”,但是什么是RTOS的“实时响应时间”,业界有各种说法。笔者先用逻辑排除两个可能: 首先不可能是正在运行的用户任务对事件的响应时间,比如用循环语句不断地检测某个条件(来判断事件是否发生)成立进而做出相应的处理。因为用户任务是用户自己编写的程序,其响应时间长短不属于RTOS系统本身。 其次不可能是“中断响应时间”。当一个事件发生后,对应的中断是否能够发生,依赖于很多硬件和软件条件,比如事件中断的优先级高低和用户是否关闭了中断,这些也不属于RTOS系统本身。 (2)因此笔者任务单片机RTOS对事件发生的“实时响应时间”指的是将“休眠的任务”唤醒到执行状态的时间。 唤醒任务分为两种情况:一种情况是中断内唤醒,比如事件发生导致对应的中断发生,在ISR内利用“中断唤醒”功能将高优先级的正在等待的休眠任务唤醒。比如异步通信(CAN...)接收到一帧数据产生中断需要唤醒相应的任务来处理。 另一种情况是中断外由当前正在执行的任务唤醒。比如要调用异步通信(CAN...)发送程序来发送控制信息。 (3)下面是测量被中断唤醒任务所需要的时间的RTOS程序:
任务A休眠等待在第24行程序处。P01是中断唤醒测量端口标志,任务A被唤醒后的第一行程序(26行)将其清零。 下图是中断内唤醒任务的ISR程序:
其中第71行设置P01=1,第72和73行是调用“OSTaskResume(2)”函数来唤醒任务A,第76行是调用“uCx51_IntSched()”函数来进行中断内任务切换,实现唤醒任务A的功能。测试P01端口的正脉冲宽度就可以得到“单片机RTOS的中断实时响应时间” (4)下面是测量非中断唤醒任务所需要的时间的RTOS程序: 其中任务B休眠等待在第45行程序处。P03是非中断唤醒测量端口标志,任务B被唤醒后的第一行程序(47行)将其清零。 (5)在任务C中第71行设置P03=1,第72是调用“OSTaskResume(3)”函数来实现唤醒任务B的功能,由于任务B的优先级3高于任务C的优先级4,所以任务就被RTOS任务调度程序调度到任务B开始继续执行。因此测试P03端口的正脉冲宽度就可以得到“单片机RTOS的任务切换实时响应时间”
(6)下面是对微山x51 uC/OS-II 进行实测的波形: 对第1和第3通道的正脉冲进行测量得到:主频为33.1776MHz 中断实时响应时间为10.125微秒。
任务切换实时响应时间为10.125微秒。
|