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

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

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

嵌入式C語言中結(jié)構(gòu)體封裝函數(shù)詳解

CHANBAEK ? 來源:南山府嵌入式 ? 作者:編外人員 ? 2023-04-14 11:50 ? 次閱讀

說明:

嵌入式系統(tǒng)中,結(jié)構(gòu)體封裝函數(shù)可以用于對于嵌入式硬件資源進(jìn)行抽象和封裝,從而提高軟件的可維護(hù)性和可移植性。 結(jié)構(gòu)體封裝函數(shù)通常包含數(shù)據(jù)和行為,并提供了對數(shù)據(jù)的訪問和操作方法。

比如可以將硬件驅(qū)動(dòng)函數(shù)封裝在結(jié)構(gòu)體中,方便對外提供統(tǒng)一的API接口,同時(shí)也便于代碼的移植和擴(kuò)展。 另外,結(jié)構(gòu)體封裝函數(shù)還可以用于實(shí)現(xiàn)狀態(tài)機(jī)、任務(wù)調(diào)度等復(fù)雜的系統(tǒng)功能。

C語言中,結(jié)構(gòu)體不僅可以封裝數(shù)據(jù),還可以封裝函數(shù)指針。 這種方式可以用于實(shí)現(xiàn)回調(diào)函數(shù)、狀態(tài)機(jī)等,提高代碼的復(fù)用性和可維護(hù)性。 特別是在嵌入式當(dāng)中,應(yīng)用是非常多的。

結(jié)構(gòu)體封裝函數(shù)的作用:

  1. 將函數(shù)指針和參數(shù)打包成一個(gè)結(jié)構(gòu)體,實(shí)現(xiàn)了代碼的模塊化和可復(fù)用性。
  2. 在結(jié)構(gòu)體中可以定義多個(gè)函數(shù)指針,實(shí)現(xiàn)了對函數(shù)的分類管理和調(diào)用。
  3. 結(jié)構(gòu)體可以作為函數(shù)的參數(shù)或返回值,傳遞和返回函數(shù)指針和參數(shù)。

結(jié)構(gòu)體封裝函數(shù)的應(yīng)用:

  • 回調(diào)函數(shù):將函數(shù)指針和參數(shù)打包成一個(gè)結(jié)構(gòu)體,傳遞給API函數(shù),在API函數(shù)內(nèi)部執(zhí)行該函數(shù)。
  • 狀態(tài)機(jī):將每個(gè)狀態(tài)對應(yīng)的處理函數(shù)封裝成一個(gè)結(jié)構(gòu)體,根據(jù)當(dāng)前狀態(tài)調(diào)用相應(yīng)的處理函數(shù)。
  • 事件驅(qū)動(dòng):將事件處理函數(shù)封裝成一個(gè)結(jié)構(gòu)體,通過事件觸發(fā)調(diào)用相應(yīng)的處理函數(shù)。
  • 線程池:將任務(wù)處理函數(shù)封裝成一個(gè)結(jié)構(gòu)體,加入任務(wù)隊(duì)列后由線程池調(diào)用執(zhí)行

