您的位置 首页 软件

根据μC/OS-II操作系统实现在P89V51RD2微控制器上运转

基于μC/OS-II操作系统实现在P89V51RD2微控制器上运行-μC /OS-II是一个完整的、可移植、可固化、可裁剪的占先式实时多任务内核。μC/OS-II绝大部分的代码是用ANSI的C语言编写的,包含一小部分汇编代码,使之可供不同架构的微处理器使用。至今,从8位到6 4位,μC/OS-II已在超过40种不同架构上的微处理器上运行。μC/OS-II已经在世界范围内得到广泛应用,包括很多领域, 如 手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制上。实际上,μC/OS-II已经通过了非常严格的 测试,并且得到了美国航空管理局(Federal Aviation Administration)的认证,可以用在飞行器上。这说明μC/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safety critical)系统。除此以外,μC/OS-II 的鲜明特点就是源码公开,便于移植和维护。

自嵌入式体系开发以来,很长时刻都选用前后台体系软件规划形式:主程序为一个无限循环,单使命次序履行。经过设置一个或多个中止来处理异步事情。

这种体系关于简略的运用是能够的,但关于实时性要求比较高的、处理使命较多的运用,就会暴露出实时性差、体系牢靠性低、安稳性差等缺陷。

μC/OS-II 是一种依据优先级的抢占式多使命实时操作体系, 包含了实时内核、使命办理、时刻办理、使命间通讯同步(信号量,邮箱,音讯 行列)和内存办理等功用。它能够使各个使命独立作业,互不干涉,很简略完结按时并且无误履行,使实时运用程序的规划和扩展变得简略,使运用程序的规划进程大为减化。并且它内核源代码揭露,可移植性强,为编程人员供给了很好的一个软件渠道。经过μC/OS-II在P89V51RD2 上的移植,能够把握移植和测验μC/OS-II 的本质内容,很简略将其移植到其它的CPU渠道上。

μC/OS-II 介绍

μC /OS-II是一个完好的、可移植、可固化、可裁剪的占先式实时多使命内核。μC/OS-II绝大部分的代码是用ANSI的C言语编写的,包含一小部分汇编代码,使之可供不同架构的微处理器运用。至今,从8位到6 4位,μC/OS-II已在超越40种不同架构上的微处理器上运转。μC/OS-II现已在世界范围内得到广泛运用,包含许多范畴, 如 手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业操控上。实际上,μC/OS-II现现已过了非常严厉的 测验,并且得到了美国航空办理局(Federal Aviation AdministraTIon)的认证,能够用在飞行器上。这说明μC/OS-II是安稳牢靠的,可用于与人性命攸关的安全重要(safety criTIcal)体系。除此以外,μC/OS-II 的鲜明特点便是源码揭露,便于移植和维护。

μC/OS-II 内核结构

多使命体系中,内核担任办理各个使命 ,或者说为每个使命分配CPU 时刻 ,并且担任使命之间的通讯。内核供给的根本服务是使命切换。 μC/OS-II能够办理多达64个使命。因为它的作者占用和保留了8个使命,所以留给用户运用程序最多可有56个使命。赋予各个使命的优先级有必要是不相同的。这意味着μC/OS-II不支撑时刻片轮转调度法(round-robin scheduli ng)。μC/OS-II为每个使命设置独立的仓库空间,能够快速完结使命切换 。μC/OS-II近似地每时每刻总是让优先级最高的安排妥当使命处于运转状况,为了确保这一点,它在调用体系API 函数、中止结束、守时中止结束时总是履行调度算法,μC/OS-II经过事前核算好数据简化了运算量,经过精心规划安排妥当表结构使得延时可预知。

P89V51RD2微处理器介绍

P89V51RD2是Philips公司出产的一款80C51微操控器,包含64KB Flash和1024字节的数据RAM。P89V51RD2的典型特性是它的X2办法选项。运用该特性,规划者可使运用程序以传统的80C51时钟频率(每个机器周期包含12个时钟)或X2 办法(每个机器周期包含6个时钟)的时钟频率运转,挑选X2办法可在相一起钟频率下取得2倍的吞吐量。从该特性获益的另一种办法是将时钟频率折半来坚持特性不变,这 样能够极大地下降EMI。FLASH程序存储器支撑并行和串行在体系编程(ISP),ISP答应在软件操控下对制品中的器材进行重复编程。运用固件的 产生/更新才能完结了ISP的大范围运用。 5V的作业电压,操作频率为0~40MHz。P89V51RD2的资源和ISP的功用使得它很合适用来做μC/OS-II的移植调试。并不需求购买仿真器编程器等额定出资。

