您的位置 首页 报告

uC/OS操作系统使用剖析

一. uC/OS-II的移植移植uC/OS对目标处理器有一定要求,这个可以参照>一书中第8章的内容.整个嵌入式系统分为两大层:硬件层和软件层.这里主要研究软件

一. uC/OS-II的移植

移植uC/OS对方针处理器有必定要求,这个能够参照>一书中第8章的内容.

整个嵌入式体系分为两大层:硬件层和软件层.这儿首要研讨软件层的架构.

软件层首要分为四个部分:实时操作体系内核,与处理器相关部分,与运用相关部分,用户的运用体系.

l 实时操作体系内核

实时操作体系对体系资源进行办理。首要包含使命分配和调度、体系时钟服务、内存办理、音讯机制、反常处理等等。uC/OS一切体系服务均由内核供给。内核将运用体系和底层硬件结组成一个完好的实时体系。

移植的时分内核是不变的,开发者依据自己运用体系的需求来挑选实时操作体系内核,开发者不能对内核随意拜访,只能运用内核供给的功用服务来开发自己的运用体系。内核确认,那么所供给的体系办理能力,体系服务也就得到了限制。开发者只能在规则的范围内对体系作些改动.

2 与处理器相关的代码

这是移植中最要害的部分.内核将运用体系和底层硬件有机的结组成一个实时体系,要使同一个内核能适用于不同的硬件体系,就需求在内核和硬件之间有一个中间层,这便是与处理器相关的代码.处理器不同,这部分代码也不同.

咱们在移植时需求自己处理这部分代码,能够自己编写,也能够直接运用现已成功移植的代码.

在uC/OS中这一部分代码分红三个文件:OS_CPU.H, OS_CPU_A.ASM, OS_CPU_C.C

1) OS_CPU.H

包含了用#define界说的与处理器相关的常量,宏和类型界说.

详细来讲有体系数据类型界说,栈增加方向界说,关中止和开中止界说,体系软中止的界说等等.

2) OS_CPU_A.ASM

这部分需求对处理器的寄存器进行操作,所以有必要用汇编语言来编写.包含四个子函数:OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR().

OSStartHighRdy ()在多使命体系发动函数OSStart()中调用.完结的功用是:设置体系作业标志位OSRunning = TRUE;将安排妥当表中最高优先级使命的栈指针Load到SP中,并强制中止回来.这样安排妥当的最高优先级使命就好像从中止里回来到作业态相同,使得整个体系得以作业.

OSCtxSw()在使命级使命切换函数中调用的.使命级切换是经过SWI或许TRAP人为制作的中止来完结的.ISR的向量地址有必要指向OSCtxSw().这一中止完结的功用:保存使命的环境变量(首要是寄存器的值,经过入栈来完结),将当时SP存入使命TCB中,载入安排妥当最高优先级使命的SP,康复安排妥当最高优先级使命的环境变量,中止回来.这样就完结了使命级的切换.

OSIntCtxSw()在退出中止服务函数OSIntExit()中调用,完结中止级使命切换.由所以在中止里调用,所以处理器的寄存器入栈作业现已做完,就不用作这部分作业了.详细完结的使命:调整栈指针(由于调用函数会使使命栈结构与体系使命切换时仓库规范结构不共同),保存当时使命SP,载入安排妥当最高优先级使命的SP,康复安排妥当最高优先级使命的环境变量,中止回来.这样就完结了中止级使命切换.

OSTickISR()体系时钟节拍中止服务函数,这是一个周期性中止,为内核供给时钟节拍.频率越高体系负荷越重.其周期的巨细决议了内核所能给运用体系供给的最小时刻距离服务.一般只限于ms级(跟MCU有关),关于要求愈加严苛的使命需求用户自己树立中止来处理.该函数详细内容:保存寄存器(假如硬件主动完结就能够省掉),调用OSIntEnter(),调用OSTimeTick(),调用OSIntExit(),康复寄存器,中止回来.

3) OS_CPU_C.C

UC/OS中共界说了6个函数在该文件中.可是最重要的是OSTaskStkInit().其他都是对体系内核的扩展时用的.

OSTaskStkInit()是在用户树立使命时体系内部自己调用的,对用户使命的仓库进行初始化.使树立好的进入安排妥当态使命的仓库与体系产生中止而且将环境变量保存结束时的栈结构共同.这样就能够用中止回来指令使安排妥当的使命作业起来.

详细的入栈方法要依据不同mcu而定.需求参阅用户运用的mcu说明书.一起还要考虑mcu的栈生成方法.这需求依据详细问题来剖析,在此不做过多论说.

3 与运用相关的代码

这一部分是用户依据自己的运用体系来定制适宜的内核服务功用.包含两个文件:OS_CFG.H, INCLUDES.H.

OS_CFG.H来装备内核,用户依据需求对内核进行定制,留下需求的部分,去掉不需求的部分,设置体系的根本情况.比方体系可供给的最大使命数量,是否定制邮箱服务,是否需求体系供给使命挂起功用,是否供给使命优先级动态改动功用等等.

INCLUDES.H体系头文件,整个实时体系程序所需求的文件,包含了内核和用户的头文件.

4 用户运用体系

这是整个实时体系的最高层,用户经过使用实时操作体系供给的服务来开发自己的详细程序.

二. 用户运用体系编写的方式

kernel供给给用户一些功用函数,使得用户的体系树立愈加便利,可是kernel内部不会处理用户的作业,关于整个体系的详细运用作业还得需求用户自己去考虑,怎么使用好这些功用服务函数就成为一个比较重要的问题.

1. main函数的结构

void main (void)

{

初始化体系的硬件;

OSInit();

使命的树立,音讯机制的树立;

OSStart();

}

这儿需求的是在OSStart()履行之前不得发动中止,硬件体系还不能作业.有必要先让软件体系进入作业状况后才行.

2. 中止的结构

ISR:

{

保存处理器寄存器的值;

调用OSIntEnter();

履行用户的作业;

调用OSIntExit();

康复处理器寄存器的值;

RTI;

}

用户的中止方式和曾经相同,没有什么大的改变,仅仅是在本来用户ISR的基础上在固定的方位加了两个函数:OSIntEnter(), OSIntExit().

3. 各个使命的结构

void YourTask (void)

{

for(;;)

{

用户代码

调用的体系服务

}

}

在使命发动函数履行完后,体系会切换到最高优先级的使命去履行,此刻,能够将体系硬件部分的发动放在该使命的最前边,仅仅是发动时履行一次,首要是发动体系的节拍中止,或许一些有必要在多使命体系调度后才干初始化的部分,使体系的真实开端作业,到达软件硬件的根本同步.

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部