什么是鉤子函數(shù)?
鉤子函數(shù)的本質(zhì):還是函數(shù),只是多了一個鉤子的功能。那什么又是鉤子?再去聊鉤子就有點斷章取義了。還是應(yīng)該站在鉤子函數(shù)的應(yīng)用場景來理解。
鉤子函數(shù)在有系統(tǒng)的軟件中應(yīng)用較多,例如我們的FreeRTOS中。系統(tǒng)提供特定的環(huán)境上下文空間執(zhí)行功能。例如在【空閑任務(wù)】中執(zhí)行用戶的代碼。那這個功能該如何實現(xiàn)呢?
假如這個系統(tǒng)是我寫的,也不打算給別人使用,那么……
那么最簡單的方式就是將這部分代碼手動添加到空閑函數(shù)中。這么做現(xiàn)在用當(dāng)然沒什么問題,但是系統(tǒng)級代碼與用戶代碼的耦合度就會非常高。啥子是高耦合,就是你把你的代碼直接嵌入進了系統(tǒng)代碼中,假如后續(xù)官方(也就是你咯)升級了系統(tǒng),你在本地也需要同步升級系統(tǒng)源碼版本。升級后的代碼會直接覆蓋原系統(tǒng)代碼,而你在空閑函數(shù)中添加的用戶級代碼也就沒有了。為了解決這一種情形,于是引入了松耦合的鉤子概念。
解決上述問題的辦法
你需要在空閑任務(wù)中執(zhí)行的函數(shù),只需要通過空閑鉤子,鏈接到系統(tǒng)的空閑任務(wù)中即可。系統(tǒng)并不關(guān)心你的函數(shù)在哪里定義,因為他與系統(tǒng)的代碼是完全分離的,只是在執(zhí)行時才會建立聯(lián)系。這個時候你在升級你的代碼時就不會出現(xiàn)系統(tǒng)代碼覆蓋應(yīng)用代碼的情況。
鉤子函數(shù)的意義
系統(tǒng)提供建立鉤子函數(shù),將對應(yīng)的用戶定義函數(shù)與系統(tǒng)建立應(yīng)用鏈接。當(dāng)系統(tǒng)運行時到相應(yīng)的環(huán)境上下文時,先查找是否有鉤子函數(shù)連接,如果有,那么轉(zhuǎn)而調(diào)用相應(yīng)的函數(shù)。