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