結(jié)構(gòu)體封裝函數(shù)的好處:

  • 更好的隱藏實(shí)現(xiàn)細(xì)節(jié):結(jié)構(gòu)體封裝函數(shù)使得函數(shù)的實(shí)現(xiàn)細(xì)節(jié)被封裝在結(jié)構(gòu)體內(nèi)部,只有結(jié)構(gòu)體暴露給外部的函數(shù)指針,實(shí)現(xiàn)了良好的封裝和信息隱藏。
  • 更加靈活的函數(shù)調(diào)用:函數(shù)指針可以被動(dòng)態(tài)修改,從而實(shí)現(xiàn)動(dòng)態(tài)的函數(shù)調(diào)用。 例如,在狀態(tài)機(jī)中,根據(jù)不同的狀態(tài),可以將相應(yīng)的處理函數(shù)指針賦值給一個(gè)函數(shù)指針變量,從而實(shí)現(xiàn)狀態(tài)的轉(zhuǎn)換和函數(shù)的調(diào)用。
  • 更加方便的擴(kuò)展性:結(jié)構(gòu)體封裝函數(shù)可以輕松地添加新的函數(shù)指針,從而擴(kuò)展功能。 在需要添加新功能時(shí),只需要定義一個(gè)新的函數(shù)指針,并添加到結(jié)構(gòu)體中,就可以實(shí)現(xiàn)功能的擴(kuò)展,而不需要修改原有的代碼。
  • 更加通用的代碼:結(jié)構(gòu)體封裝函數(shù)可以使用于各種不同的編程范式,例如面向?qū)ο缶幊蹋∣OP)和函數(shù)式編程(FP),從而實(shí)現(xiàn)通用的代碼。 例如,在OOP中,結(jié)構(gòu)體可以被看作是一個(gè)對象,函數(shù)指針可以被看作是對象的方法,從而實(shí)現(xiàn)OOP編程的思想。
  • 更加易于維護(hù):結(jié)構(gòu)體封裝函數(shù)使得代碼更加清晰、易于維護(hù)和修改。 由于函數(shù)指針的定義和使用都在結(jié)構(gòu)體內(nèi)部,因此修改或調(diào)整代碼時(shí),只需要修改結(jié)構(gòu)體中的函數(shù)指針定義或調(diào)用方式,而不需要修改其他部分的代碼,從而使得代碼更加健壯、易于維護(hù)和修改
  • 模塊化:通過結(jié)構(gòu)體封裝函數(shù),可以將多個(gè)函數(shù)和數(shù)據(jù)結(jié)構(gòu)組合成一個(gè)模塊,以便于模塊化設(shè)計(jì)和維護(hù)。 這種方法可以將代碼的復(fù)雜性分解到不同的模塊中,降低了代碼的耦合性,提高了代碼的可讀性和可維護(hù)性。
  • 代碼復(fù)用:結(jié)構(gòu)體封裝的函數(shù)可以通過傳遞結(jié)構(gòu)體的方式重用同一個(gè)函數(shù)。 這種方式可以大大減少代碼量,提高代碼的復(fù)用性和可維護(hù)性。
  • 可擴(kuò)展性:當(dāng)需要增加新的功能時(shí),只需增加新的函數(shù)和數(shù)據(jù)結(jié)構(gòu),而不需要修改現(xiàn)有代碼。 這種方式可以大大減少代碼的修改和調(diào)試時(shí)間,提高代碼的可擴(kuò)展性和可維護(hù)性。
  • 保護(hù)數(shù)據(jù):通過結(jié)構(gòu)體封裝函數(shù),可以將數(shù)據(jù)和函數(shù)封裝在一個(gè)結(jié)構(gòu)體中,防止外部代碼對數(shù)據(jù)的非法訪問和修改。
  • 提高安全性:將函數(shù)和數(shù)據(jù)封裝在一個(gè)結(jié)構(gòu)體中,可以防止其他函數(shù)對數(shù)據(jù)的非法操作,從而提高程序的安全性。

舉例1

1/* 定義封裝函數(shù)結(jié)構(gòu)體由外部調(diào)用*/
 2typedef struct {
 3    int x;
 4    int y;
 5    void (*move_up)(int steps);
 6    void (*move_down)(int steps);
 7    void (*move_left)(int steps);
 8    void (*move_right)(int steps);
 9} Point;
10
11// 定義結(jié)構(gòu)體中的函數(shù)
12void move_up(int steps) {
13    // 向上移動(dòng)steps個(gè)單位
14    // ...
15}
16
17void move_down(int steps) {
18    // 向下移動(dòng)steps個(gè)單位
19    // ...
20}
21
22void move_left(int steps) {
23    // 向左移動(dòng)steps個(gè)單位
24    // ...
25}
26
27void move_right(int steps) {
28    // 向右移動(dòng)steps個(gè)單位
29    // ...
30}
31
32int main() {
33    // 初始化結(jié)構(gòu)體
34    Point point = {
35        .x = 0,
36        .y = 0,
37        .move_up = move_up,
38        .move_down = move_down,
39        .move_left = move_left,
40        .move_right = move_right
41    };
42
43    // 調(diào)用結(jié)構(gòu)體中的函數(shù)
44    point.move_up(10);
45    point.move_right(5);
46
47    return 0;
48}

