色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式函數回調注冊機制的實現

CHANBAEK ? 來源:南山府嵌入式 ? 作者:編外人員 ? 2023-04-13 15:52 ? 次閱讀

簡介:

嵌入式函數回調注冊機制是一種常用的解耦技術,它通過在應用程序中注冊回調函數的方式來實現模塊之間的通信,從而使系統更加靈活、可擴展和易于維護。 函數回調注冊機制可以通過函數指針和回調函數來實現。

的地址存儲到函數指針中,我們可以實現將回調函數注冊到事件源中。

本篇我就根據STM32單片機這方面進行一個說明其他單片機或微控制器的用法是一樣的。 了解大致的思路、方式方法。

什么是函數回調注冊機制?

函數回調注冊機制是一種常見的編程技術,它允許我們在程序運行時動態地注冊函數回調,并在適當的時候調用這些回調函數。 回調函數通常用于實現事件處理、狀態通知、消息傳遞等功能,可以極大地提高程序的靈活性和可擴展性。

函數回調注冊機制的基本思想是:將一個函數的指針作為參數傳遞給另一個函數,然后在需要調用這個函數時,直接調用它的指針即可。 通過這種方式,我們可以將函數的調用權交給其他函數,從而實現動態的、靈活的、可擴展的程序設計。

在函數回調注冊機制中,通常會定義一個回調函數類型,用于指定回調函數的參數和返回值類型。 然后,我們可以定義一個函數,用于注冊回調函數,將回調函數的指針保存在全局變量中。 在需要調用回調函數的地方,我們可以檢查回調函數指針是否為 NULL,如果不為 NULL,則調用回調函數。

函數回調注冊機制在嵌入式系統中得到廣泛應用,特別是在處理事件和中斷時。 通過動態注冊回調函數,我們可以更靈活地處理不同類型的事件和中斷,從而提高系統的可靠性和效率。

實現的大致步驟

定義回調函數類型

首先需要定義一個回調函數類型,用于指定回調函數的參數和返回值類型。 例如:

typedef void (*callback_func_t)(int arg1, float arg2);

上述代碼定義了一個回調函數類型 'callback_func_targ1和浮點型arg2,返回值為void。

定義回調函數

根據定義的回調函數類型,需要定義相應的回調函數。 例如:

void callback_function(int arg1, float arg2) 
{ 
 // 回調函數的具體實現
}

上述代碼定義了一個名為 'callbackcallback_func_t類型相匹配,可以作為回調函數使用。

定義回調函數注冊函數

定義一個函數,用于注冊回調函數,將回調函數的指針保存在全局變量中。 例如

void register_callback(callback_func_t callback) 
{
    // 保存回調函數指針到全局變量中
    global_callback = callback;
}

調用回調函數

在需要調用回調函數的地方,可以檢查回調函數指針是否為 NULL,如果不為 NULL,則調用回調函數。 例如:

if (global_callback != NULL) {
    global_callback(10, 3.14f);
}

完整的:

1#include 
 2
 3typedef void (*callback_func_t)(int arg1, float arg2);
 4
 5callback_func_t global_callback = NULL;
 6
 7void callback_function(int arg1, float arg2) {
 8    printf("callback_function: arg1=%d, arg2=%f\\n", arg1, arg2);
 9}
10
11void register_callback(callback_func_t callback) {
12    global_callback = callback;
13}
14
15int main() {
16    register_callback(callback_function);
17
18    if (global_callback != NULL) {
19        global_callback(10, 3.14f);
20    }
21
22    return 0;
23}

在單片機中的應用舉例

回調函數是一個指向函數的指針,它可以在某個事件發生時被調用。 在嵌入式系統中,回調函數通常用于響應外部事件或中斷,例如定時器中斷、UART接收中斷等。 使用回調函數,可以將事件處理的邏輯與事件源分離開來,從而提高代碼的可維護性和可重用性。

函數回調注冊機制通常由兩部分組成:注冊函數和回調函數。 注冊函數用于將回調函數注冊到事件源中,以便在事件發生時調用回調函數。 回調函數則用于處理事件,它通常被實現為一個短小精悍的函數,只執行必要的操作,以便盡快地返回到事件源中。

我們可以使用函數指針來實現回調函數的注冊。 函數指針是指向函數的指針變量,它可以存儲一個函數的地址,并且可以被傳遞和調用。 通過將回調函數

1#include "stm32f4xx.h"
 2
 3// 定義一個回調函數類型
 4typedef void (*irq_callback_t)(void);
 5
 6// 定義一個全局變量,用于保存中斷回調函數
 7irq_callback_t irq_callback = NULL;
 8
 9// 定義一個中斷處理函數
