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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

嵌入式函數(shù)回調(diào)注冊(cè)機(jī)制的實(shí)現(xiàn)

CHANBAEK ? 來(lái)源:南山府嵌入式 ? 作者:編外人員 ? 2023-04-13 15:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

簡(jiǎn)介:

嵌入式函數(shù)回調(diào)注冊(cè)機(jī)制是一種常用的解耦技術(shù),它通過(guò)在應(yīng)用程序中注冊(cè)回調(diào)函數(shù)的方式來(lái)實(shí)現(xiàn)模塊之間的通信,從而使系統(tǒng)更加靈活、可擴(kuò)展和易于維護(hù)。 函數(shù)回調(diào)注冊(cè)機(jī)制可以通過(guò)函數(shù)指針和回調(diào)函數(shù)來(lái)實(shí)現(xiàn)。

的地址存儲(chǔ)到函數(shù)指針中,我們可以實(shí)現(xiàn)將回調(diào)函數(shù)注冊(cè)到事件源中。

本篇我就根據(jù)STM32單片機(jī)這方面進(jìn)行一個(gè)說(shuō)明其他單片機(jī)或微控制器的用法是一樣的。 了解大致的思路、方式方法。

什么是函數(shù)回調(diào)注冊(cè)機(jī)制?

函數(shù)回調(diào)注冊(cè)機(jī)制是一種常見(jiàn)的編程技術(shù),它允許我們?cè)诔绦蜻\(yùn)行時(shí)動(dòng)態(tài)地注冊(cè)函數(shù)回調(diào),并在適當(dāng)?shù)臅r(shí)候調(diào)用這些回調(diào)函數(shù)。 回調(diào)函數(shù)通常用于實(shí)現(xiàn)事件處理、狀態(tài)通知、消息傳遞等功能,可以極大地提高程序的靈活性和可擴(kuò)展性。

函數(shù)回調(diào)注冊(cè)機(jī)制的基本思想是:將一個(gè)函數(shù)的指針作為參數(shù)傳遞給另一個(gè)函數(shù),然后在需要調(diào)用這個(gè)函數(shù)時(shí),直接調(diào)用它的指針即可。 通過(guò)這種方式,我們可以將函數(shù)的調(diào)用權(quán)交給其他函數(shù),從而實(shí)現(xiàn)動(dòng)態(tài)的、靈活的、可擴(kuò)展的程序設(shè)計(jì)。

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

函數(shù)回調(diào)注冊(cè)機(jī)制在嵌入式系統(tǒng)中得到廣泛應(yīng)用,特別是在處理事件和中斷時(shí)。 通過(guò)動(dòng)態(tài)注冊(cè)回調(diào)函數(shù),我們可以更靈活地處理不同類型的事件和中斷,從而提高系統(tǒng)的可靠性和效率。

實(shí)現(xiàn)的大致步驟

定義回調(diào)函數(shù)類型

首先需要定義一個(gè)回調(diào)函數(shù)類型,用于指定回調(diào)函數(shù)的參數(shù)和返回值類型。 例如:

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

上述代碼定義了一個(gè)回調(diào)函數(shù)類型 'callback_func_targ1和浮點(diǎn)型arg2,返回值為void。

定義回調(diào)函數(shù)

根據(jù)定義的回調(diào)函數(shù)類型,需要定義相應(yīng)的回調(diào)函數(shù)。 例如:

void callback_function(int arg1, float arg2) 
{ 
 // 回調(diào)函數(shù)的具體實(shí)現(xiàn)
}

上述代碼定義了一個(gè)名為 'callbackcallback_func_t類型相匹配,可以作為回調(diào)函數(shù)使用。

定義回調(diào)函數(shù)注冊(cè)函數(shù)

定義一個(gè)函數(shù),用于注冊(cè)回調(diào)函數(shù),將回調(diào)函數(shù)的指針保存在全局變量中。 例如

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

調(diào)用回調(diào)函數(shù)

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

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}

在單片機(jī)中的應(yīng)用舉例