在上面的示例代碼中,我們定義了一個(gè)結(jié)構(gòu)體Point,其中包含了兩個(gè)整型變量xy,以及四個(gè)函數(shù)指針move_up、move_down、move_leftmove_right。 每個(gè)函數(shù)指針指向一個(gè)移動(dòng)函數(shù),用于在平面坐標(biāo)系中移動(dòng)點(diǎn)的位置。 通過使用結(jié)構(gòu)體封裝函數(shù),我們可以將函數(shù)和數(shù)據(jù)封裝在一起,方便地進(jìn)行操作和管理。

main()函數(shù)中,我們首先通過初始化的方式,將結(jié)構(gòu)體中的成員變量和函數(shù)指針初始化。 然后,我們使用結(jié)構(gòu)體中的函數(shù)指針,調(diào)用了move_up()move_right()函數(shù),分別將點(diǎn)向上移動(dòng)10個(gè)單位和向右移動(dòng)5個(gè)單位。

值得注意的是,在實(shí)際應(yīng)用中,我們需要根據(jù)實(shí)際情況修改函數(shù)的實(shí)現(xiàn),以及結(jié)構(gòu)體中的成員變量和函數(shù)指針的數(shù)量和類型。 同時(shí)避免濫用。

舉例2

1typedef struct {
 2    void (*init)(void);
 3    void (*write)(uint8_t data);
 4    uint8_t (*read)(void);
 5} spi_t;
 6
 7void spi_init(void) {
 8    /* SPI初始化代碼 */
 9}
10
11void spi_write(uint8_t data) {
12    /* SPI寫入數(shù)據(jù) */
13}
14
15uint8_t spi_read(void) {
16    /* SPI讀取數(shù)據(jù) */
17}
18
19int main(void) {
20    spi_t spi = {spi_init, spi_write, spi_read};
21
22    spi.init();
23    spi.write(0xAA);
24    uint8_t data = spi.read();
25
26    return 0;
27}

在舉例2這個(gè)例子中,我們定義了一個(gè)spi_t類型的結(jié)構(gòu)體,它包含了三個(gè)成員函數(shù)指針,分別對應(yīng)SPI總線的初始化、寫入和讀取操作。 在main函數(shù)中,我們定義了一個(gè)spi結(jié)構(gòu)體變量,并且初始化它的函數(shù)指針成員。 接下來,我們通過spi結(jié)構(gòu)體變量的函數(shù)指針成員,分別調(diào)用了SPI總線的初始化、寫入和讀取操作。

使用結(jié)構(gòu)體封裝函數(shù)可以使代碼更加清晰明了,減少了代碼的冗余和重復(fù),同時(shí)也方便代碼的擴(kuò)展和維護(hù)。

舉例3

假設(shè)我們需要控制一個(gè)LED燈的亮度,可以使用PWM(脈沖寬度調(diào)制)技術(shù)來實(shí)現(xiàn)。 為了方便控制,我們可以使用一個(gè)結(jié)構(gòu)體來封裝控制LED燈的函數(shù)和變量。

