当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]μC/OS-Ⅱ在ARM7上移植方法的探讨与实现

    随着嵌入式技术的快速发展,实时多任务操作系统作为一种软件平台已逐步成为国际嵌入式系统的主流,目前世界上已经有一大批成熟的实时嵌入式操作系统,通常,对嵌入式软件的基本要求是体积小、指令速度快、具有较好的裁减性和可移植性,目前,实时操作系统很多,如VxWorks,Windows CE,pSOS,QNX,LynxOS等,这些操作系统都具有高可靠性、强实时性等特点,但他们都是商业操作系统,价格昂贵,人们往往很难接受,μC/OS-Ⅱ操作系统的出现是对这些商业操作系统的一个很大的冲击。

       1 μC/OS-Ⅱ操作系统简介

       μC/OS-Ⅱ是源码公开的实时操作系统,是一个自由操作系统。程序开发人员可以改写源代码,使之符合自己的要求,裁减掉不需要的部分,使操作系统变得小巧、灵活、并且能满足用户特定操作系统的需要。为了提高系统的实时能力,μC/OS-Ⅱ可以将一个复杂的应用划分为多个相互独立的任务,并根据任务的重要性来分配优先级。任务的调度完全由μC/OS-Ⅱ的实时内核完成,主要包括任务的状态管理、选择最高优先级的任务、执行任务和撤销任务等,μC/OS-Ⅱ内核还负责CPU时间分配,CPU时间总是优先分配给中断事件,其次是任务队列中当前优先级最高的任务,不同任务间的通信可以通过μC/OS-Ⅱ提供的信号量、邮箱、信息队列等机制完成,他的绝大部分代码是用C语言编写的,可移植性强,因此1997年以后,在国际上逐渐被广泛采用。

       2 其软硬件体系及可移植性分析

       μC/OS-Ⅱ核心代码很小,程序开发人员要把他移植到自己的目标板中只需做少量的工作。图1是基于μC/OS-Ⅱ的嵌入式系统的软硬件体系结构。

       虽然μC/OS-Ⅱ大部分源代码是用C语言写的,但是完成和处理器有关的代码时,还是用汇编语言来实现的,由图1可以看出,μC/OS-Ⅱ的移植的主要工作是修改与处理器相关部分的代码,他们集中在3个文件中,其中,OS_CPU.H包含与处理器相关的常量、宏和结构体的定义;OS_CPU_C.C和OS_CPU_ASM中定义了用于底层的任务切换,退出中断服务程序,在CPU级屏蔽中断、打开中断、对任务栈初始化以及时钟的中断服务程序的函数等,为了使应用程序运行于μC/OS-Ⅱ上,还要相应地修改应用中使用的硬件和设备驱动。

       3 μC/OS-Ⅱ的移植工作

       3.1 与应用相关的代码

       这一部分是用户根据自己的应用系统来定制合适的内核服务功能,包括2个文件:OS_CFG.H和INCLUDES.H。

       OS_CFG.H 用来配置内核,用户根据需要对内核进行修改,留下需要的部分,去掉不需要的部分,比如系统可提供的最大任务数量,是否定制邮箱服务,是否提供优先级动态改变功能等等,所有的配置更改包括头文件的增减均在该文件中进行。

       INCLUDES.H 系统头文件,整个实时系统程序所需要的文件,包括了内核和用户的头文件,这样使得用户项目中的每个.C文件不用分别去考虑他实际上需要哪些头文件。

       3.2 与处理器相关的代码

       这是移植中最关键的部分。内核将应用系统和底层硬件有机地结合成一个实时系统,要使同一个内核能适用于不同的硬件体系,就需要在内核和硬件之间有一个中间层,这就是与处理器相关的代码,处理器不同,这部分代码也不同,我们在移植时需要自己处理这部分代码,在μC/OS中这一部分代码分成3个文件:OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C。

       3.2.1 OS_CPU.H

       包含了用#define定义的与处理器相关 的常量、宏和类型定义,具体有系统数据类型定义、栈增长方向定义、关中断和开中断定义、系统软中断的定义等。

       (1)不依赖于编译的数据类型

       μC/OS-Ⅱ不使用C语言中的short,int和long等数据类型的定义,因为他们与处理器类型有关,隐含着不可移植性,代之以移植性强的整数数据类型,这样,既直观又可移植。根据ADS编译器的特性,代码为:

       typedef unsigned char BOOLEAN
       typedef unsigned char INT8U;
       typedef signed char INT8S;
       typedef unsigned short INT16U;
       typedef signed short INT16S;
       typedef unsigned int INT32U;
       typedef signed int INT32S;
       typedef float FP32;
       typedef double FP64;
       typedef INT32U OS_STK;

 

       (2)使用软中断SWI做底层接口

       因为带T变量的ARM7处理器核具有两个指令集,用户任务可以使用两种处理器模式,为了使底层接口函数与处理器状态无关,同时在任务调用相应函数时不需要知道该函数位置,本例使用软中断指令SWI作为底层接口,使用不同的功能号区分不同的函数,其SWI服务函数代码为:
   

      

 [!--empirenews.page--]

       (3)OS_STK_GROWTH

       μC/OS-Ⅱ使用结构常量OS_STK_GROWTH指定堆栈的生长方式,其代码为:

       #define OS_STK_GROWTH 1

       3.2.2 OS_CPU_C.C

       包含了与移植有关的C函数,包括堆栈的初始化和一些钩子函数的实现,但是最重要的是OSTaskStkInit()函数,该函数是在用户建立任务时系统内部自己调用的,用来对用户任务的堆栈初始化。在ARM7体系结构下,任务堆栈空间由高至低递减,依次保存着PC,LR,R12,…,R1,R0,CPSR的初始化堆栈结构,当用户初始化了堆栈,OSTaskStkInit()就返回新的堆栈指针STK所指的定地址。OSTaskCreate()和OSTaskCreateExt()会获得该地址并将他保存到任务控制块TCB中,其他的几个钩子函数必须声明,但可以不包含任务代码,这些钩子函数在本移植中全为空函数。

       3.2.3 OS_CPU_A.S

       μC/OS-Ⅱ移植的绝大部分工作都集中在OS_CPU_A.S文件的移植上,在这个文件里,最困难的工作又集中体现在OSIntCtxSw和OSTickISR这两个函数的实现上。这是因为这两个函数的实现是和移植者的移植思路以及相关硬件定时器、中断寄存器的设置有关,在实际的移植工作中,这两个地方也是比较容易出错的地方,这部分需要对处理器的寄存器进行操作,所以必须用 汇编语言编写,包括4个子函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。

       OSStartHighRdy()该函数首先调用钩子函数OSTaskSwHook(),然后将OSRunning标志位设置为真,表示任务开始执行,从而保证任务切换操作的正确执行,紧接着从具有最高优先级的任务控制块中取得任务的堆栈指针,初始化堆栈指针寄存器SP,然后恢复其他的寄存器,开始执行最高优先级的任务。

       OSCtxSw()该函数在任务级任务切换函数中调用,首先保存处理器寄存器,将当前SP存入任务TCB中,载入就绪最高优先级任务的SP,从新任务的任务堆栈中恢复处理器所有寄存器的值,然后执行中断返回指令。

       OSIntCtxSw()该函数是在ISR中执行任务切换功能,其原理基本上与任务级的切换相同,区别只是ISR已经保存了CPU的寄存器,因此不要再进行类似的操作,只需对堆栈指针作相应的调整即可。

       OSTickISR()该函数是系统时钟节拍中断服务函数,首先要保存处理器寄存器,接着调用OSIntEnter()函数,以保证中断嵌套层数不超过255层,如果满足了该条件,则把堆栈指针保存到当前任务的任务控制块TCB中,然后给产生中断的设备清中断,重新允许中断,接下来调用OSTimeTick()来维持μC/OS-Ⅱ内部的定时以及调用OSIntExit()函数决定是否因为这个中断服务程序的执行,使得更高优先级的任务就绪。

       4 μC/OS-Ⅱ的测试

       做完移植工作以后,就要测试移植是否正确,这其实是移植过程的最后一步,应该首先不加任何用代码来测试移植好的μC/OS-Ⅱ,即应该首先测试内核自身的运行状况,这样做的目的是如果有些部分未能正常工作,那就是移植本身的问题,而不是应用代码产生的问题,主要分为以下几个步骤来进行移植的测试:

       首先,必须了解处理器所使用的编译器系统,这个步骤取决于使用的编译器,在这期间是无代码的测试,其次,要验证OSTaskStkInit()和OSStartHighRdy()函数,在OS_CFG.H文件中设置OS_TASK_STAT_EN为0,只让一个空闲任务OS_TaskIdle()运行,检查是否出错,然后需要验证任务级切换OSCtxSw()函数,在测试任务TaskTest()中加入OSTimeDly()函数,OSTimeDly()函数接着调用OS_Sched(),OS_Sched()调用汇编语言编写的函数OSCtxSw()函数,如果是正确配置了SWI,CPU就会开始执行OSCtxSw(),最后,需要验证OSIntCtxSw()和OSTickISR()函数。

       当上述的这些测试步骤都成功后,可以尝试运行一些具体的任务,按照由简到繁的过程不断使测试变得复杂,来进一步验证内核的稳定性和系统性能。

       这里建立了一个简单的LED灯闪烁控制任务,其代码如下:
 

 

      

       加载后,LED灯闪烁控制正常,则测试成功,内核正常运转,若测试出现问题,就要认真找出问题所在,不可忽略硬件的问题,还有编译器等,当然也可以采用其他的测试,如串口的测试等。

       5 结语

       以上所述为μC/OS-Ⅱ在ARM7上移植的通用方法,但针对不同的处理器还需要作适当的修改,RTOS是当今嵌入式应用的热点,应用RTOS,可以提高产品的可靠性,降低研发周期,其中μC/OS-Ⅱ具有很好的实时性和很小的代码量,占用空间少,执行效率高,移植方法相对简单,因此掌握μC/OS-Ⅱ的移植方法是相当重要的。
 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

