其中,OSTCBList是XGATE响应RTI中断时需要带入的参数,这里这个参数是μC/OS-II任务控制块链表的首地址;XGATE_TableEntry是一个编译器自定义的结构体变量类型;XGATE_VectorTable[]是XGATE的中断向量表。写好XGATE的中断向量表后,使用XGATE实现μC/OS-II时钟节拍的设置过程就完成了。
3 效果测试与分析
为了验证用协处理器处理时钟节拍中断的效果,进行如下测试:在同-S12x单片机上,分别使用和不使用XGATE处理μC/OS-II的时钟节拍中断。在两种情况下,建立同样的10个任务,时钟节拍中断服务子程序中同样只进行任务控制块链表遍历和延时计数器减1,不做任务调度。这样,μC/OS-II中会有一个任务总处于就绪态并一直运行,这个一直运行的任务会通过循环计数的方法在一个I/O端口上输出一个方波。在同样的总线时钟和同样频率的时钟节拍下,比较两种μC/OS-II输出的方波周期的差别。
测试的目的是,观察μC/OS-II的时钟节拍中断服务子程序的加载,对正在系统中运行的任务的影响。为了与XGATE处理任务控制块链表遍历和延时计数器减1进行对比,未使用XGATE的μC/OS-II中,S12X CPU的时钟节拍中断服务子程序只保留与XGATE同样的操作。没有任务调度,也方便对系统中正在运行的任务输出的方波进行观察。
在不使用的XGATE的μC/OS-II中,S12X CPU的RTI中断的中断服务子程序代码如下:
以上S12X CPU中断服务子程序共有220条指令,需运行538个周期。测试中采用了16 MHz的总线时钟和16 kHz的μC/OS-II时钟节拍。可以估算出,每次中断服务子程序在S12X CPU中的运行时间为33.6 μs,约相当于62.5μs时钟节拍的53%,即S12X CPU需要用一多半的时间响应时钟节拍中断,这显然是不可取的。
在μC/OS-II中用XGATE处理时钟节拍中断时,当无需做任务调度时,XGATE遍历10个任务的控制块链表,执行延时计数器减1操作,共需要148条指令。由于XGATE是RISC结构的处理器,指令执行时间多为1~2个周期,故执行148条指令共需要218个周期。在32MHz时钟频率下,执行时间大约7μs,仅相当于62.5 μs时钟节拍的11%。这说明,即使使用短至62.5μs的时钟
节拍,对XGATE的占用率也并不高。
通过以上测试可看出,由单一CPU运行μC/OS-II,16 kHz的时钟节拍导致S12X CPU频繁地加载中断服务子程序,占用超过了50%,严重地影响了任务的实时运行。故对于单一CPU,一般采用的时钟节拍频率不高于100 Hz,此时计时精度为±10 ms,以避免时钟节拍中断占用大量CPU运行时间。
在用XGATE处理μC/OS-II的时钟节拍时,16 kHz的时钟节拍并未对S12X CPU的任务运行产生影响,这个频率的时钟节拍使μC/OS-II的定时精度高于±62.5 μs。利用协处理器XGATE来处理μC/OS-II的时钟节拍,使主CPU的执行时间为固定值,因而保证了任务的实时运行,提升了系统实时性,高频率的时钟节拍也提高了计时精度。
4 结 论
μC/OS-II中,时钟节拍中断服务子程序需要遍历整个任务控制块链表,不同应用中任务数目不同,遍历整个任务控制块链表所花费的时间就不同。时钟节拍中断所带来的不确定性是影响μC/OS-II实时性指标的唯一因素。采用协处理器来实现μC/OS-II的时钟节拍可以很好地解决这个问题。
如果使用协处理器来响应μC/OS-II的时钟节拍中断,那么μC/OS—II任务控制块链表的遍历和延时计数器减1操作均由协处理器完成。主CPU只有在需要做任务调度时才会进入相应的中断服务子程序,因此主CPU运行中断服务子程序的时间是固定值。由于主CPU的运行时间不会被时钟节拍中断占用,因而可以采用很高频率的时钟节拍来提高μC/OS-II的计时精度。
本文关键字:处理器 嵌入式系统-技术,单片机-工控设备 - 嵌入式系统-技术