ImageVerifierCode 换一换
格式:PDF , 页数:11 ,大小:282.18KB ,
资源ID:3209972      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3209972.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(OSAL系统框架.pdf)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

OSAL系统框架.pdf

1、1OSALOSAL 系统框架系统框架V1.0V1.02版本信息版本信息版本时间更新内容V1.02014.4.22发布3OSAL 的全称是 Operating System(OS)Abstraction Layer,是一个轻量级的操作系统,在 TI 公司的很多产品中,都采用了这套操作系统作为基本的平台,比如 ZStack,RemoTI,BLEStack 等等,所以掌握这套操作系统的基本运行原理,对理解 Zigbee 协议栈以及以后的应用开发都是非常有帮助的。首 先 从main函 数 的 主 循 环 开 始 入 手(main函 数 位 置:ProjectszstackZMainTI2530DB):

2、1 1、主循环任务处理机制主循环任务处理机制在开始之前,先解释两个重要的概念:任务(task)与事件(event)。1.11.1事件事件(event)(event)的概念的概念OSAL 操作系统以事件驱动为核心,所谓“事件”指的是操作系统管辖的设备及软件模块中所发生的“事情”,比如按键事件、定时中断事件、无线数据到达事件等等。操作系统的一个核心功能就是有效地管理这些“事件”,以保证所有事件得以正确完成。1.21.2任务任务(task)(task)的概念的概念在 OSAL 中,所有的“事件”会被安排到不同的“任务”里进行执行,比如按键、串口、LCD 等外设均被安排在 Hal 任务中,而无线数据的

3、底层收发则放在 mac 任务中等等。以一个简单的 OSAL 项目为例:macTaskInit(taskID+);nwk_init(taskID+);Hal_Init(taskID+);MT_TaskInit(taskID+);APS_Init(taskID+);APSF_Init(taskID+);ZDApp_Init(taskID+);ZDNwkMgr_Init(taskID+);SampleApp_Init(taskID);4在系统初始化代码中,初始化了 9 个任务,各自有一个 ID 号taskID。每个任务中又可以同时处理多个事件,通过一个核心处理函数来管理其下属的每一个事件:const

4、 pTaskEventHandlerFn tasksArr=macEventLoop,nwk_event_loop,Hal_ProcessEvent,MT_ProcessEvent,APS_event_loop,APSF_ProcessEvent,ZDApp_event_loop,ZDNwkMgr_event_loop,SampleApp_ProcessEvent;1.31.3主循环任务处理机制主循环任务处理机制主循环代码:void osal_start_system(void)#if!defined(ZBIT)&!defined(UBIT)for(;)/Forever Loop#endifo

5、sal_run_system();下面我们将针对 osal_run_system 函数处理机制进行解析:5注:为了便于直观,以下涉及到数据地址的地方都是由上而下,地址由高变低。主循环中的两个关键数组,*tasksEvents 与*tasksArr,从图一中我们可以看出来,tasksEvents这个数组存放的是从序号为 0 到 tasksCnt,表示每个任务在本次循环中是否要被运行。需要运行的任务其值非 0(用橙色表示),否则为 0。而 tasksArr 数组则存放了对应每个任务的入口地址,只有在 tasksEvents 中记录的需要运行的任务,在本次循环中才会被调用到。所以说,tasksEve

6、nts 数据存放的内容就是:本任务中是否有事件发生,有哪些事件发生。如果有事件发生,则执行本任务,否则直接跳到下一个任务中进行判断。当事件处理完成后,其对应的标志位会被清空,此后除非有新的事件发生,否则本任务不会再被执行。了解了上述基本机制后,我们来看一下主循环的代码解析:do if(tasksEventsidx)/寻找最高优先级的任务来运行break;while(+idx tasksCnt);if(idx timeout=0)osal_set_event(srchTimer-task_id,srchTimer-event_flag);.也就是说某个地方触发了一个软件定时器,当这个定时器到期时