北京2024年5月20日 /美通社/ -- 过去五年里,支付和收款方式日新月异,其发展和变化比过去五十年都要迅猛。从嵌入式数字商务的出现,到"一拍即付"的...

关键字: VI BSP PAY COM

助力科研与检测新突破 上海2024年5月15日 /美通社/ -- 全球知名的科学仪器和服务提供商珀金埃尔默公司今日在上海举办了主题为"创新不止,探索无界"的新品发布会,集中展示了其在分析仪器领域的最...

关键字: 质谱仪 BSP DSC 气相色谱

上海2024年5月16日 /美通社/ -- 2024年5月10日至5月13日,富士胶片(中国)投资有限公司携旗下影像产品创新力作亮相北京P&E 2024。在数码相机展览区域,全新制定的集团使命"为世界绽...

关键字: 富士 数码相机 影像 BSP

贝克曼库尔特目前已成为MeMed Key免疫分析平台和MeMed BV检测技术的授权经销商 在原有合作的基础上,继续开发适用于贝克曼库尔特免疫分析仪的MeMed BV检测 加州布瑞亚和以色列海法2024年5月16日...

关键字: BSP IO 检测技术 免疫分析仪

英国英泰力能的燃料电池是可产业化的产品解决方案 英国首个专为乘用车市场开发的燃料电池系统 在 157kW 功率下,此燃料电池比乘用车的其他发动机更为强大 &...