回調(diào)函數(shù)是一個(gè)指向函數(shù)的指針,它可以在某個(gè)事件發(fā)生時(shí)被調(diào)用。 在嵌入式系統(tǒng)中,回調(diào)函數(shù)通常用于響應(yīng)外部事件或中斷,例如定時(shí)器中斷、UART接收中斷等。 使用回調(diào)函數(shù),可以將事件處理的邏輯與事件源分離開(kāi)來(lái),從而提高代碼的可維護(hù)性和可重用性。

函數(shù)回調(diào)注冊(cè)機(jī)制通常由兩部分組成:注冊(cè)函數(shù)和回調(diào)函數(shù)。 注冊(cè)函數(shù)用于將回調(diào)函數(shù)注冊(cè)到事件源中,以便在事件發(fā)生時(shí)調(diào)用回調(diào)函數(shù)。 回調(diào)函數(shù)則用于處理事件,它通常被實(shí)現(xiàn)為一個(gè)短小精悍的函數(shù),只執(zhí)行必要的操作,以便盡快地返回到事件源中。

我們可以使用函數(shù)指針來(lái)實(shí)現(xiàn)回調(diào)函數(shù)的注冊(cè)。 函數(shù)指針是指向函數(shù)的指針變量,它可以存儲(chǔ)一個(gè)函數(shù)的地址,并且可以被傳遞和調(diào)用。 通過(guò)將回調(diào)函數(shù)

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

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

注意:,函數(shù)回調(diào)注冊(cè)機(jī)制在嵌入式系統(tǒng)中雖然常見(jiàn),但也需要注意線程安全、內(nèi)存管理等方面的問(wèn)題,以保證程序的正確性和可靠性。 此外,函數(shù)回調(diào)注冊(cè)機(jī)制還可以用于實(shí)現(xiàn)定時(shí)器事件。 定時(shí)器通常用于周期性地生成定時(shí)中斷,并在中斷處理函數(shù)中調(diào)用注冊(cè)的回調(diào)函數(shù)。