1typedef struct {
 2    uint8_t duty_cycle;     // 占空比
 3    void (*set_duty_cycle)(uint8_t duty_cycle);  // 設(shè)置占空比的函數(shù)指針
 4    void (*start)(void);    // 啟動(dòng)PWM輸出的函數(shù)指針
 5    void (*stop)(void);     // 停止PWM輸出的函數(shù)指針
 6} pwm_control_t;
 7
 8// 設(shè)置占空比
 9void set_duty_cycle(uint8_t duty_cycle) {
10    // 設(shè)置占空比的代碼
11}
12
13// 啟動(dòng)PWM輸出
14void start_pwm(void) {
15    // 啟動(dòng)PWM輸出的代碼
16}
17
18// 停止PWM輸出
19void stop_pwm(void) {
20    // 停止PWM輸出的代碼
21}
22
23int main(void) {
24    pwm_control_t pwm;
25
26    pwm.duty_cycle = 50;   // 設(shè)置占空比為50%
27    pwm.set_duty_cycle = set_duty_cycle;
28    pwm.start = start_pwm;
29    pwm.stop = stop_pwm;
30
31    pwm.set_duty_cycle(pwm.duty_cycle);  // 設(shè)置占空比
32    pwm.start();  // 啟動(dòng)PWM輸出
33
34    while (1) {
35        // 循環(huán)執(zhí)行其他任務(wù)
36    }
37}

在上面的代碼中,我們定義了一個(gè)名為pwm_control_t的結(jié)構(gòu)體,其中包含了一個(gè)占空比成員變量duty_cycle和三個(gè)函數(shù)指針set_duty_cycle、startstop。 set_duty_cycle函數(shù)用于設(shè)置占空比,start函數(shù)用于啟動(dòng)PWM輸出,stop函數(shù)用于停止PWM輸出。

main函數(shù)中,我們創(chuàng)建了一個(gè)pwm_control_t類型的結(jié)構(gòu)體變量pwm,并分別給結(jié)構(gòu)體的成員變量和函數(shù)指針賦值。 接著,我們調(diào)用了set_duty_cyclestart函數(shù)來設(shè)置占空比和啟動(dòng)PWM輸出。

結(jié)構(gòu)體封裝函數(shù)的好處在于,我們可以通過創(chuàng)建不同的結(jié)構(gòu)體變量來控制多個(gè)LED燈,而且不同的LED燈可以使用不同的PWM參數(shù)。 此外,如果需要修改PWM輸出的實(shí)現(xiàn)方式,只需要修改startstop函數(shù)即可,而不需要修改每個(gè)LED燈。

聲明:本文內(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)注

    5045

    文章

    18816

    瀏覽量

    298459
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    40

    文章

    3519

    瀏覽量

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

    關(guān)注

    180

    文章

    7575

    瀏覽量

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

    關(guān)注

    3

    文章

    4235

    瀏覽量

    61965
  • 結(jié)構(gòu)體
    +關(guān)注

    關(guān)注

    1

    文章

    127

    瀏覽量

    10800
