Z-stack中回調函數及回調機制的分析

在Z-Stack中大量使用了回調函數,例如OnBoard_KeyCallback,Onboard_TimerCallBack,這些都是回調函數,以前沒有接觸過回調函數,看來自己掌握的知識還是少啊,據說在C++中,VC++中經常用到,特別是在STL中也是大量使用了回調函數,看來回調函數的用處還是很大的。爲了搞清楚回調函數是什麼,以及怎麼使用,在網上搜集了一些資料,基本上搞清楚了回調函數。
   回調函數從字面上可以看出,它一定是一個函數,但是這個函數有什麼特別之處呢?孤立的單看這個函數基本和普通的函數沒有什麼區別,關鍵是在使用上,也就是調用這個回調函數的函數會有一些特別,特別之處就在於一般情況下,調用回調函數的函數(這裏稱之爲B函數)中的參數,其中之一是函數的指針,並且在B函數中要使用到回調函數。這樣和別的函數整個聯繫起來,才真正的構成了回調函數。孤立看一個函數是看不出這個函數是不是回調函數時,當然也可以通過看函數的名字看出來,呵呵!其實,回調函數就是函數指針的一種用法。只是這種用法把有些細節封裝了。
   回調函數一般是由編程人員自己寫的。這裏有一個例子,假設有一個快速排序的函數,快速排序需要首先比較兩個數的大小,那這兩個數可能是int型,char型,long型,如果都放到了快速排序函數處理這樣類型,那麼函數就會顯得通用性不夠,這時就可以使用回調函數了,就是程序自己寫一個函數,這個函數用來比較數的大小,而快速排序函數只需要做的就是在函數的參數列表中,有一個函數的指針,這個函數指針中有兩個指針參數,然後,在快速排序中就根據這個回調函數的返回結果來判斷兩個數的大小。當我們要使用這個排序算法時,其實在這個排序算法中也使用了我們自己的一個函數,那這個函數就是回調函數,當然,這個例子還是有點勉強,也可以使用C++的模板把類型封裝起來,也應該是一種很好的方法。只不過我的C++學的實在不盡人入意。這裏只是爲了說明這種情況。
   其實,在調用回調函數的函數(B函數)中,其中一個參數是函數的指針,那麼這個函數指針中也有一定的參數。也就是說只要符合我這個B函數中函數指針的格式,都可以當作回調函數,B函數並不關心你這個函數是實現什麼功能的。那這個回調函數的實現就交給了程序員,程序員可以在程序中定義不同的功能。這就相當主一個公式,就按格式套用就可以了。
這裏有一個很簡單的回調函數。
#include <stdio.h>
 
void printWelcome(int len)
{
       printf("Welcom -- %d\n", len);
}
 
void printGoodbye(int len)
{
       printf("Goodbye -- %d\n", len);
}
 
void callback(int times, void (* print)(int))
{
       int i;
       for (i = 0; i < times; ++i)
       {
              print(i);
       }
}
void main(void)
{
       callback(10, printWelcome);
       callback(10, printGoodbye);
       printWelcome(5);
}
   在網上找了一篇用分層的概念來解釋了回調機制:callback函數爲B層,main函數和print*函數爲A層,A層調用了B層的回調函數callmeback,而B層的回調函數調用了A層的實現函數print*。說白了B層就是一個接口。
      說了這麼多似乎和我們的Z-Stack協議棧沒有任何的聯繫,下面就以一個按鍵的回調函數爲例,看看在其中是怎麼使用回調函數的。其中,協議中和定時器,UART口等很多地方都使用了回調函數,正確理解回調函數也有助於理解協議的流程。其實下面這張圖,不僅可以表示出回調函數,還可以表現出Key事件是怎麼觸發的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章