网站首页
IC库存
IC展台
电子资讯
技术资料
PDF文档
我的博客
IC72论坛
ic72 logo
搜索关键字: 所有资讯 行业动态 市场趋势 政策法规 新品发布 技术资讯 价格快报 展会资讯
  • 达普IC芯片交易网 > 新闻中心 > 技术信息 > 正文
  • RSS
  • μC/OS-II的实时性能分析
    http://www.ic72.com 发布时间:2007/4/29 8:55:37
    μC/OS-II的实时性能分析
    作 者: 武汉理工大学 方安平 肖强

    引 言

    1 嵌入式实时操作系统和μC/OS-II

      嵌入式操作系统EOS(Embedded Operating System)主要负责嵌入式系统的全部软、硬件资源的分配、调度、控制、协调并发活动;它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能[1]。

      μC/OS-II是专门为计算机的嵌入式应用而设计的实时操作系统,是基于静态优先级的占先式(preemptive)多任务实时内核。采用μC/OS-II作为测试的目标,一方面是因为它已经通过了很多严格的测试,被确认是一个安全的、高效的实时操作系统;另一个重要的原因,是因为它免费提供了内核的源代码,通过修改相关的源代码,就可以比较容易地构造自己所需要的测试环境,实现自己需要的功能。

    2 实时操作系统和系统实时性能指标

      实时系统对逻辑和时序的要求非常严格,如果逻辑和时序出现偏差将会引起严重后果。实时系统有两种类型:软实时系统和硬实时系统。软实时系统仅要求事件响应是实时的,并不要求限定某一任务必须在多长时间内完成;而在硬实时系统中,不仅要求任务响应要实时,而且要求在规定的时间内完成事件的处理。通常,大多数实时系统是两者的结合。

      事实上,没有一个绝对的数字可以说明什么是硬实时,什么是软实时。它们之间的界限是十分模糊的。这与选择什么样的CPU,它的主频、内存等参数有一定的关系[1]。另外,因为应用的场合对系统实时性能要求的不同而有不同的定义。因此,在现有的固定的软、硬件平台上,如何测试并找出决定系统实时性能的关键参数,并给出优化的措施和试验数据,就成为一个具有普遍意义并且值得深入探讨的课题。本文就是基于此目的进行讨论的。

      因为采用实时操作系统的意义就在于能够及时处理各种突发的事件,即处理各种中断,因而衡量嵌入式实时操作系统的最主要、最具有代表性的性能指标参数无疑应该是中断响应时间了。中断响应时间通常被定义为:

      中断响应时间=中断延迟时间+保存CPU状态的时间+该内核的ISR进入函数的执行时间[2]。

      中断延迟时间=MAX(关中断的最长时间,最长指令时间) + 开始执行ISR的第一条指令的时间[2]。

      通俗点定义就是:从中断发生起,到执行中断处理程序的第一条指令所用的时间。由于实时操作系统更多考虑的是最坏的情况,而不是平均的情况,因此指令执行的时间就按照最长的指令执行时间来计算,所以中断延迟时间,通常是由关中断的最长时间来决定的。当FIQ(快速中断)使能时,最坏情况下FIQ的中断延迟时间由以下几个部分构成:

      t同步——请求通过同步器的最长时间,约4个处理器周期。

      t最长指令时间——最长指令完成的时间。最长指令是加载包括PC的所有寄存器的LDM指令,在零等待状态的系统中,约为20个周期。

      t异常——数据异常进入时间,为3个周期。

      tFIQ——FIQ进入时间, 2个周期。

      最大的FIQ中断延迟时间约为29个时钟周期。在系统使用40 MHz处理器时钟时,约为0.7 μs。

      对于最大的IRQ延迟,其计算与FIQ类似。若必须允许FIQ有更高的优先级,那么进入IRQ处理程序的延迟时间是随机的[3]。

    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=11059 MHz×4=44.236 MHz。存储器加速开启。中断类型为IRQ中断,优先级为0,即最高优先级。

      μC/OS-II提供了标准的计时程序初始化以及计时开始和计时结束的函数,分别如下所示。这些函数将在所有的试验中使用。

    void PC_ElapsedInit(void)//初始化计时程序设置
    void PC_ElapsedStart(void)//开始计时
    INT16U PC_ElapsedStop(void)//统计时间返回值

      进行实验时,首先在进入main()函数前对系统进行一些基本的初始化工作,包括初始化引脚、系统时钟、存储器加速模块、系统时钟等参数,以保证系统能够基本运行。初始化完成后,系统进入main()函数,并创建新的任务。以外部中断为例,由按键产生一个外部中断,在当前运行的任务中循环检测中断标志寄存器,检测到后就跳出循环进入中断服务子程序。统计这段时间,就可以得出中断响应时间了。

      中断服务程序的汇编部分按照参考文献《ARM微控制器基础与实践》P384~P385的程序清单6.5异常处理代码的汇编部分来编写,也就是编写宏HANDLER,并在Vectors.s文件中引用这个汇编接口:IRQ_Handler HANDLER IRQ_Exception,至此就完成了μC/OS-II中断服务子程序的汇编部分。C语言部分主要用于具体的中断处理,在完成必要的初始化后,只要在中断处理程序的第一句将计时停止并返回计数值,具体的中断处理代码则并不重要,或者说停止计时就是中断处理代码了。由于IRQ中断与系统相关,这部分代码一般在文件TARGET.C中编写实现。C语言部分示意性代码如下所示:
    void __IRQ_Ecpe(void) {
    INT16UElapTime;
    OS_ENTER_CRITICAL();//关中断
    OSIntEnter();//中断服务子程序ISR开始
    EXTINT = 0x02;//清除中断源
    OS_EXIT_CRITICAL();//开中断
    ElapTime=PC_ElapsedStop();//停止计时并返回计数值
    OSIntExit();//退出中断服务
    VICVectAddr0=0;//清零中断向量
    }
    void Task (void) {
    PINSEL0 = 0x20000000;//设置I/O口工作模式,P0.14
    //设置为EINT1
    IODIR = 0x00000400;//设置LED1控制口为输出,其
    //他I/O为输入
    VICIntSelect = 0x00000000;//设置所有通道为IRQ中断
    VICVectCntl0 = 0x2E;//EI NT1通道分配到IRQ slot 0,
    //即优先级最高
    VICVectAddr0 = (int)IRQ_Ecpe;//设置EINT0向量地址
    VICIntEnable = 0x00008000;//使能EINT0
    EXTINT = 0x02;//清除外部中断标志
    OS_ENTER_CRITICAL();//进入临界区,关中断
    While(1)//循环检测
    {if ((EXTINT & 0x01!)=0)
    PC_ElapsedStart(); //如果有中断发生,计时开始
    break ;}}// 跳出循环;
    OS_EXIT_CRITICAL(); //退出临界区,开中断
    return(0);
    }
    int main (void) {
    PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);
    OSInit();
    PC_DOSSaveReturn();
    PC_ElapsedInit()
    RandomSem=OSSemCreate(1);
    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
    OSStart();
    }

      测试不同优先级的中断响应时间的情况稍有些不同。因为要在低优先级任务的中断出口激活高优先级的中断任务,对计数器清零并开始计数,在高优先级的中断处理代码的第一条语句结束计时。其余的部分基本一样。限于篇幅,具体的源代码就不一一列举了。

    4 结论

    经过试验,得到表1所列测试数据。所有数据按照默认的条件,每次只更改其中一个条件测试得出。

    注:中断优先级测试时,中断响应时间大于正常值,是因为发生高优先级中断时,需要等待低优先级中断任务开中断才能进行响应。

      由以上数据可知,μC/OS-II的中断响应时间受内存加速模块和系统频率设置的影响较大,而与中断的类型和任务(中断)优先级关系不大。以上仅仅是个简单的测试,更深入的测试可以基于这个方法继续探讨。




    www.ic72.com 达普IC芯片交易网
  • 行业动态
  • 市场趋势
  • 政策法规
  • 新品发布
  • Baidu

    IC快速检索:abcdefghijklmnopqrstuvwxyz0123456789
    COPYRIGHT:(1998-2010) IC72 达普IC芯片交易网
    客户服务:service@IC72.com 库存上载:IC72@IC72.com
    (北京)联系方式: 在线QQ咨询:点击这里给我发消息 联系电话:010-82614113 传真:010-82614123
    京ICP备06008810号-21 京公网安备 11010802032910 号 企业资质