OSAL初始化流程)_第1頁(yè)
OSAL初始化流程)_第2頁(yè)
OSAL初始化流程)_第3頁(yè)
OSAL初始化流程)_第4頁(yè)
OSAL初始化流程)_第5頁(yè)
已閱讀5頁(yè),還剩3頁(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、轉(zhuǎn)載 OSAL初始化流程 我使用的協(xié)議棧版本及例子信息:ZigBee2006Texas InstrumentsZStack-1.4.3-1.2.1ProjectszstackSamplesSampleApp首先借用前人的一個(gè)說(shuō)明:用戶自己添加的應(yīng)用任務(wù)程序在Zstack中的調(diào)用過(guò)程是:(1).main() 執(zhí)行(在中)main() -> osal_init_system() (2). osal_init_system()調(diào)用osalInitTasks(), (在中)osal_init_system() -> osalInitTasks()(3). osalInitTasks()調(diào)用

2、SampleApp_Init() , (在中)osalInitTasks() -> SampleApp_Init()在osalInitTasks()中實(shí)現(xiàn)了多個(gè)任務(wù)初始化的設(shè)置,其中macTaskInit( taskID+ )到ZDApp_Init( taskID+ )的幾行代碼表示對(duì)于幾個(gè)系統(tǒng)運(yùn)行初始化任務(wù)的調(diào)用,而用戶自己實(shí)現(xiàn)的SampleApp_Init()在最后,這里taskID隨著任務(wù)的增加也隨之遞增.所以用戶自己實(shí)現(xiàn)的任務(wù)的初始化操作應(yīng)該在osalInitTasks()中增加./-1、首先來(lái)看下主函數(shù)main()ZSEG int main( void )  

3、; /主函數(shù)的功能就是完成初始化任務(wù),然后進(jìn)入OSAL/ Turn off interrupts/*關(guān)閉中斷*/osal_int_disable( INTS_ALL );/ Initialize HAL/*初始化硬件*/HAL_BOARD_INIT();/ Make sure supply voltage is high enough to run/*電壓檢測(cè),確保芯片能正常工作的電壓*/zmain_vdd_check();/ Initialize stack memory/*初始化stack存儲(chǔ)區(qū)*/zmain_ram_init();/ Initialize board I/O/*初始化板載

4、IO*/InitBoard( OB_COLD );/ Initialze HAL drivers/*初始化硬件驅(qū)動(dòng)*/HalDriverInit();/ Initialize NV System/*初始化NV系統(tǒng)*/osal_nv_init( NULL );/ Determine the extended address/*確定擴(kuò)展地址(64位IEEE/物理地址)*/zmain_ext_addr();/ Initialize basic NV items/*初始化基本NV條目*/zgInit();/ Initialize the MAC/*初始化MAC*/ZMacInit();#ifndef

5、NONWK/ Since the AF isn't a task, call it's initialization routineafInit();#endif#ifdef LCD_SUPPORTED HalLcdInit();#endif/ Initialize the operating system/*初始化操作系統(tǒng)*/osal_init_system();/ Allow interrupts/*開(kāi)啟中斷*/osal_int_enable( INTS_ALL );/ Final board initialization/*最終板載初始化*/InitBoard( OB_R

6、EADY );/HalLcdInit();/ Display information about this device/*顯示設(shè)備信息*/zmain_dev_info();/* Display the device info on the LCD */#ifdef LCD_SUPPORTEDzmain_lcd_init();#endifosal_start_system(); / No Return from here 沒(méi)有返回,即進(jìn)入操作系統(tǒng)! 說(shuō)明:初始化各軟硬件后進(jìn)入系統(tǒng)主循環(huán)函數(shù)。        

7、0;  這里重點(diǎn)是兩個(gè)函數(shù):系統(tǒng)初始化函數(shù) osal_init_system(); 系統(tǒng)主循環(huán)函數(shù) osal_start_system();            下面記錄下個(gè)人個(gè)人對(duì)系統(tǒng)初始化流程和系統(tǒng)主循環(huán)流程的學(xué)習(xí)。這里先記錄下系統(tǒng)初始化流程。/-2、系統(tǒng)初始化流程2.1osal_init_system()系統(tǒng)初始化函數(shù)byte osal_init_system( void )/ Initialize the Memory Allocation System/*初始化內(nèi)存分配系統(tǒng)

8、*/osal_mem_init();/ Initialize the message queue/*初始化系統(tǒng)消息隊(duì)列*/osal_qHead = NULL;#if defined( OSAL_TOTAL_MEM )osal_msg_cnt = 0;#endif/ Initialize the timers/*初始化定時(shí)器*/osalTimerInit();/ Initialize the Power Management System/*初始化電源管理系統(tǒng)*/osal_pwrmgr_init();/ Initialize the system tasks./*初始化系統(tǒng)任務(wù)*/osalIni