10void EXTI0_IRQHandler(void) {
11    // 調用中斷回調函數
12    if (irq_callback) {
13        irq_callback();
14    }
15
16    // 清除中斷標志位
17    EXTI_ClearITPendingBit(EXTI_Line0);
18}
19
20// 定義一個函數,用于注冊中斷回調函數
21void register_irq_callback(irq_callback_t cb) {
22    irq_callback = cb;
23}
24
25int main() {
26    // 初始化GPIO和中斷
27    // ...
28
29    // 注冊中斷回調函數
30    register_irq_callback(my_irq_handler);
31
32    // 啟用中斷
33    NVIC_EnableIRQ(EXTI0_IRQn);
34
35    while (1) {
36        // 主循環
37        // ...
38    }
39
40    return 0;
41}
42
43// 定義一個中斷回調函數
44void my_irq_handler(void) {
45    // 處理中斷事件
46    // ...
47}

在上面的示例程序中,我們首先定義了一個回調函數類型irq_callback_t ,它指向一個參數為 void,返回類型為void的函數。 接著,我們定義了一個全局變量irq_callback,用于保存中斷回調函數。 在中斷處理函數EXTI0_IRQHandler中,我們首先判斷irq_callback是否為NULL,如果不為NULL,則調用中斷回調函數。 在函數register_irq_callback中,我們將中斷回調函數指針保存在全局變量irq_callback 中。 在 main函數中,我們注冊了中斷回調函數 ,并啟用了中斷。 在中斷回調函數my_irq_handler中,我們可以處理中斷事件。

注意:,函數回調注冊機制在嵌入式系統中雖然常見,但也需要注意線程安全、內存管理等方面的問題,以保證程序的正確性和可靠性。 此外,函數回調注冊機制還可以用于實現定時器事件。 定時器通常用于周期性地生成定時中斷,并在中斷處理函數中調用注冊的回調函數。

下面是一個使用定時器的例子:

1#include "stm32f4xx.h"
 2
 3// 定義一個回調函數類型
 4typedef void (*timer_callback_t)(void);
 5
 6// 定義一個全局變量,用于保存定時器回調函數
 7timer_callback_t timer_callback = NULL;
 8
 9// 定義一個定時器中斷處理函數
10void TIM2_IRQHandler(void) {
11    // 調用定時器回調函數
12    if (timer_callback) {
13        timer_callback();
14    }
15
16    // 清除中斷標志位
17    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
18}
19
20// 定義一個函數,用于注冊定時器回調函數
21void register_timer_callback(timer_callback_t cb) {
22    timer_callback = cb;
23}
24
25int main() {
26    // 初始化定時器和中斷
27    // ...
28
29    // 注冊定時器回調函數
30    register_timer_callback(my_timer_handler);
31
32    // 啟用定時器
33    TIM_Cmd(TIM2, ENABLE);
34
35    while (1) {
36        // 主循環
37        // ...
38    }
39
40    return 0;
41}
42
43// 定義一個定時器回調函數
44void my_timer_handler(void) {
45    // 處理定時器事件
46    // ...
47}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6035

    文章

    44554

    瀏覽量

    634653
  • 嵌入式
    +關注

    關注

    5082

    文章

    19104

    瀏覽量

    304817
  • STM32
    +關注

    關注

    2270

    文章

    10895

    瀏覽量

    355743
  • 函數
    +關注

    關注

    3

    文章

    4327

    瀏覽量

    62573
  • 函數指針
    +關注

    關注

    2

    文章

    56

    瀏覽量

    3778
