0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式開發(fā)軟件中回調(diào)函數(shù)的使用

strongerHuang ? 來源:最后一個bug ? 作者:最后一個bug ? 2022-04-29 08:57 ? 次閱讀

嵌入式開發(fā)軟件中回調(diào)函數(shù)是經(jīng)常接觸的一種軟件設(shè)計方法,像我們的事件處理機(jī)制基本上都會使用到回調(diào)函數(shù)。

那么就抽了點時間來聊聊他們:

什么是回調(diào)函數(shù)?

C語言中,回調(diào)函數(shù)其實與函數(shù)指針的調(diào)用在語法上并沒有太大的差異,而為什么叫回調(diào)函數(shù)主要還是從功能上給它起的名字,即這個函數(shù)會被"返回來調(diào)用"。

而這里所謂的“返回”就涉及到一個方向性問題,從哪里來到哪里去。而在軟件中通常就是與“分層設(shè)計思想”掛鉤的。

在軟件設(shè)計領(lǐng)域分層設(shè)計方式是非常廣泛的,在嵌入式中最簡單的分層就是兩層"驅(qū)動層"和“應(yīng)用層”。

4bcec1ec-c754-11ec-bce3-dac502259ad0.png

當(dāng)函數(shù)功能上進(jìn)行分層以后不應(yīng)該直接在底層驅(qū)動中直接調(diào)用應(yīng)用層函數(shù)等,比如應(yīng)用程序通過調(diào)用驅(qū)動層接口獲得物理量數(shù)據(jù),我們常規(guī)的做法大部分都是不斷的輪詢相應(yīng)的API接口返回數(shù)據(jù),這樣可能會導(dǎo)致不斷的IO操作,效率相對比較低下。

那么應(yīng)用程序是否可以化主動為被動呢,一直舔狗實在是太累了?既然你現(xiàn)在不想搭理我,那等你準(zhǔn)備好了,再來告訴我吧,到時候調(diào)用我給你的函數(shù)就可以了,這個函數(shù)已經(jīng)放在了傳給你的函數(shù)指針里了,那么這里應(yīng)用程序所給的函數(shù)就是回調(diào)函數(shù)。

比如我們經(jīng)常會在應(yīng)用程序中查詢按鍵是否被按下,然后得編寫一大堆的時序等等,還與應(yīng)用邏輯耦合在一起。

其實按鍵是是如何檢測被按下的過程對于應(yīng)用程序它并關(guān)心,底層程序查詢確定好狀態(tài)給應(yīng)用程序一個是否按下的通知或者狀態(tài)即可。

此時底層按鍵檢測程序要通知應(yīng)用程序,就可以通過相應(yīng)的回調(diào)函數(shù)來通知應(yīng)用層并處理即可。

如果還有點難理解,可以看看stm32使用hal庫,你會發(fā)現(xiàn)在中斷中有大量的回調(diào)函數(shù)指針被調(diào)用,其實回調(diào)函數(shù)的效果與中斷服務(wù)函數(shù)的執(zhí)行效果是類似的,hal庫中使用回調(diào)函數(shù)的方式把中斷的相關(guān)事件服務(wù)處理交給了用戶自身來注冊。

把中斷看成一種事件類型,那么回調(diào)函數(shù)的使用其實就類似于一種事件驅(qū)動機(jī)制。

同步與異步調(diào)用

首先要理清楚這兩種方式需要理解什么是同步和異步。

同步調(diào)用表示當(dāng)調(diào)用一個底層接口,必須回調(diào)函數(shù)被執(zhí)行完畢,不然該接口會一直處于堵塞狀態(tài)沒辦法返回結(jié)果,且程序無法往下執(zhí)行。

異步調(diào)用表示當(dāng)調(diào)用一個底層接口以后,不需要等待回調(diào)函數(shù)執(zhí)行完畢,便可以直接返回繼續(xù)做下面的事情,最終底層準(zhǔn)備好以后便會執(zhí)行回調(diào)函數(shù)處理應(yīng)用層事務(wù),所以我們也稱這種回調(diào)函數(shù)為異步回調(diào)函數(shù)。

而異步調(diào)用的好處在于調(diào)用函數(shù)不需要阻塞可以繼續(xù)執(zhí)行,從而大大提高程序運行效率,但由于異步回調(diào)函數(shù)在時間上是無序的,導(dǎo)致當(dāng)我們需要異步調(diào)用函數(shù)能夠順序執(zhí)行時便會存在難度,使得業(yè)務(wù)邏輯比較復(fù)雜,難以理解。

為了保證回調(diào)的有序性,就需要以上一次回調(diào)的結(jié)果作為本次異步調(diào)用的條件,導(dǎo)致代碼一層嵌套一層非常的冗長,類似于ifelse里面再嵌套ifelse之勢,所以也很多人稱這種方式為 Callback hell(回調(diào)地獄)。

為了改善這種結(jié)構(gòu),通常會采用協(xié)程的概念去處理異步回調(diào)來規(guī)避該問題。對于異步調(diào)用常與多線程進(jìn)行結(jié)合,在另外一個線程中執(zhí)行異步操作,然后調(diào)用回調(diào)函數(shù)返回結(jié)果并繼續(xù)處理。

原文標(biāo)題:嵌入式軟件中回調(diào)函數(shù)同步與異步調(diào)用

文章出處:【微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5059

    文章

    18973

    瀏覽量

    302033
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7594

    瀏覽量

    135858
  • 回調(diào)函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    87

    瀏覽量

    11528

