OSAL系统框架.pdf

上传人:wj 文档编号:3439560 上传时间:2023-05-05 格式:PDF 页数:11 大小:282.18KB
下载 相关 举报
OSAL系统框架.pdf_第1页
第1页 / 共11页
OSAL系统框架.pdf_第2页
第2页 / 共11页
OSAL系统框架.pdf_第3页
第3页 / 共11页
OSAL系统框架.pdf_第4页
第4页 / 共11页
OSAL系统框架.pdf_第5页
第5页 / 共11页
OSAL系统框架.pdf_第6页
第6页 / 共11页
OSAL系统框架.pdf_第7页
第7页 / 共11页
OSAL系统框架.pdf_第8页
第8页 / 共11页
OSAL系统框架.pdf_第9页
第9页 / 共11页
OSAL系统框架.pdf_第10页
第10页 / 共11页
OSAL系统框架.pdf_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

OSAL系统框架.pdf

《OSAL系统框架.pdf》由会员分享,可在线阅读,更多相关《OSAL系统框架.pdf(11页珍藏版)》请在冰点文库上搜索。

OSAL系统框架.pdf

1OSALOSAL系统框架系统框架V1.0V1.02版本信息版本信息版本时间更新内容V1.02014.4.22发布3OSAL的全称是OperatingSystem(OS)AbstractionLayer,是一个轻量级的操作系统,在TI公司的很多产品中,都采用了这套操作系统作为基本的平台,比如ZStack,RemoTI,BLEStack等等,所以掌握这套操作系统的基本运行原理,对理解Zigbee协议栈以及以后的应用开发都是非常有帮助的。

首先从main函数的主循环开始入手(main函数位置:

ProjectszstackZMainTI2530DB):

11、主循环任务处理机制主循环任务处理机制在开始之前,先解释两个重要的概念:

任务(task)与事件(event)。

1.11.1事件事件(event)(event)的概念的概念OSAL操作系统以事件驱动为核心,所谓“事件”指的是操作系统管辖的设备及软件模块中所发生的“事情”,比如按键事件、定时中断事件、无线数据到达事件等等。

操作系统的一个核心功能就是有效地管理这些“事件”,以保证所有事件得以正确完成。

1.21.2任务任务(task)(task)的概念的概念在OSAL中,所有的“事件”会被安排到不同的“任务”里进行执行,比如按键、串口、LCD等外设均被安排在Hal任务中,而无线数据的底层收发则放在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。

每个任务中又可以同时处理多个事件,通过一个核心处理函数来管理其下属的每一个事件:

constpTaskEventHandlerFntasksArr=macEventLoop,nwk_event_loop,Hal_ProcessEvent,MT_ProcessEvent,APS_event_loop,APSF_ProcessEvent,ZDApp_event_loop,ZDNwkMgr_event_loop,SampleApp_ProcessEvent;1.31.3主循环任务处理机制主循环任务处理机制主循环代码:

voidosal_start_system(void)#if!

defined(ZBIT)&!

defined(UBIT)for(;)/ForeverLoop#endifosal_run_system();下面我们将针对osal_run_system函数处理机制进行解析:

5注:

为了便于直观,以下涉及到数据地址的地方都是由上而下,地址由高变低。

主循环中的两个关键数组,*tasksEvents与*tasksArr,从图一中我们可以看出来,tasksEvents这个数组存放的是从序号为0到tasksCnt,表示每个任务在本次循环中是否要被运行。

需要运行的任务其值非0(用橙色表示),否则为0。

而tasksArr数组则存放了对应每个任务的入口地址,只有在tasksEvents中记录的需要运行的任务,在本次循环中才会被调用到。

所以说,tasksEvents数据存放的内容就是:

本任务中是否有事件发生,有哪些事件发生。

如果有事件发生,则执行本任务,否则直接跳到下一个任务中进行判断。

当事件处理完成后,其对应的标志位会被清空,此后除非有新的事件发生,否则本任务不会再被执行。

了解了上述基本机制后,我们来看一下主循环的代码解析:

doif(tasksEventsidx)/寻找最高优先级的任务来运行break;while(+idxtasksCnt);if(idxtimeout=0)osal_set_event(srchTimer-task_id,srchTimer-event_flag);.也就是说某个地方触发了一个软件定时器,当这个定时器到期时,申请执行某事件。

比如:

当用户按键一秒钟后,执行打开LED灯的事件,就可以用这种方式来实现。

那如何开始一个软件定时器呢?

再看另外一个函数osal_start_timerEx先看下它的自我介绍/*fnosal_start_timerEx*brief*ThisfunctioniscalledtostartatimertoexpireinnmSecs.*Whenthetimerexpires,thecallingtaskwillgetthespecifiedevent.*parambytetaskID-taskidtosettimerfor*paramUINT16event_id-eventtobenotifiedwith*paramUNINT16timeout_value-inmilliseconds.*returnZSUCCESS,orNO_TIMER_AVAIL.*/byteosal_start_timerEx(bytetaskID,UINT16event_id,UINT16timeout_value)也就是说,它会开始一个timeout_value(ms)的计时器,当这个计时器溢出时,则会对taskID这个task,设置一个event_id,让这个事件在后面的主循环中运行到。

下面我们通过一个图表来解释下这种机制:

9这个表就是osalTimerUpdate函数的“任务表”,上面讲过这个函数给应用程序提供了“软计时”,就是体现在这里:

osal_start_timerEx通过osalAddTimer向链表里添加了“定时任务”,由osalTimerUpdate来以ms为单位对这些“软定时器”减计数,溢出时,即调用osal_set_event,实现主循环里对任务事件的调用。

二、通过消息机制调用事件二、通过消息机制调用事件这是另外一种设置事件(SetEvent)的重要方式,下面我们以ZStack协议栈的基础例程GenericApp来看一下按键是如何产生的,及如何调用相应的接口程序。

前文讲过,按键的相关处理都安排在了HAL的task当中,在HAL的核心处理函数Hal_ProcessEvent中,有个HalKeyPoll的处理函数,在HalKeyPoll函数中,无论按键是ADC方式,或者是扫描IO口的方式,最后都会生成一个键值key,然后通过下面的语句来调用按键服务程序:

/*InvokeCallbackifnewkeysweredepressed*/if(keys&(pHalKeyProcessFunction)(pHalKeyProcessFunction)(keys,HAL_KEY_STATE_NORMAL);这里调用的服务程序,在InitBoard中被初始化为OnBoard_KeyCallback,这个函数又通过OnBoard_SendKeys运行下面语句:

10/SendtheaddresstothetaskmsgPtr=(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);return(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_ProcessEvent就收到一个按键的处理任务,并通过GenericApp_HandleKeys来执行相应的操作。

再来回顾一下这个按键的处理过程:

任务驱动层Hal_ProcessEvent负责对按键进行持续扫描,发现有按键事件后OnBoard_KeyCallback函数向应用层GenericApp_ProcessEvent发送一个有按键需要处理的消息,最终由GenericApp_HandleKeys来负责执行具体的操作。

让我们再回到最初的问题,任务处理表tasksEvents是怎么被改动的呢?

初始化程序、其他任务或者本任务主要通过下面几种方式对其操作:

1、通过osal_set_event直接操作2、设置计时器,当其溢出时,触发事件处理3、直接通过任务间的消息传递机制触发

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2