7、,申请执行某事件。比如:当用户按键一秒钟后,执行打开 LED 灯的事件,就可以用这种方式来实现。那如何开始一个软件定时器呢?再看另外一个函数osal_start_timerEx先看下它的自我介绍/*fnosal_start_timerEx*brief*This function is called to start a timer to expire in n mSecs.*When the timer expires,the calling task will get the specified event.*parambyte taskID-task id to set timer for

8、*paramUINT16 event_id-event to be notified with*paramUNINT16 timeout_value-in milliseconds.*returnZSUCCESS,or NO_TIMER_AVAIL.*/byte osal_start_timerEx(byte taskID,UINT16 event_id,UINT16 timeout_value)也就是说,它会开始一个 timeout_value(ms)的计时器,当这个计时器溢出时,则会对taskID 这个 task,设置一个 event_id,让这个事件在后面的主循环中运行到。下面我们通过一

9、个图表来解释下这种机制:9这个表就是 osalTimerUpdate 函数的“任务表”,上面讲过这个函数给应用程序提供了“软计时”,就是体现在这里:osal_start_timerEx 通过 osalAddTimer 向链表里添加了“定时任务”,由 osalTimerUpdate 来以 ms 为单位对这些“软定时器”减计数,溢出时,即调用 osal_set_event,实现主循环里对任务事件的调用。二、通过消息机制调用事件二、通过消息机制调用事件这是另外一种设置事件(Set Event)的重要方式,下面我们以 ZStack 协议栈的基础例程GenericApp 来看一下按键是如何产生的,及如何

10、调用相应的接口程序。前文讲过,按键的相关处理都安排在了 HAL 的 task 当中,在 HAL 的核心处理函数Hal_ProcessEvent 中,有个 HalKeyPoll 的处理函数,在 HalKeyPoll 函数中,无论按键是ADC 方式,或者是扫描 IO 口的方式,最后都会生成一个键值 key,然后通过下面的语句来调用按键服务程序:/*Invoke Callback if new keys were depressed*/if(keys&(pHalKeyProcessFunction)(pHalKeyProcessFunction)(keys,HAL_KEY_STATE_NORMAL)

11、;这里调用的服务程序,在 InitBoard 中被初始化为 OnBoard_KeyCallback,这个函数又通过OnBoard_SendKeys 运行下面语句:10/Send the address to the taskmsgPtr=(keyChange_t*)osal_msg_allocate(sizeof(keyChange_t);if(msgPtr)msgPtr-hdr.event=KEY_CHANGE;msgPtr-state=state;msgPtr-keys=keys;osal_msg_send(registeredKeysTaskID,(uint8*)msgPtr);retu

12、rn(ZSuccess);下面我们就看下 osal_msg_send 是如何向上级应用程序发送消息的:在理解了消息量的数据链表后,再来理解 osal_msg_send 里的语句就不难了OSAL_MSG_ID(msg_ptr)=destination_task;/设置消息数据对应是属于哪个任务的11/将要发送的消息数据链接到以 osal_qHead 开头的数据链表中osal_msg_enqueue(&osal_qHead,msg_ptr);/通知主循环有任务等待处理osal_set_event(destination_task,SYS_EVENT_MSG);这样用户任务 GenericApp_P

13、rocessEvent 就收到一个按键的处理任务,并通过GenericApp_HandleKeys 来执行相应的操作。再来回顾一下这个按键的处理过程:任务驱动层 Hal_ProcessEvent 负责对按键进行持续扫描,发现有按键事件后 OnBoard_KeyCallback 函数向应用层 GenericApp_ProcessEvent发送一个有按键需要处理的消息,最终由 GenericApp_HandleKeys 来负责执行具体的操作。让我们再回到最初的问题,任务处理表 tasksEvents 是怎么被改动的呢?初始化程序、其他任务或者本任务主要通过下面几种方式对其操作:1、通过 osal_set_event 直接操作2、设置计时器,当其溢出时,触发事件处理3、直接通过任务间的消息传递机制触发

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1