下面是一個(gè)使用定時(shí)器的例子:

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

    關(guān)注

    6067

    文章

    45011

    瀏覽量

    651107
  • 嵌入式
    +關(guān)注

    關(guān)注

    5153

    文章

    19707

    瀏覽量

    318035
  • STM32
    +關(guān)注

    關(guān)注

    2295

    文章

    11033

    瀏覽量

    365475
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4383

    瀏覽量

    64999
  • 函數(shù)指針
    +關(guān)注

    關(guān)注

    2

    文章

    57

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

    只在自己的形式參數(shù)中提供接口(一個(gè)函數(shù)指針的形式參數(shù)變量), 再比如一個(gè)應(yīng)用層與底層隔離,應(yīng)用層通過(guò)參數(shù)回調(diào)底層不同的處理函數(shù),而底層實(shí)現(xiàn)無(wú)
    發(fā)表于 07-05 01:51

    嵌入式系統(tǒng)上消息機(jī)制實(shí)現(xiàn)

    圖形用戶界面是嵌入式系統(tǒng)中重要部分,是用戶與系統(tǒng)進(jìn)行交互的樞紐,如何建立一個(gè)有效的消息機(jī)制實(shí)現(xiàn)消息從用戶到系統(tǒng)的傳遞,以及系統(tǒng)對(duì)消息的處理如何再反映到圖形
    發(fā)表于 06-16 08:52 ?16次下載

    基于Chirp函數(shù)的Nios Ⅱ嵌入式實(shí)現(xiàn)

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

    注冊(cè)機(jī)UltraEdit

    注冊(cè)機(jī)UltraEdit注冊(cè)機(jī)UltraEdit注冊(cè)機(jī)UltraEdit
    發(fā)表于 12-28 14:30 ?7次下載

    KeiluVision4_p注冊(cè)機(jī)

    KeiluVision4_p注冊(cè)機(jī)jKeiluVision4_p注冊(cè)機(jī)jKeiluVision4_p注冊(cè)機(jī)jKeiluVision4_p注冊(cè)機(jī)j
    發(fā)表于 02-19 14:58 ?12次下載

    Delphi教程之軟件注冊(cè)機(jī)制的建立

    Delphi教程之軟件注冊(cè)機(jī)制的建立,很好的Delphi資料,快來(lái)下載吧。
    發(fā)表于 04-11 16:09 ?5次下載

    C#教程之注冊(cè)注冊(cè)機(jī)制

    C#教程之注冊(cè)注冊(cè)機(jī)制,很好的C#資料,快來(lái)學(xué)習(xí)吧。
    發(fā)表于 04-21 09:52 ?17次下載

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

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

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

    來(lái)源:嵌入式客棧 1 什么是回調(diào)函數(shù)?首先什么是回調(diào)呢? 我的理解是:把一段可執(zhí)行的代碼像參數(shù)傳遞那樣傳給其他代碼,而這段代碼會(huì)在某個(gè)時(shí)刻被調(diào)用執(zhí)行,這就叫做回
    的頭像 發(fā)表于 09-11 09:57 ?4462次閱讀

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

    嵌入式開(kāi)發(fā)軟件中回調(diào)函數(shù)是經(jīng)常接觸的一種軟件設(shè)計(jì)方法,像我們的事件處理機(jī)制基本上都會(huì)使用到回調(diào)函數(shù)
    的頭像 發(fā)表于 04-29 08:57 ?2601次閱讀

    CAD激活注冊(cè)機(jī)

    CAD注冊(cè)機(jī)
    發(fā)表于 06-09 15:04 ?11次下載

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

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

    什么是函數(shù)回調(diào)注冊(cè)機(jī)制實(shí)現(xiàn)的大致步驟介紹

    嵌入式函數(shù)回調(diào)注冊(cè)機(jī)制是一種常用的解耦技術(shù),它通過(guò)在應(yīng)用程序中注冊(cè)調(diào)
    的頭像 發(fā)表于 05-20 16:43 ?5190次閱讀

    如何解決引入注冊(cè)機(jī)制問(wèn)題

    耦合狀態(tài),失去了一個(gè).c 一個(gè) .h的意義。 如何解決這種問(wèn)題 ????引入注冊(cè)機(jī)制。為了方便說(shuō)明注冊(cè)機(jī)制,舉一個(gè)例子:手機(jī)在使用相機(jī)這個(gè)功能時(shí),有一個(gè)操作:將拍攝的照片發(fā)送出去。以程序來(lái)實(shí)現(xiàn)這一過(guò)程,最容易想到的方法如下: ?
    的頭像 發(fā)表于 08-16 09:17 ?956次閱讀

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

    調(diào)函數(shù)的命名規(guī)范沒(méi)有固定的標(biāo)準(zhǔn),但是根據(jù)通用慣例和編碼規(guī)范,回調(diào)函數(shù)的命名應(yīng)該能夠反映函數(shù)的作用和功能,讓其他開(kāi)發(fā)者能夠快速理解并使用。
    發(fā)表于 03-04 14:49 ?1168次閱讀
    主站蜘蛛池模板: 久久免费精品视频 | 欧亚一卡二卡日本一卡二卡 | 91popny蜜桃臀| 国产AV无码成人黄网站免费 | 37pao成人国产永久免费视频 | 午夜福利影院私人爽爽 | 高清国产激情视频在线观看 | 偷窥国产亚洲免费视频 | 久久精品美女久久 | 欧美老少欢杂交另类 | 999久久国产精品免费人妻 | 小小水蜜桃免费影院 | 欧美日韩亚洲成人 | 国产成人精品一区二区三区视频 | 囯产免费久久久久久国产免费 | 亚洲日韩KKK444KKK聚色 | 果冻传媒色AV国产播放 | 晓雪老师我要进你里面好爽 | 奶头好翘是不是想要了 | 欧美乱子YELLOWVIDEO | 精品亚洲一区二区三区在线播放 | 文中字幕一区二区三区视频播放 | G国产精品无马 | 一个人视频日本在线观看 | 亚洲国产果果在线播放在线 | 日韩精品一区二区亚洲AV观看 | 美女被触手注入精子强制受孕漫画 | 好吊妞国产欧美日韩视频 | 亚洲视频在线观看不卡 | 国产三级视频在线 | 久久精品亚洲AV中文2区金莲 | 亚洲免费中文 | 秋霞午夜理论理论福利无码 | 18动漫在线观看 | 国产中文欧美日韩在线 | 小荡娃奶真大 | jaPanesmature儿母 japanese幼儿videos | 无套日出白浆在线播放 | 国产XXXXXX农村野外 | 这里只有精品在线视频 | 国产日韩欧美三级 |

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品