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

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

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

5個(gè)使用帶有中斷的回調(diào)的技巧

PCB線路板打樣 ? 來源:LONG ? 2019-08-09 09:18 ? 次閱讀

回調(diào)是對(duì)更高級(jí)別軟件傳遞到函數(shù)的可執(zhí)行代碼的引用。這些回調(diào)能夠極大地提高嵌入式軟件的可移植性和重用性,但是根據(jù)它們的定義,它們需要使用函數(shù)指針,如果不仔細(xì)使用,可能會(huì)非常危險(xiǎn)。以下是在嵌入式系統(tǒng)中安全地創(chuàng)建和使用回調(diào)的五個(gè)技巧,特別是將它們與中斷一起使用。

技巧1 -創(chuàng)建集合或注冊(cè)方法- 回調(diào)是最常見的是將函數(shù)指針傳遞給函數(shù),但它們也可以在便攜式系統(tǒng)中用于設(shè)置將由中斷服務(wù)例程(ISR)調(diào)用的函數(shù)。當(dāng)中斷觸發(fā)時(shí),中斷處理程序?qū)瑢?duì)應(yīng)該執(zhí)行的函數(shù)的引用。為了以可重用的方式設(shè)置被調(diào)用的函數(shù),創(chuàng)建允許回調(diào)函數(shù)向模塊注冊(cè)的接口會(huì)很有幫助。創(chuàng)建寄存器或集合函數(shù)允許ISR處理程序是通用的,封裝的,甚至可以編譯為外設(shè)庫的一部分。中斷的可執(zhí)行函數(shù)將在運(yùn)行時(shí)設(shè)置。

技巧2 -將回調(diào)初始化為NULL或默認(rèn)- 創(chuàng)建包含回調(diào)寄存器或設(shè)置功能的外設(shè)驅(qū)動(dòng)程序接口是創(chuàng)建可移植中斷的重要一步。但是有一個(gè)問題:如果回調(diào)永遠(yuǎn)不會(huì)被注冊(cè)但是中斷變?yōu)閱⒂萌缓笥|發(fā)會(huì)發(fā)生什么?中斷服務(wù)程序需要某種方式來判斷是否已注冊(cè)回調(diào)函數(shù)。提供此類驗(yàn)證的最簡單方法是首先將回調(diào)函數(shù)指針初始化為NULL。在ISR中對(duì)NULL進(jìn)行簡單檢查將阻止任何處理程序執(zhí)行。使用NULL的另一種方法是初始化指向通用和空中斷處理程序的指針。當(dāng)未初始化的中斷回調(diào)被觸發(fā)時(shí),默認(rèn)處理程序?qū)⑦\(yùn)行。

技巧3 -使用前驗(yàn)證回調(diào)- 將回調(diào)指針的初始值設(shè)置為NULL或通用處理程序允許中斷驗(yàn)證中斷處理程序是組。但是,在使用函數(shù)指針時(shí),首先要確認(rèn)內(nèi)存中引用的位置不是NULL并且確實(shí)存在于系統(tǒng)中是一個(gè)好主意。函數(shù)指針可能非常危險(xiǎn),在進(jìn)行調(diào)用之前應(yīng)注意確保指向的位置有效。