9、tTasks(); /初始化系統(tǒng)任務(wù)/ Setup efficient search for the first free block of heap.osal_mem_kick();return ( ZSUCCESS );說(shuō)明:這里重點(diǎn)是初始化系統(tǒng)任務(wù)函數(shù):osalInitTasks(); 下面進(jìn)入系統(tǒng)任務(wù)的初始化:/- 2.2 osalInitTasks(); 任務(wù)初始化函數(shù)void osalInitTasks( void )uint8 taskID = 0;    /osal_mem_alloc()為當(dāng)前OSAL中的各任務(wù)分配存儲(chǔ)空間(實(shí)際上是一個(gè)任務(wù)數(shù)組)

10、,函數(shù)返回指向任務(wù)緩沖   /區(qū)的指針,因此tasksEvents指向該任務(wù)數(shù)組(任務(wù)隊(duì)列).注意tasksEvents和后面談到的tasksArr里的順/序是一一對(duì)應(yīng)的, tasksArr 中的第i個(gè)事件處理函數(shù)對(duì)應(yīng)于tasksEvents中的第i個(gè)任務(wù)的事件.tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);        /osal_memset()把開(kāi)辟的內(nèi)存全部設(shè)置為0;sizeof( uint16 )是4個(gè)

11、字節(jié),即一個(gè)任務(wù)      /的長(zhǎng)度(同樣是uint16定義),乘以任務(wù)數(shù)量tasksCnt,即全部?jī)?nèi)存空間osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt); 中定義macTaskInit( taskID+ );    /初始化各層任務(wù) mac_taskID=0;nwk_init( taskID+ );           /nwk_taskID=1

12、;Hal_Init( taskID+ );            /Hal_taskID=2;#if defined( MT_TASK )MT_TaskInit( taskID+ );    /MT_taskID=3;(if defined)#endifAPS_Init( taskID+ );           /APS_taskID=4;ZDApp_In

13、it( taskID+ );      /ZDAPP_taskID=5;SampleApp_Init( taskID ); /SampleApp_taskID=6;用戶創(chuàng)建的任務(wù)說(shuō)明:任務(wù)初始化,就是為系統(tǒng)的各個(gè)任務(wù)分配存儲(chǔ)空間,當(dāng)然,這個(gè)空間初始化時(shí)為全0(NULL),然后為各任務(wù)分配taskID;這里的順序要注意.系統(tǒng)主循環(huán)函數(shù)里tasksEvents idx和tasksArr idx的idx與這里taskID是一一對(duì)應(yīng)關(guān)系。后面再分析。指針數(shù)組tasksEvents 里面最終分別指向的是各任務(wù)存儲(chǔ)空間指針數(shù)組tasksArr 里面最終分別

14、指向的是各任務(wù)事件處理函數(shù)這兩個(gè)指針數(shù)組里面各元素的順序要一一對(duì)應(yīng),因?yàn)楹竺嫘枰鄳?yīng)任務(wù)調(diào)用相應(yīng)事件處理函數(shù).對(duì)這兩個(gè)數(shù)組的定義請(qǐng)參見(jiàn)后面.問(wèn)題:對(duì)于osal_mem_alloc()這個(gè)函數(shù)返回的是一個(gè)指向任務(wù)數(shù)組的指針,看前人分析的,我還沒(méi)有去看這個(gè)函數(shù)。說(shuō)明:那么這里重點(diǎn)是各任務(wù)的初始化,MAC層和NWK層的未開(kāi)源看不到,先記錄下用戶自己添加的任務(wù)初始化函數(shù)SampleApp_Init( taskID );   /- 2.3 SampleApp_Init( taskID ); 用戶應(yīng)用任務(wù)初始化函數(shù)void SampleApp_Init( uint8 task

15、_id )SampleApp_TaskID = task_id; /osal分配的任務(wù)ID,這里為6,隨著用戶添加任務(wù)的增多而改變SampleApp_NwkState = DEV_INIT; /設(shè)備狀態(tài)設(shè)定為ZDO層中定義的初始化狀態(tài)(無(wú)連接)/*初始化應(yīng)用設(shè)備的網(wǎng)絡(luò)類(lèi)型,設(shè)備類(lèi)型的改變都要產(chǎn)生一個(gè)事件ZDO_STATE_CHANGE,從字面理解為/ZDO狀態(tài)發(fā)生了改變。所以在設(shè)備初始化的時(shí)候一定要把它初始化為什么狀態(tài)都沒(méi)有。那么它就要去檢測(cè)/整個(gè)環(huán)境,看是否能重新建立或者加入存在的網(wǎng)絡(luò)。但是有一種情況例外,就是當(dāng)NV_RESTORE被設(shè)置的/時(shí)候(NV_RESTORE是把信息保存在非易失存儲(chǔ)

16、器中),那么當(dāng)設(shè)備斷電或者某種意外重啟時(shí),由于網(wǎng)絡(luò)/狀態(tài)存儲(chǔ)在非易失存儲(chǔ)器中,那么此時(shí)就只需要恢復(fù)其網(wǎng)絡(luò)狀態(tài),而不需要重新建立或者加入網(wǎng)絡(luò)了*/SampleApp_TransID = 0; /消息發(fā)送ID(多消息時(shí)有順序之分)  / Device hardware initialization can be added here or in main() (Zmain.c)./ If the hardware is application specific - add it here./ If the hardware is other parts of the devic