收藏 人收藏

    評論

    相關(guān)推薦

    C語言中數(shù)組和結(jié)構(gòu)的內(nèi)存表示和布局

    C語言中,數(shù)組和結(jié)構(gòu)都可以代表一塊內(nèi)存,但為什么結(jié)構(gòu)可以直接賦值,而數(shù)組不可以?這個(gè)問題涉及
    發(fā)表于 08-28 10:54 ?1161次閱讀

    C語言結(jié)構(gòu)講解

    C語言中有一塊極容易被忽略,但是對于嵌入式編程來說用處特別大的內(nèi)容——結(jié)構(gòu)
    發(fā)表于 10-01 13:27 ?290次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>講解

    C語言入門書籍《嵌入式Linux C語言程序設(shè)計(jì)基礎(chǔ)教程》全本下載??!

    的數(shù)據(jù)、數(shù)據(jù)的輸入和輸出、運(yùn)算符和表達(dá)式、程序結(jié)構(gòu)和控制語句。第6章到主要講解了嵌入式Linux C語言中的數(shù)組,包括一維數(shù)組、多維數(shù)組、字符數(shù)組和字符串等。第7章主要講解了
    發(fā)表于 03-02 17:09

    嵌入式C語言C語言的區(qū)別

    嵌入式C語言C語言的區(qū)別:最常用的系統(tǒng)編程語言C
    發(fā)表于 10-27 06:52

    嵌入式C語言結(jié)構(gòu)設(shè)計(jì)_實(shí)驗(yàn)二

    主要介紹嵌入式C語言結(jié)構(gòu)設(shè)計(jì),從基礎(chǔ)講起,非常合適入門
    發(fā)表于 02-22 15:45 ?2次下載

    嵌入式C語言中如何判斷數(shù)據(jù)是否損壞

    C語言中結(jié)構(gòu)是非常有用的復(fù)合數(shù)據(jù)類型,正是有了結(jié)構(gòu),C
    發(fā)表于 08-19 11:46 ?745次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言中</b>如何判斷數(shù)據(jù)是否損壞

    嵌入式C語言中的union語法的作用是什么

    C語言中結(jié)構(gòu)語法是非常重要,也是非常有用的,相信看了最近幾節(jié)的讀者應(yīng)該明白。事實(shí)上,在實(shí)際的C語言
    發(fā)表于 08-29 17:10 ?1796次閱讀

    標(biāo)準(zhǔn)c語言嵌入式,嵌入式C語言C語言的區(qū)別

    嵌入式C語言C語言的區(qū)別:最常用的系統(tǒng)編程語言C
    發(fā)表于 10-20 14:06 ?6次下載
    標(biāo)準(zhǔn)<b class='flag-5'>c</b><b class='flag-5'>語言</b>與<b class='flag-5'>嵌入式</b>,<b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>與<b class='flag-5'>C</b><b class='flag-5'>語言</b>的區(qū)別

    C語言嵌入式培訓(xùn) 嵌入式C語言程序設(shè)計(jì)基礎(chǔ)

      學(xué)習(xí)嵌入式的基礎(chǔ)語言C語言,因此先掌握C語言對于后續(xù)
    發(fā)表于 11-03 21:06 ?32次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>嵌入式</b>培訓(xùn)  <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>程序設(shè)計(jì)基礎(chǔ)

    嵌入式C語言知識總結(jié)

    了一些這方面的經(jīng)驗(yàn)和思考,就希望總結(jié)下來,系統(tǒng)的闡述嵌入式C語言的重要知識點(diǎn),就是這篇文章的由來。本文以自己在嵌入式上的實(shí)踐為基礎(chǔ),在結(jié)合相關(guān)資料, 闡述
    發(fā)表于 12-20 19:44 ?12次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>知識總結(jié)

    簡單介紹嵌入式C語言中常用的位操作

    嵌入式C語言中,使用位操作程序有很好的可讀性。以下就簡單介紹以下常用的位操作。
    的頭像 發(fā)表于 02-23 10:36 ?865次閱讀

    嵌入式C語言中堆和棧的區(qū)別

    嵌入式C語言中,堆和棧都是用來存儲變量的內(nèi)存區(qū)域,但它們在存儲和使用變量方面有很大的區(qū)別。
    的頭像 發(fā)表于 04-14 11:45 ?1206次閱讀

    嵌入式C語言結(jié)構(gòu)封裝函數(shù)說明

    嵌入式系統(tǒng)中,結(jié)構(gòu)封裝函數(shù)可以用于對于嵌入式硬件資源進(jìn)行抽象和
    發(fā)表于 05-20 15:00 ?956次閱讀

    嵌入式C語言結(jié)構(gòu)特點(diǎn)

    過程中,不論是基于寄存器開發(fā)還是基于庫開發(fā),深入理解和掌握嵌入式C語言函數(shù)、指針、結(jié)構(gòu)是學(xué)習(xí)
    的頭像 發(fā)表于 11-24 16:16 ?520次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>結(jié)構(gòu)</b>特點(diǎn)

    嵌入式系統(tǒng)中C語言結(jié)構(gòu)的基礎(chǔ)實(shí)現(xiàn)與應(yīng)用

    C語言中的數(shù)組只能允許程序員定義存儲相同類型數(shù)據(jù)。但是結(jié)構(gòu)C語言編程中允許您存儲不同數(shù)據(jù)類型的數(shù)據(jù)。
    發(fā)表于 03-12 14:29 ?321次閱讀
    <b class='flag-5'>嵌入式</b>系統(tǒng)中<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>的基礎(chǔ)實(shí)現(xiàn)與應(yīng)用