<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                * 導師視頻講解:[**去聽課**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=26) >[success] **技術支持說明:** >**1**.一般以自主學習為主 > **2**.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/zigbee) > **3**.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解! <br/> ## **層次劃分** 通過前面的章節可以了解到,Z-Stack可以被分成多個層次,例如: * MAC層 * NWK(網絡層) * HAL(硬件適配層) * APP(應用層) <br/> ## **任務池初始化** 每一個層次都有一個對應的任務來處理本層次的事務,例如MAC層對應一個MAC層的任務、網絡層對應一個網絡層的任務、HAL對應一個HAL的任務,以及應用層對應一個應用層的任務等,這些各個層次的任務構成一個任務池,這個任務池也就是上節課講到的tasksEvents數組,如圖所示。 ![](https://img.kancloud.cn/fc/bd/fcbd9ad450dd32b813cc50388e647c97_1286x998.png =400x) ### 上節課曾講到的任務池初始化函數osalInitTasks()可以在App目錄下的OSAL_SampleSw.c文件中找到,如圖所示。 ![](https://img.kancloud.cn/fe/fd/fefd536bdfb55c51c94c7fbcb6122b32_1701x1440.png =500x) <br/> osalInitTasks()函數定義代碼如下: ``` /********************************************************************* * @fn osalInitTasks * * @brief This function invokes the initialization function for each task. * * @param void * * @return none */ 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++ ); #if !defined (DISABLE_GREENPOWER_BASIC_PROXY) && (ZG_BUILD_RTR_TYPE) gp_Init( taskID++ ); #endif Hal_Init( taskID++ ); #if defined( MT_TASK ) MT_TaskInit( taskID++ ); #endif APS_Init( taskID++ ); #if defined ( ZIGBEE_FRAGMENTATION ) APSF_Init( taskID++ ); #endif ZDApp_Init( taskID++ ); #if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT ) ZDNwkMgr_Init( taskID++ ); #endif // Added to include TouchLink functionality #if defined ( INTER_PAN ) StubAPS_Init( taskID++ ); #endif // Added to include TouchLink initiator functionality #if defined( BDB_TL_INITIATOR ) touchLinkInitiator_Init( taskID++ ); #endif // Added to include TouchLink target functionality #if defined ( BDB_TL_TARGET ) touchLinkTarget_Init( taskID++ ); #endif zcl_Init( taskID++ ); bdb_Init( taskID++ ); zclSampleSw_Init( taskID++ ); #if (defined OTA_CLIENT) && (OTA_CLIENT == TRUE) zclOTA_Init( taskID ); #endif } ``` >[warning] 這個函數的代碼較為復雜,讀者暫時按照筆者的講解思路簡單地了解一下其中的原理就可以了。 這個函數首先申請了一個任務池存儲空間,也就是這個tasksEvents數組。接著調用了很多帶有“init”字樣的函數,這些函數的作用是初始化各個層次的任務,例如: * 調用macTaskInit()函數初始化MAC層的任務。 * 調用nwk_init()函數初始化網絡層的任務。 * 調用zclSampleSw_Init()函數初始化應用層的任務。 這個過程跟《OSAL的任務調度原理》章節中創建和初始化任務池是類似的,它們的主要差別在于: * 首先,任務池存儲的數據結構不同,這里的tasksEvents是一個uint16類型的數組。 * 其次,tasksEvents支持存放多種類型的任務,例如MAC層的任務、網絡層的任務和應用層的任務等。 * 最后,這里的每一個任務中都可能會包含多個待處理事件。 <br/> ## **事件處理函數** OSAL\_SampleSw.c文件中還定義了一個數組,代碼如下: ``` //創建一個元素類型為pTaskEventHandlerFn的數組 1.const?pTaskEventHandlerFn?tasksArr[]?=?{???? 2.??macEventLoop,?//第1個數組元素 3.??nwk_event_loop,?//第2個數組元素 // //第3個數組元素 4.#if?!defined?(DISABLE_GREENPOWER_BASIC_PROXY)?&&?(ZG_BUILD_RTR_TYPE)???? 5.??gp_event_loop,???? 6.#endif?????? // //第4個數組元素 7.??Hal_ProcessEvent,?? //第5個數組元素 8.#if?defined(?MT_TASK?)???? 9.??MT_ProcessEvent,???? 10.#endif???? // //第6個數組元素 11.??APS_event_loop,??? // ?//第7個數組元素 12.#if?defined?(?ZIGBEE_FRAGMENTATION?)???? 13.??APSF_ProcessEvent,???? 14.#endif? // //第8個數組元素 15.??ZDApp_event_loop,???? // //第9個數組元素 16.#if?defined?(?ZIGBEE_FREQ_AGILITY?)?||?defined?(?ZIGBEE_PANID_CONFLICT?)???? 17.??ZDNwkMgr_event_loop,???? 18.#endif???? // //第10個數組元素 19.??//Added?to?include?TouchLink?functionality???? 20.??#if?defined?(?INTER_PAN?)???? 21.????StubAPS_ProcessEvent,???? 22.??#endif???? // //第11個數組元素 23.??//?Added?to?include?TouchLink?initiator?functionality???? 24.??#if?defined?(?BDB_TL_INITIATOR?)???? 25.????touchLinkInitiator_event_loop,???? 26.??#endif???? // //第12個數組元素 27.??//?Added?to?include?TouchLink?target?functionality???? 28.??#if?defined?(?BDB_TL_TARGET?)???? 29.????touchLinkTarget_event_loop,???? 30.??#endif???? // 31.??zcl_event_loop,????//第13個數組元素 32.??bdb_event_loop,????//第14個數組元素 33.??zclSampleSw_event_loop,????//第15個數組元素 // //第16個數組元素 34.#if?(defined?OTA_CLIENT)?&&?(OTA_CLIENT?==?TRUE)???? 35.??zclOTA_event_loop???? 36.#endif???? 37.}; ``` 前面章節中曾經講到,tasksEvents中的每個任務可以包含0個或者多個待處理的事件,而這個數組類型變量pTaskEventHandlerFn是一個函數指針類型變量,用于指向事件對應的處理函數,因此這段代碼定義了一個事件處理函數數組,這個數組中的每一個元素均表示某一個層次任務的事件處理函數,例如: * MAC層任務對應的事件處理函數是macEventLoop(),它專門處理MAC層任務中的事件。 * 網絡層任務對應的事件處理函數是nwk\_event\_loop(),它專門處理網絡層任務中的事件。 * 應用層任務對應的事件處理函數是zclSampleSw\_event\_loop(),它專門處理應用層任中的事件。 <br/> 以應用層事件處理函數zclSampleSw\_event\_loop()為例,可以在zcl\_samplesw.h文件中找到該函數的聲明,代碼如下: ``` /* * Event Process for the task */ extern UINT16 zclSampleSw_event_loop( byte task_id, UINT16 events ); ``` <br/> <br/> ## **項目定制** * 如需項目定制開發,可掃碼添加項目經理好友(注明“**定制**”) * 定制范圍:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技術方案 * 善學坊官網:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非項目定制**勿擾**,此處**非**技術支持
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看