我是靠谱客的博主 甜蜜荔枝,最近开发中收集的这篇文章主要介绍zigbee之OSAL操作系统,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


概述


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操作系统所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部