提示4 -使用回調(diào)向較低級(jí)別的固件添加功能- 回調(diào)函數(shù)對(duì)于在通用和應(yīng)用程序中向較低級(jí)別驅(qū)動(dòng)程序和應(yīng)用程序代碼添加功能非常有用特定的方式。為了生成松散耦合且具有高內(nèi)聚性的固件,開發(fā)人員可以通過使用回調(diào)將中斷向量和對(duì)其他外圍模塊的引用傳遞到驅(qū)動(dòng)程序中?;卣{(diào)允許開發(fā)人員在設(shè)計(jì)時(shí)添加特定于應(yīng)用程序的功能,而無需不斷修改驅(qū)動(dòng)程序代碼以獲得所需的行為??梢酝ㄟ^這種方式使用回調(diào)來生成非常干凈,可移植且可重復(fù)使用的固件和接口。

提示5 -創(chuàng)建抽象回調(diào)函數(shù)- 回調(diào)函數(shù)通常需要采用參數(shù)數(shù)量未知,它們可能會(huì)也可能不會(huì)返回?cái)?shù)據(jù),具體取決于應(yīng)用程序的需求。然而,開發(fā)人員的目標(biāo)是編寫抽象的回調(diào)函數(shù)。對(duì)于與中斷相關(guān)的回調(diào),其中回調(diào)只是作為中斷服務(wù)程序的一部分被調(diào)用,該函數(shù)可以獲取void參數(shù)并返回void。需要與應(yīng)用程序共享的任何數(shù)據(jù)都將以與中斷相同的方式處理。對(duì)于可能與錯(cuò)誤處理或其他自定義功能相關(guān)的驅(qū)動(dòng)程序的回調(diào),處理參數(shù)和返回值的最簡單方法是傳遞指針并返回指針。

最后的想法

