ZStackOSAL中文說(shuō)明DOC_第1頁(yè)
ZStackOSAL中文說(shuō)明DOC_第2頁(yè)
ZStackOSAL中文說(shuō)明DOC_第3頁(yè)
ZStackOSAL中文說(shuō)明DOC_第4頁(yè)
ZStackOSAL中文說(shuō)明DOC_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1. 概述 OSAL (Operating System Abstraction Layer),翻譯為“操作系統(tǒng)抽象層”。在基于ZigBee協(xié)議的應(yīng)用開發(fā)中,應(yīng)用程序框架中包含了最多240個(gè)應(yīng)用程序?qū)ο蟆H绻覀儼岩粋€(gè)應(yīng)用程序?qū)ο罂醋鰹橐粋€(gè)任務(wù)的話,那么應(yīng)用程序框架將包含一個(gè)支持多任務(wù)的資源分配機(jī)制。于是OSAL便有了存在的必要性,它正是Z-Stack為了實(shí)現(xiàn)這樣一個(gè)機(jī)制而存在的。OSAL就是以實(shí)現(xiàn)多任務(wù)為核心的系統(tǒng)資源管理機(jī)制。所以O(shè)SAL與標(biāo)準(zhǔn)的操作系統(tǒng)還是有很大的區(qū)別的。簡(jiǎn)單而言,OSAL實(shí)現(xiàn)了類似操作系統(tǒng)的某些功能,但并不能稱之為真正意義上的操作系統(tǒng)。2OSAL的API接口函數(shù)名稱功能

2、描述void osal_nv_init()初始化FLASH存儲(chǔ)器uint8 osal_init_system()初始化操作系統(tǒng)void osal_mem_init()初始化內(nèi)存分配系統(tǒng)void osalTimerInit()初始化定時(shí)器void osalInitTasks()初始化系統(tǒng)任務(wù)void osal_start_system()進(jìn)入操作系統(tǒng)void osal_run_system()運(yùn)行操作系統(tǒng)void osalTimeUpdate()操作系統(tǒng)時(shí)間更新void Hal_ProcessPoll()硬件層檢查2.1 消息管理功能(1)uint8 * osal_msg_allocate( u

3、int16 len ):申請(qǐng)一個(gè)指定長(zhǎng)度的消息緩存區(qū),該函數(shù)調(diào)用void *osal_mem_alloc( uint16 size )函數(shù)實(shí)現(xiàn),從堆中申請(qǐng)存儲(chǔ)空間。 (2)uint8 osal_msg_deallocate( uint8 *msg_ptr ):接收到消息的任務(wù)處理完成后釋放消息的緩存空間。 (3)uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ):發(fā)送消息到指定任務(wù),將消息放入隊(duì)列,并把任務(wù)的相應(yīng)事件標(biāo)志置位。 (4)uint8 *osal_msg_receive( uint8 task_id ):接收發(fā)送

4、到某個(gè)消息的任務(wù),在任務(wù)處理完消息后,必修釋放消息的存儲(chǔ)空間。該函數(shù)查找消息隊(duì)列,如果消息隊(duì)列中有多個(gè)發(fā)送給該任務(wù)的消息,保持事件標(biāo)志位。 (5)osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event):尋找發(fā)送給具有某個(gè)事件的任務(wù)的消息。2.2 任務(wù)同步功能 (1)uint8 osal_set_event(uint8 task_id, uint16 event_flag ):設(shè)置某個(gè)任務(wù)的某個(gè)事件標(biāo)志。event_flag為16位,只有一個(gè)系統(tǒng)事件SYS_EVENT_MSG,其余的事件都是用戶定義的事件。2.3 時(shí)間管理功能 時(shí)間

5、管理的API既可以被Z-stack協(xié)議棧中的任務(wù)使用,也可以被應(yīng)用級(jí)任務(wù)使用。粒度為1ms。 (1)uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value):為某個(gè)任務(wù)設(shè)置一個(gè)定時(shí)器,taskID為任務(wù)ID,event_id為用戶指定的事件標(biāo)志位,timeout_value為超時(shí)時(shí)間,以ms為單位。 (2)uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint16 timeout_value ):設(shè)置定時(shí)器,與上一個(gè)函

6、數(shù)不同的是該函數(shù)設(shè)置的定時(shí)器超時(shí)后被重新裝載。 (3)uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ):停止一個(gè)已經(jīng)開始的定時(shí)器。 (4)uint32 osal_GetSystemClock( void ):獲取系統(tǒng)時(shí)間,返回值以ms為單位。2.4 中斷管理功能 (1)uint8 osal_int_enable( uint8 interrupt_id ) :使能某個(gè)中斷 (2)uint8 osal_int_disable( uint8 interrupt_id ) :禁止某個(gè)中斷2.5 任務(wù)管理功能const pTaskEven

7、tHandlerFn tasksArr = macEventLoop, nwk_event_loop, Hal_ProcessEvent, MT_ProcessEvent, APS_event_loop, APSF_ProcessEvent, ZDApp_event_loop, ZDNwkMgr_event_loop, GenericApp_ProcessEvent; const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr0 ); 數(shù)組tasksArr定義了各個(gè)任務(wù)的事件回調(diào)函數(shù),如果有用戶自己定義的任務(wù),必須將其事件回調(diào)函數(shù)加

