ucos_ii移植过程详解(移植原理)

ucos_ii移植过程详解(移植原理)

ID:40574346

大小:45.50 KB

页数:6页

时间:2019-08-04

ucos_ii移植过程详解(移植原理)_第1页
ucos_ii移植过程详解(移植原理)_第2页
ucos_ii移植过程详解(移植原理)_第3页
ucos_ii移植过程详解(移植原理)_第4页
ucos_ii移植过程详解(移植原理)_第5页
资源描述:

《ucos_ii移植过程详解(移植原理)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、uCOS-II移值过程实例讲解我将uCOS-II移植到了EPONS的C33209的平台上,接下来我就基于我移植好的代码讲解如何将uCOS-II从一种MCU移植到另一种MCU。首先介绍uCOS-II的文件,如下表:ucos_ii.hos_cfg.hos_cpu.hos_core.cos_dbg_r.cos_flag.cos_mbox.cos_mem.cos_mutex.cos_q.cos_sem.cos_task.cos_time.cucos_ii.cos_cpu_c.cos_cpu_a.asm其中我们和硬件平台相关的文件的文件名被加粗了,也就是说若要将uCOS-II移

2、植到新的平台上只要关心以上四个文件就行了。当然你也可以根据需要再添加你自己的和平台相关的文件,事实上我也是这么做的。在我移植的例子中就添加了四个和平台相关的文件,文件如下表:crt0.cdrv_rtc.cvector.cext.scrt0.c是用来初始化系统的比如说MCU的一些特殊寄存器、设置外围的总线接口,等。drv_rtc.c是用来初始化系统中的一个RTC的,这个RTC可以为内核提供必要的基于时间片调度的时基。同时提供了对RTC开始和停止的操作函数。在我的例子中RTC会每秒产生32次中断。vector.c顾名思义,它是系统上电后为系统提供矢量入口表的文件,当然也包

3、括中断向量表。ext.s是为uc/OS-II提供OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()函数的具体实现以及在用户程序的中断函数出入时要调用的状态保护和状态恢复函数OS_SAVEALL()和OS_RESTOREALL()。前面两个函数的功能是:OS_ENTER_CRITICAL()屏蔽中断;OS_EXIT_CRITICAL()恢复原来的中断使能状态。1.os_cpu_a.asm的说明要想顺利的移植首先要了解uCOS-II的一些基本概念。uCOS-II实质上是一个嵌入式操作系统内核,她只负责管理各个任务,为每个任务分配CPU时间,并且负

4、责任务之间的通讯。内核提供的基本服务是任务切换。这是个很重要的概念,可以说你只要掌握了任务切换的本质,可以说你就掌握了移植uCOS-II的技术。至于任务之间的通讯他们是建立在任务切换之上的或者说和系统平台关系不大(当然这也和操作系统通讯机制的实现相关,至少uCOS-II是这样的)。接下来我们就有针对性的介绍什么是uCOS-II里的任务。一个任务通常是一个无限循环,如下程序所示。voidTask1(void*data){INT8Uerr;char*rxmsg;data=data;/*Preventcompilerwarning*/while(1)//这是一个无限循环{r

5、xmsg=(char*)OSMboxPend(MAIL1,0,&err);/*WaitformessagefromTask#2*/OSTimeDlyHMSM(0,0,1,0);/*Wait1second*/OSMboxPend(MAIL3,0,&err);/*WaitformessagefromTask#3*/OSMboxPost(MAIL2,(void*)1);/*Acknowledgereceptionofmsg*/}}可以通过内核的专用函数来建立、删除、挂起、激活任务,在这里我们的重点在如何移植,所以具体的使用方式和原理可以看JEANJ.LABROSSE著、邵贝

6、贝译的《uCOS-II—源码共开的实时嵌入式系统》一书。(1).OSCtxSw()函数在上面的例子里你也看到了任务和其他的C函数一样,有函数的返回类型,有形式参数变量,只是任务是绝不会返回。事实上任务也就是一个函数,内核在调度时是以这个函数为基础的,为了和其他函数区分,我们给了她另外一个名字——任务。也正因她是一个特殊的函数,而且和内核调度直接相关,所以不能随便返回和被用户调用,而要用内核的专用函数来“建立”和“删除”。所谓的“建立任务”其实是在内核处对该函数进行注册和相关数据结构的填充,比如该函数的入口地址、为函数分配专门的堆栈空间(为什么要为函数分配专门的地址空间

7、呢?我们马上就会谈到)。“任务调度”就是根据情况(比如时间片被用完),来调用另一个被称为任务的函数(我们暂时称之为函数TA),同时停止当前的一个任务(其实也是一个函数,我们称之为TB)。问题出来了,若内核象普通函数那样直接调用TA,那么当内核要重新调用TB时怎么知道刚才TB执行到哪里了呢?若内核为TA和TB分配专用的两块空间,当内核要调用其他任务(其实就是函数)的时候先将当前任务(函数)运行的地址和状态保存起来,然后当要返回前再恢复,当然每个被称之为任务的函数都要有自己独立的保存运行地址和状态的空间,以免混乱。那问题就很好解决了。这也就是为什么任务都

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。