收藏 人收藏

    評論

    相關推薦

    調函數小結

    只在自己的形式參數中提供接口(一個函數指針的形式參數變量), 再比如一個應用層與底層隔離,應用層通過參數回調底層不同的處理函數,而底層實現
    發表于 07-05 01:51

    嵌入式系統上消息機制實現

    圖形用戶界面是嵌入式系統中重要部分,是用戶與系統進行交互的樞紐,如何建立一個有效的消息機制實現消息從用戶到系統的傳遞,以及系統對消息的處理如何再反映到圖形
    發表于 06-16 08:52 ?16次下載

    基于Chirp函數的Nios Ⅱ嵌入式實現

    分析Chirp函數在頻域上的一般特性,提出利用FPGA的嵌入式軟核NiosⅡ處理器在嵌入式操作系統μC/OS-Ⅱ上實現Chirp的方法
    發表于 06-15 11:02 ?1166次閱讀
    基于Chirp<b class='flag-5'>函數</b>的Nios Ⅱ<b class='flag-5'>嵌入式</b><b class='flag-5'>實現</b>

    注冊機UltraEdit

    注冊機UltraEdit注冊機UltraEdit注冊機UltraEdit
    發表于 12-28 14:30 ?6次下載

    KeiluVision4_p注冊機

    KeiluVision4_p注冊機jKeiluVision4_p注冊機jKeiluVision4_p注冊機jKeiluVision4_p注冊機j
    發表于 02-19 14:58 ?12次下載

    Delphi教程之軟件注冊機制的建立

    Delphi教程之軟件注冊機制的建立,很好的Delphi資料,快來下載吧。
    發表于 04-11 16:09 ?5次下載

    C#教程之注冊注冊機制

    C#教程之注冊注冊機制,很好的C#資料,快來學習吧。
    發表于 04-21 09:52 ?17次下載

    STM32Cube HAL庫中斷處理機制 以及回調函數實現原理

    STM32Cube HAL庫中斷處理機制,以及回調函數實現原理
    的頭像 發表于 03-03 14:01 ?1.3w次閱讀

    C語言函數的回調函數

    來源:嵌入式客棧 1 什么是回調函數?首先什么是回調呢? 我的理解是:把一段可執行的代碼像參數傳遞那樣傳給其他代碼,而這段代碼會在某個時刻被調用執行,這就叫做回
    的頭像 發表于 09-11 09:57 ?4128次閱讀

    嵌入式開發軟件中回調函數的使用

    嵌入式開發軟件中回調函數是經常接觸的一種軟件設計方法,像我們的事件處理機制基本上都會使用到回調函數
    的頭像 發表于 04-29 08:57 ?2266次閱讀

    CAD激活注冊機

    CAD注冊機
    發表于 06-09 15:04 ?11次下載

    根據回調機制注冊事件并處理回調VI

    通過事件回調注冊函數(Register Event Callback)注冊一個回調VI,在事件發生時會運行該回
    的頭像 發表于 11-24 09:15 ?2275次閱讀

    什么是函數回調注冊機制實現的大致步驟介紹

    嵌入式函數回調注冊機制是一種常用的解耦技術,它通過在應用程序中注冊調
    的頭像 發表于 05-20 16:43 ?4368次閱讀

    如何解決引入注冊機制問題

    耦合狀態,失去了一個.c 一個 .h的意義。 如何解決這種問題 ????引入注冊機制。為了方便說明注冊機制,舉一個例子:手機在使用相機這個功能時,有一個操作:將拍攝的照片發送出去。以程序來實現這一過程,最容易想到的方法如下: ?
    的頭像 發表于 08-16 09:17 ?667次閱讀

    ??嵌入式中回調函數實現方法

    調函數的命名規范沒有固定的標準,但是根據通用慣例和編碼規范,回調函數的命名應該能夠反映函數的作用和功能,讓其他開發者能夠快速理解并使用。
    發表于 03-04 14:49 ?711次閱讀
    主站蜘蛛池模板: 麻豆出品国产AV在线观看| 999视频精品全部免费观看| 色-情-伦-理一区二区三区| 你是淫荡的我的女王| 久久久久综合一本久道| 久久re这里精品在线视频7| 國産麻豆AVMDMD0179| 国产亚洲制服免视频| 国产精品无码亚洲区艳妇| 国产精品JIZZ在线观看A片| 国产 日韩 欧美 综合 激情 | 免费视频久久只有精品| 久久免费特黄毛片| 久久人妻无码毛片A片麻豆| 久久久免费热线精品频| 久就热视频精品免费99| 旧里番ovaの催○セイ活指导| 久久综合色视频| 欧美gay69| 日本AAA片爽快视频| 三级黄色在线视频| 无套内射CHINESEHD| 亚洲2017天堂色无码| 亚洲精品久久午夜麻豆| 一二三四在线播放免费观看中文版视频 | 国精一区二区AV在线观看网站| 国产女人喷潮视频免费| 国产日韩欧美综合久久| 黄色网址在线看| 美女扒开腿让男生桶免费看动态图| 免费完整版观看| 日韩无码在线| 亚洲国产成人精品青青草原100 | 欧美z000z猪| 乳液全集电影在线观看| 亚洲爆乳少妇精品无码专区| 亚洲免费人成 久久| 91欧美秘密入口| 高清欧美videos sexo| 红杏俱乐部| 免费一级片网站|