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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1. 概述 OSAL (Operating System Abstraction Layer),翻譯為“操作系統(tǒng)抽象層”。在基于ZigBee協(xié)議的應用開發(fā)中,應用程序框架中包含了最多240個應用程序對象。如果我們把一個應用程序對象看做為一個任務的話,那么應用程序框架將包含一個支持多任務的資源分配機制。于是OSAL便有了存在的必要性,它正是Z-Stack為了實現(xiàn)這樣一個機制而存在的。OSAL就是以實現(xiàn)多任務為核心的系統(tǒng)資源管理機制。所以OSAL與標準的操作系統(tǒng)還是有很大的區(qū)別的。簡單而言,OSAL實現(xiàn)了類似操作系統(tǒng)的某些功能,但并不能稱之為真正意義上的操作系統(tǒng)。2OSAL的API接口函數(shù)名稱功能

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

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

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

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

6、數(shù)不同的是該函數(shù)設置的定時器超時后被重新裝載。 (3)uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ):停止一個已經開始的定時器。 (4)uint32 osal_GetSystemClock( void ):獲取系統(tǒng)時間,返回值以ms為單位。2.4 中斷管理功能 (1)uint8 osal_int_enable( uint8 interrupt_id ) :使能某個中斷 (2)uint8 osal_int_disable( uint8 interrupt_id ) :禁止某個中斷2.5 任務管理功能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定義了各個任務的事件回調函數(shù),如果有用戶自己定義的任務,必須將其事件回調函數(shù)加

8、入到該數(shù)組中。void osalInitTasks( void ) uint8 taskID = 0; tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); /分配內存 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ù)中被調用。2.6 電源管理功能 (1)void osal_pwrmgr_init( void ):初始化電源管理模塊的變量,被 osal_init_system()調用。 (2)void osal_pwrmgr_powerconserve( void ):使系統(tǒng)進入節(jié)電模式,已經在系統(tǒng)的主循環(huán)中被調用,不能調用。 (3)void osal_pw

10、rmgr_device( uint8 pwrmgr_device ):全局設備電源的開關。 (4)uint8 osal_pwrmgr_task_state(uint8 task_id, uint8 state ):控制任務節(jié)電狀態(tài)。2.7 非易失性存儲器管理功能 非易失性存儲器的操作很耗時,并且將暫時關閉中斷,因此最好在收發(fā)器關閉的時候調用這些函數(shù)。不要頻繁的寫NV mem,因為這非常耗時耗電。 (1)uint8 osal_nv_item_init( uint16 id, uint16 len, void *buf ):初始化一個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):計算一個結構體中某個成員的偏移。2.8 內存管理功能 (1)void *osal_ mem_alloc( uint16 size):在堆上分配指定大小的緩沖區(qū)。 (2)void osal mem_free( void *ptr):釋放使用osal_mem_alloc()分

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

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

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

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

16、imer事件鏈表是下面這樣一個結構,next指向下一個Timer事件,timeout值表明本Timer事件還需要timeout個心跳才需要被處理,因為此處心跳是1ms,所以也就是說還需要timeout個ms才處理。所謂的處理也就是檢測timeout是否小于1ms,如果小于1ms, 則通過osal_set_event()將tasksEvents相應位置置為event_flag。如果大于1ms,說明該Timer事件還不到處理的時候,則 Timeout = Timeout-1,然后繼續(xù)耐心等待下一次心跳。Timer事件鏈表結構體定義如下:typedef struct void *next; UINT

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

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

溫馨提示

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

評論

0/150

提交評論