![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
3 试验原理和测试方法
首先需要启动并开始运行μC/OS-II,因为试验需要使用的计时函数是系统函数。进行堆栈和中断向量等系统初始化后,首先要创建一个任务,用以产生中断。这样OS启动后,中断服务程序可以在任务中调用或者切换,中断源可以设置为外部中断或由任务产生。在主程序的临界段循环查询中断状态(VICRawIntr;中断状态寄存器),一旦发现有中断标识,则立即启动计数器,并使能该中断,跳出临界段(在进入临界段之前要关中断 (OS_ENTER_CRITICAL()),而跳出临界段代码进入中断服务子程序后,保存全部CPU寄存器后清除中断源,并立即开中断 (OS_EXIT_CRITICAL()),然后停止计时并执行中断处理代码)。由于是在检测到中断标识后才跳出临界段,所以一跳出临界段就会立即发生中断,进行中断处理。保存了CPU寄存器后进入中断服务的第一条指令就是保存计数器值。由于在跳出临界段时才启动的计数器,而在进入中断服务时立即保存了计数值,所以这个计数值就是所需要的中断响应时间。
如果要试验不同优先级的中断响应时间,可以设几个不同优先级的中断服务程序,在高优先级程序的出口计数器清零;而在下一个中断开始时保存计数值,从而测试中断优先级对中断响应时间的影响。
如果要测试不同类型的中断响应时间,可以在程序中,分别使用不同类型的中断(向量中断,非向量中断,快速中断)来测试中断类型对中断响应时间的影响。原则上快速中断(FIQ)要求具有最高的优先级,而且快速中断的处理与操作系统基本无关,中断服务子程序可以自行编写(在不调用μC/OS-II的系统服务程序的情况下),没有特别的要求。向量中断则不能如此。因为虽然ADS可以使用_irq关键字来声明一个函数是用来处理中断的,从而可以避免在程序中使用汇编代码,但是在μC/OS-II中不能这样处理。因为使用C语言无法确保堆栈的结构,而RTOS必须使堆栈保持一定的结构。这只有汇编语言可以做到。这部分的代码在文件VECTORS.S中(为了简化用户编写中断服务子程序,这段汇编代码已经被编写成一个宏HANDLER)[4]。具体可见参考文献 [4]的P358~P359中所列的程序清单6.5中的汇编代码,即中断服务子程序必须按照 μC/OS-II的中断服务程序的要求编写,格式如下[4]:
保存全部CPU寄存器;(1)
调用OSIntEnter或OSIntNesting直接加1;(2)
清除中断源(3)
重新开中断(4)
执行用户代码做中断服务;(5)
调用OSIntExit();(6)
恢复所有CPU寄存器;(7)
执行中断返回指令;(8)
如果要测试存储器加速模块对中断响应时间的影响,可以在关闭、部分使能和完全使能3种设置下分别测试同一个中断的响应时间,从而得出中断响应时间与存储器加速模块设置之间的关系。
由于锁相器的设置必然会影响中断响应时间,并且中断响应时间与锁相器(PLL)的倍频设置成反比,即倍频设置越高,处理器工作速度越快,指令周期越短,而不同时钟设置下同一中断响应所需要执行的指令数是相同的,因而中断响应时间就会越短。所以本文不作此项测试。
下面用程序来测试运行在LPC2104上的μC/OS-II的中断响应时间。系统初始环境(默认)设置如下:系统晶振频率设为11 059.2 kHz,锁相环(PLL)倍增器值设置为4,处理器工作在fCCLK=fOSC×4=11059 MHz×4=44.236 MHz。存储器加速开启。中断类型为IRQ中断,优先级为0,即最高优先级。
μC/OS-II提供了标准的计时程序初始化以及计时开始和计时结束的函数,分别如下所示。这些函数将在所有的试验中使用。
void PC_ElapsedInit(void)//初始化计时程序设置
void PC_ElapsedStart(void)//开始计时
INT16U PC_ElapsedStop(void)//统计时间返回值 |
|