OSAL,Operating System Abstraction Layer,即操作系统抽象层。
从Z-Stack1.4.3及以后开始引入OSAL。
OSAL是一种基于事件驱动的轮询式操作系统,所提供的管理功能有:任务登记、任务初始化、任务触发任间消息传递、任务同步、中断处理、计时器、内存分配。
osal_run system() 不断轮询遍历所有任务事件, 事件被置位后就会被调度执行该任务: 需要注意的是每次任务被调度时都只处理一个事件, 并在处理完后清除该事件。




每个任务最多可以同时设置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) ;
消息队列取出
osal_msg_extract (&osal_qHead, msg_ptr, …)
清除事件osal_clear_event(taskID,SYS_EVENT_MSG)
消息收发操作流程
申请消息空间(消息开头都会有osal_msg _hdr_t结构): msgstr = osal_msg_allocate(len);
消息内容的初始化: strcpy (msgstr,”hello\n”) ;
发送消息: osal_msg_send(xx_TaskID, msgstr)->osal_msg_enqueue()在链表结尾添加节点。
接收消息(根据任务ID进行接收): msg=osal_msg_receive(xx_TaskID);
对得到的消息进行处理;
释放消息: osal_msg_deallocate()
自定义任务
定义自己的任务函数。
定义任务初始化函数并保存任务ID。