一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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ì)方法,像我們的事件處理機(jī)制基本上都會使用到回調(diào)函數(shù)。

那么就抽了點(diǎn)時(shí)間來聊聊他們:

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

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

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

在軟件設(shè)計(jì)領(lǐng)域分層設(shè)計(jì)方式是非常廣泛的,在嵌入式中最簡單的分層就是兩層"驅(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接口返回?cái)?shù)據(jù),這樣可能會導(dǎo)致不斷的IO操作,效率相對比較低下。

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

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

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

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

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

把中斷看成一種事件類型,那么回調(diào)函數(shù)的使用其實(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í)行,從而大大提高程序運(yùn)行效率,但由于異步回調(diào)函數(shù)在時(shí)間上是無序的,導(dǎo)致當(dāng)我們需要異步調(diào)用函數(shù)能夠順序執(zhí)行時(shí)便會存在難度,使得業(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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5152

    文章

    19675

    瀏覽量

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

    關(guān)注

    180

    文章

    7632

    瀏覽量

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

    關(guān)注

    0

    文章

    88

    瀏覽量

    11896

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

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

    ARM嵌入式系統(tǒng)開發(fā)軟件設(shè)計(jì)與優(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ā)軟件的時(shí)候還要兼顧硬件知識,這樣的開發(fā)模式主要有兩點(diǎn)缺點(diǎn).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ī)運(yùn)行。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 ?28次下載

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

    已經(jīng)開發(fā)了許多開發(fā)工具和支持的硬件和軟件產(chǎn)品,以幫助減少嵌入式開發(fā)風(fēng)險(xiǎn),加快從小型消費(fèi)設(shè)備到高性能工業(yè)控制和遙感設(shè)備等各種產(chǎn)品的上市時(shí)間。
    發(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的安裝教程資料免費(fèi)下載

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

    嵌入式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ā)人員必須懂硬件。③軟件的功能性差,在這里指的是用戶體驗(yàn)和功能差。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ā)軟件的時(shí)候還要兼顧硬件知識,這樣的開發(fā)模式主要有兩點(diǎn)缺點(diǎn).1:
    發(fā)表于 11-02 19:21 ?15次下載
    <b class='flag-5'>嵌入式開發(fā)</b>概述

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

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

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

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