8、入到該數(shù)組中。void osalInitTasks( void ) uint8 taskID = 0; tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); /分配內(nèi)存 osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt); /清零 macTaskInit( taskID+ ); nwk_init( taskID+ ); Hal_Init( taskID+ ); MT_TaskInit( taskID+ ); APS_Init( taskID+

9、); APSF_Init( taskID+ ); ZDApp_Init( taskID+ ); ZDNwkMgr_Init( taskID+ ); GenericApp_Init( taskID ); 以上函數(shù)在osal_init_system() 函數(shù)中被調(diào)用。2.6 電源管理功能 (1)void osal_pwrmgr_init( void ):初始化電源管理模塊的變量,被 osal_init_system()調(diào)用。 (2)void osal_pwrmgr_powerconserve( void ):使系統(tǒng)進(jìn)入節(jié)電模式,已經(jīng)在系統(tǒng)的主循環(huán)中被調(diào)用,不能調(diào)用。 (3)void osal_pw

10、rmgr_device( uint8 pwrmgr_device ):全局設(shè)備電源的開關(guān)。 (4)uint8 osal_pwrmgr_task_state(uint8 task_id, uint8 state ):控制任務(wù)節(jié)電狀態(tài)。2.7 非易失性存儲(chǔ)器管理功能 非易失性存儲(chǔ)器的操作很耗時(shí),并且將暫時(shí)關(guān)閉中斷,因此最好在收發(fā)器關(guān)閉的時(shí)候調(diào)用這些函數(shù)。不要頻繁的寫NV mem,因?yàn)檫@非常耗時(shí)耗電。 (1)uint8 osal_nv_item_init( uint16 id, uint16 len, void *buf ):初始化一個(gè)NV item (2)uint8 osal_nv_read( u

11、int16 id, uint16 offset, uint16 len, void *buf ):讀取NV (3)uint8 osal_nv_write( uint16 id, uint16 offset, uint16 len, void *buf ):寫入NV (4)osal_offsetof(type, member):計(jì)算一個(gè)結(jié)構(gòu)體中某個(gè)成員的偏移。2.8 內(nèi)存管理功能 (1)void *osal_ mem_alloc( uint16 size):在堆上分配指定大小的緩沖區(qū)。 (2)void osal mem_free( void *ptr):釋放使用osal_mem_alloc()分

12、配的緩沖區(qū)。以上兩個(gè)函數(shù)要成對(duì)使用,防止產(chǎn)生內(nèi)存泄露。3Zigbee 協(xié)議棧OSAL 分析3.1 OSAL運(yùn)行機(jī)理OSAL是事件驅(qū)動(dòng)的操作系統(tǒng)(Event-driven OS) ,負(fù)責(zé)調(diào)度各個(gè)任務(wù)的運(yùn)行,如果有事件發(fā)生了,則會(huì)調(diào)用相應(yīng)的事件處理函數(shù)進(jìn)行處理。ZigBee協(xié)議棧的實(shí)時(shí)性要求并不高,因此在設(shè)計(jì)任務(wù)調(diào)度程序時(shí),OSAL只采用了輪詢?nèi)蝿?wù)調(diào)度隊(duì)列的方法來(lái)進(jìn)行任務(wù)調(diào)度管理。那么,事件和任務(wù)的事件處理函數(shù)是如何聯(lián)系起來(lái)的昵?ZigBee 中采用的方法是:建立一個(gè)事件表,保存各個(gè)任務(wù)的對(duì)應(yīng)的事件,建立另一個(gè)函數(shù)表,保存各個(gè)任務(wù)事件處理函數(shù)的地址,然后將這兩張表建立某種對(duì)應(yīng)關(guān)系,當(dāng)某一事件發(fā)生時(shí)

13、則查找函數(shù)表找到對(duì)應(yīng)的事件處理函數(shù)即可。ZigBee 協(xié)議棧中,有三個(gè)變量至關(guān)重要。(1) tasksCnt-該變量保存了任務(wù)的總個(gè)數(shù)。(2) tasksEvents-這是一個(gè)指針,指向了事件表的首地址。這個(gè)數(shù)組中的某個(gè)元素不為0,即代表此任務(wù)有事件需要相應(yīng),事件類型取決于這個(gè)元素的值。(3) tasksArr-這是一個(gè)數(shù)組,該數(shù)組的每一項(xiàng)都是一個(gè)函數(shù)指針,指向了事件處理函數(shù)。該數(shù)組的聲明為:const pTaskEventHandlerFn tasksArr。其中pTaskEventHandlerFn 的定義為:typedef unsigned short (*pTaskEventHandl

14、erFn) ( unsigned char task_id, unsigned short event )。這是定義了一個(gè)函數(shù)指針。因此,tasksArr 數(shù)組的每一項(xiàng)都是一個(gè)函數(shù)指針,指向了事件處理函數(shù)。 總結(jié)一下OSAL 的工作原理:通過(guò)tasksEvents 指針訪問(wèn)事件表的每一項(xiàng),如果有事件發(fā)生,則查找函數(shù)表找到相應(yīng)事件處理函數(shù)進(jìn)行處理,處理完后,繼續(xù)訪問(wèn)事件表,查看是否有事件發(fā)生,無(wú)限循環(huán)。通常用關(guān)中斷的方式保護(hù)共享資源。從這種意義上說(shuō), OSAL 是一種基于事件驅(qū)動(dòng)的輪詢式操作系統(tǒng)。事件驅(qū)動(dòng)是指發(fā)生事件后采取相應(yīng)的事件處理方法,輪詢指的是不斷地查看是否有事件發(fā)生。不過(guò)接下來(lái)就有了更

