概述
概述
OSAL(Operating System AbstractionLayer),即操作系统抽象层。
OSAL是一种基于事件驱动的轮询式操作系统,所提供的管理功能有:
(1)任务登记、任务初始化、任务触发
(2)任务间消息传递
(3)任务同步
(4)中断处理
(5)计时器
(6)内存分配
系统分析
**osal_run_system()**不断轮询遍历所有任务事件,事件被置位后就会被调度执行该任务:需要注意的是每次任务被调度时都只处理一个事件,并在处理完后清除该事件。大致框图如下:
任务数组taskArr[]中的任务定义:(数组中的每个成员的类型)如下
unsigned short (*pTaskEventHandlerFn)( unsigned chartask_id,
unsigned short event );
重点调用的函数:
events= tasksEvents[idx];取出事件号,idx表示任务ID
tasksEvents[idx]=0;当前任务下的事件清0
events=tasksArr[idx](idx,events);处理事件,并返回处理之后的events
tasksEvents[idx] |= events;重置当前任务未处理完的事件
每个任务最多可以同时设置16个事件(两个字节),但有些位已经被系统定义事件占用,所以自定义事件时最好不要与其冲突,如:任务间消息收发事件SYS_EVENT_MSG = 0x8000。
taskEvents事件要和后面zigbee协议栈中的afIncomingMSGPacket_t->hdr.event这个8bit的消息事件加以区别。
指定任务添加事件:
osal_set_event(uint8 task_id,uint16 event_flag)
tasksEvents[task_id] |= event_flag;
指定任务清除事件:
osal_clear_event(uint8 task_id,uint16 event_flag)
tasksEvents[task_id] &= ~(event_flag);
任务事件被置位,即任务调度,主要通过以下两种途径实现:
*直接通过调用**osal_set_event()*给任务事件置位。
任务调度结束后返回,通过返回未处理完的事件位重新置位。
还有间接通过osal_set_event()置位的情况,例如:
一个任务给另一个任务发消息
定时触发事件设置osal_start_timerEx()
zigbee协议栈底层触发调用
msg消息发送过程
osal_msg_send(uint8 taskID,void *msg_ptr)
msg_ptr指向消息内容,不能为空
放入消息队列osal_msg_enqueue(&osal_qHead,msg_ptr );
最后通过**osal_set_event(taskID, SYS_EVENT_MSG )**给任务事件置位
msg消息接收过程
msg_ptr = osal_msg_receive(taskID);
消息队列取出sal_msg_extract(&osal_qHead,msg_ptr,…)
清除事件osal_clear_event(taskID, SYS_EVENT_MSG )
消息收发操作流程
申请消息空间(消息开头都会有osal_msg_hdr_t结构):msgstr = osal_msg_allocate(len)
消息内容的初始化:strcpy(msgstr,“hellon”);
发送消息:**osal_msg_send(xx_TaskID,msgstr)->osal_msg_enqueue()**在链表结尾添加节点
接收消息(根据任务ID进行接收):msg =osal_msg_receive(xx_TaskID)
对得到的消息进行处理
释放消息:osal_msg_deallocate()
关注小编,一起努力。奥利给
最后
以上就是甜蜜荔枝为你收集整理的zigbee之OSAL操作系统的全部内容,希望文章能够帮你解决zigbee之OSAL操作系统所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复