μC/OS-II 的移植

移植便是使μC/OS-II能在P89V51RD2上运转。为了便利移植,大部分的μC/OS-II的代码是用C言语编写的;可是仍需求用C言语和汇编言语编写一些处理器硬件相关的代码,这是因为μC/OS-II在读/写处理器寄存器时,只能经过汇编言语来完结。因为μC/OS-II在设计时就现已充分考虑了可移植性,所以μC/OS-II的移植相对来说是比较简略的。

硬件渠道构成

因为P89V51RD2是一款80C51微操控器,片内包含了64KB的FLASH程序存储器,并且支撑串行在线编程(ISP)。使它在ROM空间上很合适做μC/OS-II的移植。可是它片内RAM空间很有限,只要1KB,不能满意μC/OS-II对RAM的要求。可是因为P89V51RD2能够扩展RAM空间,使这一问题得以处理。咱们为它扩展了一片32KB的RAM来构成移植μC/OS-II的硬件渠道。这样P89V51RD2就满意了移植μC/OS-II的一切要求。

编译器的挑选

因为μC/OS-II绝大部分代码是用规范的C言语编写的,所以C言语开发东西关于μC/OS-II是必不行少的。因为μC/OS-II是一个可掠夺行的占先式内核,所以要求C编译器能够产生可重入型代码。笔者挑选Keil C51集成开发环境作为开发东西。该开发东西有C编译器,汇编器和链接定位器等东西构成。链接器用来将不同模块(编译过或汇编过的文件)链接成方针文件,定位器则答应将代码和数据放置在方针处理器的指定内存中。Keil C51 还能够生成HEX格局的编程文件用于编程EPROM或是FLASH,一起能够完结完好软件仿真支撑。Keil C51支撑一切8051变种的微操控器。经过设置编译操控选项,它完全能够满意编译μC/OS-II源代码的要求。

可重入函数问题

可重入函数能够被一个以上的使命调用,而不必忧虑数据被损坏。可重入函数任何时候都能够被中止,一段时刻后又能够持续运转,而相应的数据不会丢掉。因为μC/OS-II是抢占式的实时多使命内核,同一个函数或许会被不同的使命调用,也或许会被中止,因而,移植μC/OS-II要求C言语编译器能够产生可重入函数。可是正常情况下Keil C51编译器中的函数不能重入。原因是因为8051系列微操控 器的硬件仓库很小,硬件仓库指针SP最多只能在内部256字节的RAM内移动,不能够指向64K的外部RA M空间。所以编译器运用固定的RAM地址来存储函数的参数和局部变量,而不是运用仓库来存储。为了在Keil C51中完结可重入函数,能够运用“reentrant”关键字声明该函数是可重入的。编译器可依据编译形式为可重入函数在内部RAM或外部RAM空间拓荒一个模仿仓库来存储可重入函数的参数和局部变量。可重入函数的回来地址依然保存在硬件仓库中。Cx51编译手册不引荐运用模仿仓库,原因是受8051寻址办法的约束,模仿仓库拜访的功率很低。可是这是在Keil C51中完结可重入函数的仅有办法。可重入函数模仿仓库具有独立于硬件仓库指针的模仿仓库指针。模仿仓库及其指针在发动代码文件“STARTUP.A51”中界说和初始化。

μC/OS-II源文件移植

在了解了P89V51RD2微处理器和Keil C51 编译器的技术细节的基础上,就能够开端μC/OS-II源文件移植的作业了。真实编写移植代码的作业就相对比较简略了。图1标明了依据μC/OS-II的运用的体系结构结构。由图1能够看出因为μC/OS-II自生的绝大部分代码是运用ANSI C编写的,并且代码的层次结构非常洁净,与渠道相关的移植代码仅仅存在于OS_CPU_A.ASM、OS_CPU_C.C以及OS_CPU.H这三个文件傍边。下面别离解说各个文件在P89V51RD2上的移植。

依据μC/OS-II操作体系完结在P89V51RD2微操控器上运转