15、加深入的問(wèn)題了,事件是如何被捕獲的?直觀一些來(lái)說(shuō)就是,tasksEvents這個(gè)數(shù)組里的元素是什么時(shí)候被設(shè)定為非零數(shù),來(lái)表示有事件需要處理的?在OSAL的死循環(huán)中,各個(gè)事件只是在某些特定的情況下發(fā)生,所以這里就引入了心跳的概念,也就是OS的時(shí)鐘節(jié)奏。在Zstack OSAL中這個(gè)節(jié)奏定義為1ms, 由8 bits HW_TIMER4來(lái)控制。每當(dāng)1ms心跳來(lái)臨時(shí),Timer4的中斷標(biāo)志置位,這樣在OSAL的死循環(huán)中檢測(cè)到這個(gè)標(biāo)志置位后,就通過(guò)osalTimerUpdate()函數(shù)去輪詢Timer事件鏈表,沒有檢測(cè)到這個(gè)標(biāo)志位則繼續(xù)死循環(huán)。其中,Timer事件鏈表通常在各任務(wù)事件的初始化時(shí)建立。T

16、imer事件鏈表是下面這樣一個(gè)結(jié)構(gòu),next指向下一個(gè)Timer事件,timeout值表明本Timer事件還需要timeout個(gè)心跳才需要被處理,因?yàn)榇颂幮奶?ms,所以也就是說(shuō)還需要timeout個(gè)ms才處理。所謂的處理也就是檢測(cè)timeout是否小于1ms,如果小于1ms, 則通過(guò)osal_set_event()將tasksEvents相應(yīng)位置置為event_flag。如果大于1ms,說(shuō)明該Timer事件還不到處理的時(shí)候,則 Timeout = Timeout-1,然后繼續(xù)耐心等待下一次心跳。Timer事件鏈表結(jié)構(gòu)體定義如下:typedef struct void *next; UINT

17、16 timeout; UINT16 event_flag; byte task_id; osalTimerRec_t;3.2 OSAL消息隊(duì)列事件是驅(qū)動(dòng)任務(wù)去執(zhí)行某些操作的條件,當(dāng)系統(tǒng)中產(chǎn)生了一個(gè)事件,OSAL 將這個(gè)事件傳遞給相應(yīng)的任務(wù)后,任務(wù)才能執(zhí)行一個(gè)相應(yīng)的操作(調(diào)用事件處理函數(shù)去處理)。通常某些事件發(fā)生時(shí),又伴隨著一些附加信息的產(chǎn)生,例如:從天線接收數(shù)據(jù)后,會(huì)產(chǎn)生AF_INCOMING_MSG_CMD 事件,但是任務(wù)的事件處理函數(shù)在處理這個(gè)事件的時(shí)候,還需要得到所收到的數(shù)據(jù)。因此,這就需要將事件和數(shù)據(jù)封裝成一個(gè)消息,將消息發(fā)送到消息隊(duì)列,然后在事件處理函數(shù)中就可以使用osal_msg

18、_receive,從消息隊(duì)列中得到該消息。如下代碼可以從消息隊(duì)列中得到一個(gè)消息:MSGpkt = (afIncomingMSGPacket_t *)osal_msg _receive (GenericApp_TaskID)。OSAL 維護(hù)了一個(gè)消息隊(duì)列,每一個(gè)消息都會(huì)被放到這個(gè)消息隊(duì)列中去,當(dāng)任務(wù)接收到事件后,可以從消息隊(duì)列中獲取屬于自己的消息,然后調(diào)用消息處理函數(shù)進(jìn)行相應(yīng)的處理即可。通常在不同任務(wù)間通訊時(shí)使用消息機(jī)制。3.4 OSAL添加任務(wù)tasksArr數(shù)組里存放了所有任務(wù)的事件處理函數(shù)的地址;osallnitTasks是OSAL 的任務(wù)初始化函數(shù),所有任務(wù)的初始化工作都在這里面完成,并且自動(dòng)給每個(gè)任務(wù)分配一個(gè)ID。因此,要添加新任務(wù),只需要編寫兩個(gè)函數(shù):新任務(wù)的初始化函數(shù)和新任務(wù)的事件處理函數(shù)。將新任務(wù)的初始化函數(shù)添加在osallnitTasks 函數(shù)的最后,如下代碼所示。 將事件處理函數(shù)的地址加

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論