17、e add it in main().#if defined ( SOFT_START ) /如果選擇了SOFT編譯選項(xiàng),則作為協(xié)調(diào)器啟動(dòng)/ The "Demo" target is setup to have SOFT_START and HOLD_AUTO_START/ SOFT_START is a compile option that allows the device to start/ as a coordinator if one isn't found./ We are looking at a jumper (defined in SampleA

18、ppHw.c) to be jumpered/ together - if they are - we will start up a coordinator. Otherwise,/ the device will start as a router./ if ( readCoordinatorJumper() )    zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR;   /else    /zgDeviceLogicalType = ZG_DEVICETYPE_

19、ROUTER;#endif / SOFT_START#if defined ( HOLD_AUTO_START )    /如果定義了HOLD_AUTO_START選項(xiàng),則調(diào)用層的ZDOInitDevice,按照默認(rèn)順       /序網(wǎng)絡(luò)中的第一個(gè)設(shè)備作為協(xié)調(diào)器,其他的設(shè)備作為子設(shè)備   / HOLD_AUTO_START is a compile option that will surpress ZDApp/ from starting the device and wait for th

20、e application to/ start the device.ZDOInitDevice(0);#endif/* 設(shè)置發(fā)送數(shù)據(jù)的方式和目的地址尋址模式*/-/周期消息,廣播發(fā)送/ Setup for the periodic message's destination address 周期消息事件/ Broadcast to everyone/*廣播到所有設(shè)備*/SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast ; /發(fā)送模式(廣播)SampleApp_Periodic_DstAddr.endPo

21、int = SAMPLEAPP_ENDPOINT; /指定端點(diǎn)號(hào)EP20SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF; /指定目的網(wǎng)絡(luò)地址為廣播地址/*單播到一個(gè)設(shè)備*/* WXL_SampleApp_Single_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;   WXL_SampleApp_Single_DstAddr.endPoint = WXL_SAMPLEAPP_ENDPOINT;*/-/閃爍消息:發(fā)送到組 / Setup for the flash command&#

22、39;s destination address - Group1 閃爍消息事件/*設(shè)置 endpoint description.*/SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup; /(組尋址)SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; /EP20SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;   /組號(hào)0x0003/-  / Fil

23、l out the endpoint description./*定義本設(shè)備用來(lái)通信的APS層端點(diǎn)描述符*/SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT; /SampleApp EP描述符的EP號(hào):20SampleApp_epDesc.task_id = &SampleApp_TaskID; /SampleApp EP描述符的任務(wù)ID:0            = (SimpleDescriptionFormat_t *)&

24、;SampleApp_SimpleDesc; /SampleApp EP簡(jiǎn)單描述符SampleApp_epDesc.latencyReq = noLatencyReqs; /延時(shí)策略/ Register the endpoint description with the AF/*向AF層登記EP描述符*/*登記endpoint description 到AF,要對(duì)該應(yīng)用進(jìn)行初始化并在AF進(jìn)行登記,告訴應(yīng)用層有這么一個(gè)EP已經(jīng)開(kāi)通可以使用,那么下層要是有關(guān)于該應(yīng)用的信息或者應(yīng)用要對(duì)下層做哪些操作,就自動(dòng)得到下層的配合。*/afRegister( &SampleApp_epDesc );/ Register for all key events - This app will handle all key events/*登記所有的按鍵事件*/RegisterForKeys( SampleApp_TaskID ); / By default, all devices start out in Group 1 為閃爍消息配置的組/*設(shè)定一個(gè)新的組*/SampleApp_Group.ID = 0x000

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論