μC/OS-II中与处理器CPU 类型无关的代码:uCOS_II.H和uCOS_II.C,其间uCOS_II.C 文件包含以下文件:OS_CORE.C OS_TASK.C OS_TIME.C OS_SEM.C OS_MBOX.C OS_MUTEX.C 和OS_FLAG.C 也便是说原则上这些文件能够直接增加不必修正。可是因为Keil C51编译器的特殊性,这些代码仍要多处改动,因为Keil C51缺省情况下编译的代码不行重入而多使命体系要求并发操作导致重入,所以要在每个C 函数及其声明后标示reentrant 关键字,别的“pdata” 和“data” 在uCOS顶用做一些函数的形参,但它一起又是Keil C51 的关键字,会导致编译过错。我经过把“pdata”改成“ppdata”,“data”改成“ddata”处理了此问题。OSTCBCur、OSTCBHighRdy、OSRunning、OSPrioCur、OSPrioHighRdy 这几个变量在汇编程序顶用到了,为了运用寄存器R0或R1拜访而不必DPTR,应该用Keil C51扩展关键字IDATA将它们界说在内部RAM中。

OS_CPU.H的移植

OS_CPU.H包含了用#define句子界说的、与处理器相关的常数、宏及类型。因为不同的处理器有不同的字长,所以μC/OS-II的移植包含的一系列数据类型界说,以确保其可移植性。μC/OS-II代码不运用言语中的short,int,及long等数据类型,因为它们是与编译器相关的,是不行移植的。选用界说的整形数据结构等既是可移植的,又很直观。参阅Cx51编译手册,能够完结OS_CPU.H里一切数据类型的界说。

与一切的实时内核相同,μC/OS-II需求先关中止,再处置临界段代码,并且在处置结束后重新开中止。这样能够维护临界段代码免受多使命或中止服务子程序的损坏。为了躲藏不同编译器供给的不同的关中止和开中止的完结办法,增强可移植性,μC/OS-II在OS_CPU.H中界说了2个宏,来开中止和关中止:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。依据P89V51RD2的结构和Keil C51供给的办法,咱们经过置位或清零中止答应位来完结。

代码如下:

OS_ENTER_CRITICAL() EA=“0”

OS_EXIT_CRITICAL() EA=“1”

MCS-51 仓库从下往上增加(1=向下0=向上) ,OS_STK_GROWTH 界说为0。

OS_TASK_SW() OSCtxSw() ,因为P89V51RD2没有软中止指令所以用程序调用替代。在用汇编言语编写的OSCtxSw()中,模仿体系产生中止时的仓库操作。以确保体系使命的正确切换。

OS_CPU_C.C的移植

μC/OS-II的移植要求用户在OS_CPU_C.C中编写10个简略的C函数。但仅有必要的μC/OS-II的移植要求用户在OS_CPU_C.C中编写10个简略的C函数。但仅有 必要的是OSTaskStkInit(),其他九个有必要声明,但不一定要任何程序代码。

OSTaskStkInit()是在体系创立使命时用来初始化使命仓库的,使仓库看起来就象中止刚产生相同,一切寄存器都保存在仓库中。因为P89V51RD2硬件仓库很小,最多只能有在内部RAM空间的256字节。因而很难将一切使命的仓库都用硬件仓库来完结。为了处理这个问题,咱们为每个使命在外部RAM空间都分配一段接连的存储区,用来模仿每个使命的仓库。

在μC/OS-II进行使命切换时,首先将P89V51RD2硬件仓库中的内容复制到要失掉CPU具有权的使命的外部模仿仓库区,然后即将得到CPU具有权的使命的外部模仿仓库中的有用数据复制到P89V51RD2的硬件仓库中。这样就完结了使命维护和切换。使命模仿仓库和硬件的仓库结构如图2所示。TCB 结构体中OSTCBStkPtr 总是指向用户仓库最低地址,该地址空间内寄存用户仓库长度,其上空间寄存体系仓库映像,即:使命模仿仓库空间巨细=体系硬件仓库空间巨细+1。SP 总是先加1再存数据,因而SP初始时指向体系仓库开端地址(OSStack)减1 处(OSStkStart)。很明显体系硬件仓库存储空间巨细=SP-OSStkStart。编写OSTaskStkInit()首要完结用户仓库初始化,从下向上顺次保存用户仓库长度(5),PCL, PCH,PSW, AC C,B, DPL, DPH,R0,R1, R2,R3,R4,R5,R6,R7。不保存SP,使命切换时依据用户仓库长度核算得出。紧接着的两字节保存可重入函数仿真仓库的指针X_CP的高8位和低8位,初始化为使命模仿栈的最高地址的高8位和低8位。OSTaskStkInit()总是回来使命模仿栈的最低地址。