关键字: ENERGY INTELLIGENT 氢燃料电池 BSP

深爱人才,共赴"芯"程 深圳2024年5月15日 /美通社/ -- 5月11日,深圳国资国企"博士人才荟"半导体与集成电路产业专场活动在深圳市重投天科半导体有限公司(简...

关键字: 半导体 集成电路产业 BSP 人工智能

武汉2024年5月15日 /美通社/ -- 北京时间4月26日-5月4日,2024 VEX 机器人世界锦标赛于美国得克萨斯州达拉斯市举办。本届 VEX 世锦赛为期九天,设有 VIQRC 小学组/初中组、V5RC 初中组/...

关键字: 机器人 BSP RC POWERED

上海2024年5月15日 /美通社/ -- 由生成式人工智能(AI)驱动的临床阶段生物医药科技公司英矽智能宣布,与复星医药(600196.SH;02196.HK)合作开发的潜在"全球首创"候选药物IS...

关键字: ISM BSP PC 人工智能

上海2024年5月13日 /美通社/ -- 5月8日,浦东新区国资委组织陆家嘴集团等9家区属企业与立邦中国召开合作交流会,旨在贯彻落实浦东新区区委、区政府工作要求,进一步放大进博会溢出带动效应,持续扩大区属企业与进博会重...

关键字: BSP 数字化 自动化立体仓库 智慧园区

上海2024年5月13日 /美通社/ -- 在数字化时代,高效的税务管理和ERP系统成为企业发展的关键。为了满足这一需求商应信息科技与Exact Software 易科软件就金四全电票税系统与ERP系统集成及商务合作建立...

关键字: AC 软件 BSP 数字化
关闭
关闭