- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OSAL zigbee实时操作系统
OSAL
一、概述?
OSAL(Operating System Abstraction Layer),翻译为“操作系统抽象层”,OSAL就是以实现多任务为核心的系统资源管理机制。所以OSAL与标准的操作系统还是有很大的区别的。简单而言,OSAL实现了类似操作系统的某些功能,但并不能称之为真正意义上的操作系统。
二、OSAL系统的初始化
首先在main()中调用OSAL初始化函数Init_Osal(),在Init_Osal()中通过调用osal_init_system()来进行初始化OSAL,在调用osal_init_system()过程中关闭所有中断。
在osal_init_system()中包括了内存、定时器、任务初始化、添加任务和初始化添加的任务等。(分别为函数osal_mem_init();osalTimerInit();osalTaskInit(); osalAddTasks();osalInitTasks();osal_mem_kick();)
现在我们先进行OSAL系统任务是如何运行的进行分析。关于任务初始化中主要用到?osalTaskInit(); osalAddTasks();osalInitTasks();这三个函数。
osalTaskInit()函数的功能是将任务头指针tasksHead置零,有效任务指针activeTask置零,并且初始化任务ID变量taskIDs 为零。
??? osalAddTasks()函数的功能是添加所有的任务,所谓的添加任务就是在系统内存空间(此部分关于内存的操作将放到最后进行说明)中申请一段空间用于存储任务的结构变量osalTaskRec,按照链表的形式存储所有的任务结构变量,此结构变量中将存储所有任务所需要的信息。通过调用osalTaskAdd()依次添加每个任务。添加任务有三个作用的参数,他们分别是:pfnInit、pfnEventProcessor和taskPriority(任务初始化函数地址、任务处理函数地址和任务的优先级)而taskID参数则是系统通过osalAddTasks()函数随机给分配的。因此编写初始化任务之前必须先编写任务的相关函数(初始化和处理函数)备注:任务处理函数是负责处理传递给此任务的事件,比较重要,具体将在本文的后面进行分析。
osalInitTasks()函数的功能是依次调用所有任务的初始化函数,进行初始化。一般都在任务初始化函数中将系统分配的taskID赋值给任务ID全局变量这样在设置任务时方便使用这个任务ID全局变量来传递参数和识别。
三、OSAL系统的运行
还是先从mian()函数中来寻找OSAL系统运行的蛛丝马迹,轻易的就能找到osal_start_system();这个函数。分析此函数就能大概明白OSAL系统是如何运行的了,首先是定义一个定时器中断,每隔一定的时间产生一次中断,这里使用的是看门狗定时器中断。(这个定时器中断是很重要的,它相当于OSAL系统的时钟,每隔一定的时间进行一次系统的刷新,而后判断任务和时间是否激活,激活的话转入相应的函数进行处理。)紧接着会看到一个for(;;){},这是一个死循环,可以得出程序将一直在这个循环中运行,这段代码的主要功能是:调用osalNextActiveTask()函数判断是否有事件产生,如果有的话返回系统内存空间中相应任务地址,而后读取事件标识并清该事件标识,最后调用相应任务的处理函数,并传递事件标识号,处理相应的事件。那么系统是如何设置事件标识的呢?
一、熟悉单片机的都应该知道中断,既然程序将始终在for(;;){}中循环,唯一的方式就是通过中断,在中断程序中调用函数进行事件标识的设置。上文中已经提到过定时器中断(看门狗定时器)在此中断中调用osal_set_event()传递参数:TaskID和EVENT标识,这样将设置相应任务并且设置任务中的事件标识,在for(;;){}中就能读取到有事件产生。
二、上面这种方式比较直接,另一种也是通过中断,但是不是直接调用osal_set_event()来设置任务事件,而是通过定时器这样经过一定的延时后才设置任务事件的。这里涉及到OSAL系统中的定时器,这是软件级的定时器,并非单片机上硬件定时器的概念。但是这个软件定时器也是通过上文提到的定时器中断(看门狗定时器)提供的基本时间来进行定时的。白话点就是:当定时器中断(看门狗定时器)产生时,调用一次软件定时器。即调用osal_update_timers();-osalTimerUpdate( tmr_decr_time )。
osalTimerUpdate()函数的主要功能是:通过传递的参数更新OSAL系统时间即osal_systemClock += updateTime;而后判断定时器链表中是否有
您可能关注的文档
- HP-DL380G4服务器安装指导.doc
- Hadoop期末整理.doc
- GPS帧格式说明.doc
- HIGH TEMPERATURE HECK COUPLING.doc
- ICC(A)中英文对照.doc
- I believe that I always have a choice.doc
- IMAX B6中文说明书.doc
- imax-B6 操作说明.doc
- IMAX B6说明书.doc
- IMDB网站电影评分TOP 100排名.doc
- Over Current Protection Using an Existing Crowbar Circuit.doc
- Pale Blue Dot.doc
- PA统计学词汇.doc
- PCB元件封装代码.doc
- Parser Generator配置说明.doc
- PeproTech公司 ELISA操作指南视频(视屏地址、字幕及翻译).doc
- Performance monitoring of SISO control loops subject to LTV disturbancedynamics improvedLTIbenchmark.doc
- Photoshop 滤镜 中英文对照.doc
- platform_device 和 platform_driver 流程简介.doc
- PFC电路.doc
文档评论(0)