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,“hello\n”);
發送消息:**osal_msg_send(xx_TaskID,msgstr)->osal_msg_enqueue()**在鏈表結尾添加節點
接收消息(根據任務ID進行接收):msg =osal_msg_receive(xx_TaskID)
對得到的消息進行處理
釋放消息:osal_msg_deallocate()

關注小編,一起努力。奧利給

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章