依据μC/OS-II操作体系完结在P89V51RD2微操控器上运转

OS_CPU_A.ASM的移植

OS_CPU_A.ASM的移植要求用户编写4个简略的汇编言语函数:

OSStartHighRdy()

OSCtxSw()

OSIntCtxSw()

OSTickISR()

μ C/OS-II的发动函数OSStart()调用OSStartHighRdy()来使安排妥当态使命中优先级最高的使命开端运转,咱们经过将使命模仿栈的有用长度内的数据复制到体系硬件仓库,然后运用紧接着的两字节来改写X_CP的值。使可重入函数仿真仓库指针指向该使命模仿栈的最高地址,这样做是因为Keil C51运用的可重入函数仿真仓库的增加方向是向下的,和体系硬件仓库的增加方向相反。这样就完结了OSStartHighRdy()的移植。

OSCtxSw()和OSIntCtxSw()两个汇编函数的功用首要完结使命的切换。不同的是OSCtxSw()在使命级调用,而OSIntCtxSw()是在中止推出时调用。

关于在P89V51RD2上的移植而言,这两个函数的完结根本相同。仅仅OSIntCtxSw()在中止调用中 因为OSIntExit()和本身对硬件仓库的影响,需求即将保存的SP指针向下调整4个字节,以消除影响。μC/OS-II在需求使命切换时,依据CPU是否处在中止状况挑选调用其间一个函数。如图2仓库结构 所示,使命切换时先保存当前使命仓库内容,办法是:用SP-OSStkStart 得出保存字节数。

将其写入使命模仿仓库最低地址内。以使命模仿仓库最低地址为起址,以OSStkStart为体系硬件仓库起址,由体系仓库向用户仓库复制数据。循环SP-OSStkStart次,每次复制前先将各自栈指针增1。其次康复最高优先级使命体系仓库办法是:取得最高优先级使命用户仓库最低地址,从中取出长度。以最高优先级使命用户模仿仓库最低地址为起址,以OSStkStart 为体系仓库起址,由使命模仿仓库向体系仓库复制数据。循环“有用长度”数值指示的次数。每次复制前先将各自栈指针增1。

μC/OS-II要求用户供给一个周期性的时钟源,来完结时刻的推迟和超时功用。在P89V51RD2中咱们经过守时器T0来供给时钟源。频率设为50Hz。T0的初始化函数在OS_CPU_C.C完结。时钟节拍中止服务子程序的编写也很简略,示意性代码如下:

void OSTickISR(void)

{

保存处理器寄存器;

调用OSIntEnter();

守时器计数器重装;

调用OSTimeTick();

调用OSIntExit();

康复处理器寄存器;

履行中止回来指令;

}

μC/OS-II 移植代码的测验

完结μC/OS-II移植后,就要对移植的代码进行测验。测验移植的μC/OS-II是否能够完结使命调度、时刻办理、使命办理与同步等功用,是否能够发动多 使命环境。在P89V51RD2的移植中,编写简略的测验程序进行多使命的测验。测验程序创立了4使命,使命AA,BB,CC和LEDFlash优先级别离为2,3,4,5。使命AA延时一秒经过串口输出一次,使命BB延时3秒经过串口输出一次,使命CC延时6秒经过串口输出一次。

LedFlash等候信号量有用时,对P1.1口进行一次取反操作。P1.1衔接LED吵醒调查。守时器中止服务子程序守时宣布信号量。这样使命LedFlash完结LED的闪耀功用。

μC/OS-II测验程序的文件结构,硬件测验成果和Keil C51的软件仿真成果如图3所示。成果标明μC/OS-II在P89V51RD2上的移植是成功的。

依据μC/OS-II操作体系完结在P89V51RD2微操控器上运转

结语

经过μC/OS-II在P89V51RD2上的移植,把握了μC/OS-II内核的作业原理和移植办法,测验程序标明移植代码能够安稳牢靠的运转,完结了多使命的办理和调度。μC/OS-II实时操作体系的移入,不光能够进步体系的实时性、牢靠性和安稳性,还进步了运用软件的可移植性,下降了开发人员的作业

责任编辑:gt

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/95454.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部