原文標(biāo)題:嵌入式軟件中回調(diào)函數(shù)同步與異步調(diào)用

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    ARM嵌入式系統(tǒng)開發(fā)軟件設(shè)計與優(yōu)化

    ARM嵌入式系統(tǒng)開發(fā)軟件設(shè)計與優(yōu)化
    發(fā)表于 02-03 11:31

    嵌入式單片機(jī)開發(fā)軟件CodeWarrior怎么下載?如何安裝?

    嵌入式單片機(jī)開發(fā)軟件CodeWarrior怎么下載?如何安裝?
    發(fā)表于 10-09 09:04

    什么是嵌入式傳統(tǒng)開發(fā)軟件直接控制硬件

    什么是嵌入式傳統(tǒng)開發(fā)軟件直接控制硬件,比如51單片機(jī)開發(fā),在開發(fā)軟件的時候還要兼顧硬件知識,這樣的開發(fā)模式主要有兩點缺點.1:
    發(fā)表于 11-05 07:07

    嵌入式web服務(wù)器boa-0.94.13開發(fā)軟件

    嵌入式web服務(wù)器boa-0.94.13開發(fā)軟件
    發(fā)表于 03-11 09:48 ?26次下載

    Ubuntu嵌入式開發(fā)環(huán)境的建立

    嵌入式開發(fā)一般使用交叉開發(fā)環(huán)境,即上位機(jī)開發(fā)軟件然后下載到在下位機(jī)運行。1.1. 上位機(jī)軟件開發(fā)環(huán)境的構(gòu)建我主要使用Ubuntu 8.04進(jìn)行開發(fā)
    發(fā)表于 07-10 14:49 ?38次下載

    arm開發(fā)軟件使用教程

    arm開發(fā)軟件使用教程
    發(fā)表于 02-08 00:52 ?27次下載

    工業(yè)用SBCS嵌入式開發(fā)軟件的選擇技巧

    已經(jīng)開發(fā)了許多開發(fā)工具和支持的硬件和軟件產(chǎn)品,以幫助減少嵌入式開發(fā)風(fēng)險,加快從小型消費設(shè)備到高性能工業(yè)控制和遙感設(shè)備等各種產(chǎn)品的上市時間。
    發(fā)表于 10-30 17:38 ?5次下載
    工業(yè)用SBCS<b class='flag-5'>嵌入式開發(fā)軟件</b>的選擇技巧

    嵌入式軟件開發(fā)是什么該如何理解

    對于嵌入式開發(fā)軟件來說,可以把嵌入式軟件開發(fā)分成2個工作崗位。一個是應(yīng)用開發(fā),另一個是底層開發(fā)。
    發(fā)表于 09-18 17:19 ?2.2w次閱讀

    嵌入式系統(tǒng)仿真開發(fā)軟件proteus8.9的安裝教程資料免費下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是嵌入式系統(tǒng)仿真開發(fā)軟件proteus8.9的安裝教程資料免費下載。
    發(fā)表于 04-08 08:00 ?70次下載
    <b class='flag-5'>嵌入式</b>系統(tǒng)仿真<b class='flag-5'>開發(fā)軟件</b>proteus8.9的安裝教程資料免費下載

    嵌入式Linux內(nèi)核驅(qū)動開發(fā)學(xué)習(xí)路線圖

    嵌入式Linux內(nèi)核驅(qū)動開發(fā)學(xué)習(xí)路線圖(嵌入式開發(fā)軟件工程師)-嵌入式Linux內(nèi)核驅(qū)動開發(fā)學(xué)習(xí)路線圖? ? ? ? ? ? ??
    發(fā)表于 07-30 13:51 ?12次下載
    <b class='flag-5'>嵌入式</b>Linux內(nèi)核驅(qū)動<b class='flag-5'>開發(fā)</b>學(xué)習(xí)路線圖

    嵌入式模擬題

    嵌入式模擬題(嵌入式開發(fā)軟件)-嵌入式模擬題? ? ? ? ? ? ? ? ? ?
    發(fā)表于 07-30 14:32 ?20次下載
    <b class='flag-5'>嵌入式</b>模擬題

    淺談嵌入式開發(fā)

    ?①軟件的移植性差。②軟件開發(fā)人員必須懂硬件。③軟件的功能性差,在這里指的是用戶體驗和功能差。4.嵌入式開發(fā)與傳統(tǒng)開發(fā)的區(qū)別是什么呢?是否移
    發(fā)表于 10-20 14:50 ?2次下載
    淺談<b class='flag-5'>嵌入式開發(fā)</b>

    嵌入式開發(fā)概述

    什么是嵌入式傳統(tǒng)開發(fā)軟件直接控制硬件,比如51單片機(jī)開發(fā),在開發(fā)軟件的時候還要兼顧硬件知識,這樣的開發(fā)模式主要有兩點缺點.1:
    發(fā)表于 11-02 19:21 ?15次下載
    <b class='flag-5'>嵌入式開發(fā)</b>概述

    嵌入式開發(fā)概述(20190325小結(jié))

    一.嵌入式開發(fā)概述:嵌入式:在已有硬件上移植操作系統(tǒng),解決軟硬件耦合度高導(dǎo)致的問題。(打個比方:軟件的實現(xiàn)是為了調(diào)用open()函數(shù),那么嵌入式開發(fā)
    發(fā)表于 11-02 21:05 ?15次下載
    <b class='flag-5'>嵌入式開發(fā)</b>概述(20190325小結(jié))

    ??嵌入式調(diào)函數(shù)的實現(xiàn)方法

    調(diào)函數(shù)的命名規(guī)范沒有固定的標(biāo)準(zhǔn),但是根據(jù)通用慣例和編碼規(guī)范,調(diào)函數(shù)的命名應(yīng)該能夠反映
    發(fā)表于 03-04 14:49 ?637次閱讀