在嵌入式開發軟件中回調函數是經常接觸的一種軟件設計方法,像我們的事件處理機制基本上都會使用到回調函數。
那么就抽了點時間來聊聊他們:
什么是回調函數?
在C語言中,回調函數其實與函數指針的調用在語法上并沒有太大的差異,而為什么叫回調函數主要還是從功能上給它起的名字,即這個函數會被"返回來調用"。
而這里所謂的“返回”就涉及到一個方向性問題,從哪里來到哪里去。而在軟件中通常就是與“分層設計思想”掛鉤的。
在軟件設計領域分層設計方式是非常廣泛的,在嵌入式中最簡單的分層就是兩層"驅動層"和“應用層”。
當函數功能上進行分層以后不應該直接在底層驅動中直接調用應用層函數等,比如應用程序通過調用驅動層接口獲得物理量數據,我們常規的做法大部分都是不斷的輪詢相應的API接口返回數據,這樣可能會導致不斷的IO操作,效率相對比較低下。
那么應用程序是否可以化主動為被動呢,一直舔狗實在是太累了?既然你現在不想搭理我,那等你準備好了,再來告訴我吧,到時候調用我給你的函數就可以了,這個函數已經放在了傳給你的函數指針里了,那么這里應用程序所給的函數就是回調函數。
比如我們經常會在應用程序中查詢按鍵是否被按下,然后得編寫一大堆的時序等等,還與應用邏輯耦合在一起。
其實按鍵是是如何檢測被按下的過程對于應用程序它并關心,底層程序查詢確定好狀態給應用程序一個是否按下的通知或者狀態即可。
此時底層按鍵檢測程序要通知應用程序,就可以通過相應的回調函數來通知應用層并處理即可。
如果還有點難理解,可以看看stm32使用hal庫,你會發現在中斷中有大量的回調函數指針被調用,其實回調函數的效果與中斷服務函數的執行效果是類似的,hal庫中使用回調函數的方式把中斷的相關事件服務處理交給了用戶自身來注冊。
把中斷看成一種事件類型,那么回調函數的使用其實就類似于一種事件驅動機制。
同步與異步調用
首先要理清楚這兩種方式需要理解什么是同步和異步。
同步調用表示當調用一個底層接口,必須回調函數被執行完畢,不然該接口會一直處于堵塞狀態沒辦法返回結果,且程序無法往下執行。
異步調用表示當調用一個底層接口以后,不需要等待回調函數執行完畢,便可以直接返回繼續做下面的事情,最終底層準備好以后便會執行回調函數處理應用層事務,所以我們也稱這種回調函數為異步回調函數。
而異步調用的好處在于調用函數不需要阻塞可以繼續執行,從而大大提高程序運行效率,但由于異步回調函數在時間上是無序的,導致當我們需要異步調用函數能夠順序執行時便會存在難度,使得業務邏輯比較復雜,難以理解。
為了保證回調的有序性,就需要以上一次回調的結果作為本次異步調用的條件,導致代碼一層嵌套一層非常的冗長,類似于ifelse里面再嵌套ifelse之勢,所以也很多人稱這種方式為 Callback hell(回調地獄)。
為了改善這種結構,通常會采用協程的概念去處理異步回調來規避該問題。對于異步調用常與多線程進行結合,在另外一個線程中執行異步操作,然后調用回調函數返回結果并繼續處理。
原文標題:嵌入式軟件中回調函數同步與異步調用
文章出處:【微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
審核編輯:湯梓紅
-
嵌入式
+關注
關注
5092文章
19177瀏覽量
307665 -
C語言
+關注
關注
180文章
7614瀏覽量
137712 -
回調函數
+關注
關注
0文章
87瀏覽量
11622
原文標題:嵌入式軟件中回調函數同步與異步調用
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論