预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共19页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

将TIzigbee开源协议栈中的OS操作系统移植出来 本人从事zigbee的研发工作已接有多年,在这几年的技术之路上收获了很多,也失去了很多。几年之后,离开了zigbee研发岗位,决定写点什么作为纪念,另外也希望给后来的学习zigbee的同盟们留下一点“砖块”。不复杂的小系统一般设计成如图1所示的样子,这种系统一般称作为前后台系统或超循环系统。整个应用程序(整个工程)是一个无限循环,对于应用中的具体操作既是在这个无限循环中不停地调用各个相应的函数来实现,这部分可以叫做后台行为。后台也叫做任务级。前台也叫中断级。要求实时响应的操作一般由中断服务来保证。如果前后台程序需要修改,原先整体的循环会被打乱的凌乱不堪,循环的时序也会受到影响,从而也就不能保证修改后的程序继续能够正常无误工作。这样就给中大型程序的升级,应用的增加,工程的管理带来的不可避免的麻烦,最坏的情况就是一个程序的升级相当于一个工程的重新编写。 图1此时就需要引进操作系统了,有了操作系统后,整个工程可以被划分成许多小的模块(任务)互相协调合作共同完成整个项目,程序修改或者升级时只需要修改对应的任务即可完成,不必改动整个工程,这是笔者认为在使用操作系统时最显而易见的好处。另外,使用操作系统使得程序的各个功能模块化,利用各种调度方法(不同操作系统可能不同)实现整个工程,从而也使得大型的程序、杂乱无章的循环变的尽然有序,程序运行更加安全可靠。现在在嵌入式领域被广泛关注和认同的操作系统有uCOS,linux,windowsCE,UCLINUX,等等,据笔者了解(才疏学浅),应用于8位单片机并得到了实践证明的暂时听说了UCOS以及RTX51就是KEIL公司针对51开发的一个小型RTOS。RTOS只提供了库接口函数,对于学者和开发者并不开源,所以使用者和探讨者的人数相对于UCOS并不多,UCOS是一款开源的实时操作系统,UCOS一直受到学者和开发者的青睐,但是由于任务中加入ucos操作系统后编译所占用的code区以及XDATA区增大较多,不适合移植到小容量的单片机上使用。笔者有幸于2008年接触到TI公司应用与zigbee协议栈的一款非抢占操作系统,下面将其叫做LTOS(littleTIOSorLiTieOS),由于它应用简单方便,,开发项目稳定可靠,便于理解和学习,使得操作系统初学者可以很容易的对操作系统整体有一个全面的了解,所以笔者决定将该操作系统移植出来,放入STC12C60S2单片机中使用。记录下该文档抛砖引玉,使更多人能更快地理解该操作系统并得到的该小型操作系统更好的发展和应用。一:对TI操作系统初步分析1.1任务、事件、消息刚拿到TI-MAC1.2.1时被该程序搞蒙了,TI-MAC1.2.1的程序竟然是基于他们自己编写的OS操作系统运行的。说到LTOS操作系统,不得不说说他的任务、事件和消息机制。据笔者理解,任务就是程序编写员将预实现的功能分成不同的模块,这些模块之间分工明确并且相互合作,共同完成程序员预完成的某个项目的整个功能;事件是这些任务中要处理的某个小功能的口令,比如老师说张三你站起来或坐下,张三听到站起来就站起来,听到坐下就坐下,同样道理,某个任务得到处理器后,先判断自己的事件是什么,如果是URAT_Writer则任务知道是串口写;而如果是LED_STOP,则任务知道是小灯停;消息是任务之间相互通信的方式,任务之间的数据传输一是通过消息来实现,二是通过延时设置任务来完成。任务内部消息就是一个系统事件。在进入LTOS系统前,先利用osal_init_system()等初始化程序将操作系统初始化,主要功能就是内存分配函数的初始化、定时器的初始化以及为任务的加入。任务初始化时将任务按预先设定分配了不同的优先级,LTOS系统按照赋值的优先级顺序从高到底不停的扫描这些任务,查看他们是否被设置了事件,如果该任务被设置了事件,则操作系统将马上进入这个该任务对应的pFnEventProcessor(处理任务函数)中执行该任务中的事件。初始化和任务加入完成之后就开始进入任务调度函数osalNextActiveTask(void)。进入任务调度函数首先扫描定时器和串口,查看定时器和串口的变化,然后利用osalNextActiveTask()函数查看任务列表中是否有被设置了事件的任务。以下是该函数的原型:osalTaskRec_t*osalNextActiveTask(void){osalTaskRec_t*srchTask;//StartatthebeginningsrchTask=tasksHead;//Whenfoundornotwhile(srchTask){if(srchTask->events){//判断最高优先级中有无事件returnsrchTask;}srchTa