新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > μC/OS-II在80x86上的移植

μC/OS-II在80x86上的移植

作者: 时间:2016-10-08 来源:网络 收藏

OS_CPU_C.C中未定义,此函数为用户定义。其用法请参考例程3。

9.05.06 OSTimeTickHook()

OS_CPU_C.C中未定义,此函数为用户定义。

9.06 内存占用

表9.1列出了指定初始化常量的情况下,μC/OS-II占用内存的情况,包括数据和程序代码。如果μC/OS-II用于嵌入式系统,则数据指RAM的占用,程序代码指ROM的占用。内存占用的说明清单随磁盘一起提供给用户,在安装μC/OS-II后,查看SOFTWAREuCOS-

IIIx836LDOC目录下的ROM-RAM.XLS文件。 该文件为MicrosoftExcel文件, 需要Office97

或更高版本的Excel打开。

表9.1中所列出的内存占用大小都近似为25字节的倍数。笔者所用的BorlandC/C++V3.1设定为编译产生运行速度最快的目标代码,所以表中所列的数字并不是绝对的,但可以给读者一个总的概念。例如,如果不使用消息队列机制,在编译前将OS_Q_EN设为0,则编译后的目标代码长度6,875字节,可减小大约1,475字节。

此外,空闲任务(idle)和统计任务(statistics)的堆栈都设为1,024字节(1Kb)。根据您自己的要求可以增减。μC/OS-II的数据结构最少需要35字节的RAM。

表9.2说明了如何裁减μC/OS-II,应用在更小规模的系统上。此处的小系统有16个任务。

并且不采用如下功能:

?邮箱功能(OS_MBOX_EN设为0)

?内存管理机制(OS_MEM_EN设为0)

?动态改变任务优先级(OS_TASK_CHANGE_PRIO_EN设为0)

?旧版本的任务创建函数OSTaskCreate()(OS_TASK_CREATE_EN设为0)

?任务删除(OS_TASK_DEL_EN设为0)

?挂起和唤醒任务(OS_TASK_SUSPEND_EN设为0)

采取上述措施后, 程序代码空间可以减小3Kb, 数据空间可以减小2,200字节。 由于只有16个任务运行,节省了大量用于任务控制块OS_TCB的空间。在80x86的大模式编译条件下,每一个OS_TCB将占用45字节的RAM。

9.07 运行时间

表9.3到9.5列出了大部分μC/OS-II函数在80186处理器上的运行时间。 统计的方法是将C原程序编译为汇编代码,然后计算每条汇编指令所需的时钟周期,根据处理器的时钟频率,最后算出运行时间。表中的I 栏为函数包含有多少条指令,C 栏为函数运行需要多少时钟周期,μs为运行所需的以微秒为单位的时间。表中有3类时间,分别是在函数中关闭中断的时间、函数运行的最小时间和最大时间。如果您不使用80186处理器,表中的数据就没有什么实际意义,但可以使您理解每个函数运行时间的相对大小。

表 9.1μC/OS-II 内存占用( 80186).

表 9.2 压缩后的μC/OS-II配置.

以上各表中的时间数据都是假设函数成功运行,正常返回;同时假定处理器工作在最大总线速度。平均来说,80186处理器的每条指令需要10个时钟周期。

对于80186处理器,μC/OS-II中的函数最大的关闭中断时间是33.3μs,约1,100个时钟周期。

N/A是指该函数的运行时间长短并不重要,例如一些只执行一次初始化函数。

如果您用的是x86系列的其他CPU,您可以根据表中每个函数的运行时钟周期项估计当前CPU的执行时间。例如,如果用80486,且知80486的指令平均用2个时钟周期;或者知道80486总线频率为66MHz(比80186的33MHz快2倍),都可以估计出函数在80486上的执行时间。

表 9.3μC/OS-II函数在33MHz80186上的执行时间.

表9.3μC/OS-II函数在33MHz80186上的执行时间.(续表)内存管理

表9.3μC/OS-II函数在33MHz80186上的执行时间.(续表)

下面我们将讨论每个函数的关闭中断时间,最大、最小运行时间是如何计算的,以及这样计算的先决条件。

OSSchedUnlock()

最小运行时间是当变量OSLockNesting减为0,且系统中没有更高优先级的任务就绪,SSchedUnlock()正常结束返回调用者。

最大运行时间是也是当变量OSLockNesting减为0,但有更高优先级的任务就绪,函数中需要进行任务切换。

OSIntExit()

最小运行时间是当变量OSLockNesting减为0,且系统中没有更高优先级的任务就绪,OSIntExit()正常结束返回被中断任务。

最大运行时间是也是当变量OSLockNesting减为0,但有更高优先级的任务就绪,OSIntExit()将不返回调用者,经过任务切换操作后,将直接返回就绪的任务。

OSTickISR()

此函数假定在当前μC/OS-II中运行有最大数目的任务(64个)。

最小运行时间是当64个任务都不在等待延时状态。也就是说,所有的任务都不需要OSTickISR()处理。

最大运行时间是当63个任务(空闲进程不会延时等待)都处于延时状态,此时OSTickISR()需要逐个检查等待中的任务,将计数器减1,并判断是否延时结束。这种情况对于系统是一个很重的负荷。例如在最坏的情况,设时钟节拍间隔10ms,OSTickISR()需要625μs,占了约6%的CPU利用率。但请注意,此时所有的任务都没有执行,只是内核的开销。

OSMboxPend()

最小运行时间是当邮箱中有消息需要处理的时候。

最大运行时间是当邮箱中没有消息,任务需要等待的时候。此时调用OSMboxPend()的任务将被挂起,进行任务切换。最大运行时间是同一任务执行OSMboxPend()的累计时间,这个过程包括OSMboxPend()查看邮箱,发现没有消息,再调用任务切换函数OSSched(),切换到新任务。当由于某种原因调用OSMboxPend()的任务又被唤醒执行,从OSSched()中返回,发现返回的原因是由于延时结束(处理延时结束情况的代码最长—译者注),最后返回调用任务。OSMboxPend()的最大运行时间是上述时间的总和。



关键词:

评论


相关推荐

技术专区

关闭