回調(diào)可以在嵌入式系統(tǒng)中找到廣泛的用途,特別是在開發(fā)便攜式和可重復(fù)使用的固件時(shí)。本文提供了五個(gè)開發(fā)人員如何考慮和實(shí)現(xiàn)中斷回調(diào)的示例,但它們只是其中的一小部分。

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

    關(guān)注

    17

    文章

    2968

    瀏覽量

    21760
  • 華強(qiáng)PCB
    +關(guān)注

    關(guān)注

    8

    文章

    1831

    瀏覽量

    27847
  • 華強(qiáng)pcb線路板打樣

    關(guān)注

    5

    文章

    14629

    瀏覽量

    43109
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    調(diào)函數(shù)小結(jié)

    調(diào) 作用: 方便層與層的隔離,方便系統(tǒng)功能的擴(kuò)展,比如編寫一個(gè)比較函數(shù),通過調(diào)方法編寫,可以將應(yīng)用層的比較函數(shù)實(shí)現(xiàn)無限制類型的數(shù)據(jù)比較,
    發(fā)表于 07-05 01:51

    調(diào)函數(shù)和中斷處理函數(shù)的關(guān)系

    結(jié)論看完本文,大家可能對(duì)調(diào)函數(shù)和中斷處理函數(shù)的關(guān)系產(chǎn)生了疑問。其實(shí)是這樣的,單片機(jī)每完成接收一個(gè)字符,就會(huì)進(jìn)入一次中斷處理函數(shù),而在
    發(fā)表于 08-13 08:34

    如何確定中斷調(diào)函數(shù)的函數(shù)名

    問題有個(gè)通用的解法。下面以ADC1為例,來查找它的中斷調(diào)函數(shù)。首先打開CubeMX生成的代碼,找到所有中斷函數(shù)入口的C文件首先需要編譯一下
    發(fā)表于 12-06 06:21

    怎么才能在中斷調(diào)函數(shù)里用延時(shí)呢?

    中斷調(diào)函數(shù)里不可以用 rt_thread_mdelay,怎么才能在調(diào)函數(shù)里用延時(shí)呢?
    發(fā)表于 04-20 09:32

    怎樣去解決外部中斷調(diào)函數(shù)執(zhí)行錯(cuò)誤的問題呢

    我想問個(gè)事,正在使用外部中斷。配置好引腳,綁定中斷調(diào)函數(shù)。一開始為了驗(yàn)證編程正確,能進(jìn)入調(diào)
    發(fā)表于 08-22 14:22

    詳解java 調(diào)機(jī)制

    代碼示例 接下來看一下調(diào)的代碼示例,代碼模擬的是這樣一種場(chǎng)景:老師問學(xué)生問題,學(xué)生思考完畢回答老師。 首先定義一個(gè)調(diào)接口,只有一
    發(fā)表于 09-28 13:14 ?0次下載

    LabWindows/CVI 程序 調(diào)函數(shù)設(shè)計(jì)

    調(diào)函數(shù)是系統(tǒng)框架設(shè)計(jì)中非常重要的一種手段,所謂調(diào)函數(shù)(callback )是指一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。
    發(fā)表于 05-03 16:54 ?1.1w次閱讀
    LabWindows/CVI 程序 <b class='flag-5'>回</b><b class='flag-5'>調(diào)</b>函數(shù)設(shè)計(jì)

    調(diào)函數(shù)的詳細(xì)資料說明

    異步事件的處理,首先將異步事件發(fā)生時(shí)需要執(zhí)行的代碼編寫成一個(gè)函數(shù),并將該函數(shù)注冊(cè)成為調(diào)函數(shù),這樣當(dāng)該異步事件發(fā)生時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用事先注冊(cè)好的調(diào)
    發(fā)表于 02-28 08:00 ?6次下載
    <b class='flag-5'>回</b><b class='flag-5'>調(diào)</b>函數(shù)的詳細(xì)資料說明

    STM32Cube HAL庫中斷處理機(jī)制 以及調(diào)函數(shù)實(shí)現(xiàn)原理

    STM32Cube HAL庫中斷處理機(jī)制,以及調(diào)函數(shù)實(shí)現(xiàn)原理
    的頭像 發(fā)表于 03-03 14:01 ?1.3w次閱讀

    C語言函數(shù)的調(diào)函數(shù)

    ,如果過后再執(zhí)行,則稱之為異步調(diào)。 調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一
    的頭像 發(fā)表于 09-11 09:57 ?4162次閱讀

    HAL庫中斷處理以及相關(guān)的調(diào)函數(shù)

    驅(qū)動(dòng)的開發(fā)時(shí)間,把重心放在應(yīng)用代碼上。 ? 但是,STM32CubeMX只是生成了底層驅(qū)動(dòng)的初始化代碼。所以,我們還需要掌握:應(yīng)用層代碼如何調(diào)用HAL庫函數(shù)(API接口),以及HAL庫中斷處理機(jī)制等相關(guān)知識(shí)。? HAL庫牽涉的內(nèi)容較多,下面簡單描述一下HAL庫中斷處理,以
    的頭像 發(fā)表于 01-07 11:46 ?9507次閱讀
    HAL庫<b class='flag-5'>中斷</b>處理以及相關(guān)的<b class='flag-5'>回</b><b class='flag-5'>調(diào)</b>函數(shù)

    STM32編程時(shí),如何確定中斷調(diào)函數(shù)的入口

    問題有個(gè)通用的解法。下面以ADC1為例,來查找它的中斷調(diào)函數(shù)。首先打開CubeMX生成的代碼,找到所有中斷函數(shù)入口的C文件首先需要編譯一下
    發(fā)表于 11-23 18:06 ?13次下載
    STM32編程時(shí),如何確定<b class='flag-5'>中斷</b><b class='flag-5'>回</b><b class='flag-5'>調(diào)</b>函數(shù)的入口

    根據(jù)調(diào)機(jī)制注冊(cè)事件并處理調(diào)VI

    通過事件調(diào)注冊(cè)函數(shù)(Register Event Callback)注冊(cè)一個(gè)調(diào)VI,在事件發(fā)生時(shí)會(huì)運(yùn)行該回
    的頭像 發(fā)表于 11-24 09:15 ?2369次閱讀

    C語言|調(diào)函數(shù)的不同用法

    調(diào)函數(shù)是個(gè)高級(jí)操作技巧,也是日常項(xiàng)目中常常使用到的技能。之所以說調(diào)函數(shù)是個(gè)高級(jí)操作技巧,是因
    發(fā)表于 07-10 10:34 ?1336次閱讀

    調(diào)函數(shù)(callback)是什么?調(diào)函數(shù)的實(shí)現(xiàn)方法

    調(diào)函數(shù)是一種特殊的函數(shù),它作為參數(shù)傳遞給另一個(gè)函數(shù),并在被調(diào)用函數(shù)執(zhí)行完畢后被調(diào)用。調(diào)函數(shù)通常用于事件處理、異步編程和處理各種操作系統(tǒng)和
    發(fā)表于 03-12 11:46 ?3064次閱讀