精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

嵌入式狀態(tài)機(jī)的設(shè)計(jì)與實(shí)現(xiàn)

CHANBAEK ? 來(lái)源:南山府嵌入式 ? 作者:123 ? 2023-04-14 11:55 ? 次閱讀

說(shuō)明

嵌入式狀態(tài)機(jī)是一種常用的軟件設(shè)計(jì)模式,它能夠提高代碼的可讀性和可維護(hù)性。 狀態(tài)機(jī)是一個(gè)抽象的概念,它描述了一個(gè)系統(tǒng)或者組件的不同狀態(tài)以及在不同狀態(tài)下如何響應(yīng)輸入和事件。 狀態(tài)機(jī)可以應(yīng)用于各種領(lǐng)域,比如通信協(xié)議、嵌入式系統(tǒng)控制系統(tǒng)等。

C語(yǔ)言中,可以使用有限狀態(tài)機(jī)(FSM)實(shí)現(xiàn)嵌入式狀態(tài)機(jī)。 有限狀態(tài)機(jī)可以通過(guò)一組狀態(tài)和狀態(tài)之間的轉(zhuǎn)換來(lái)描述系統(tǒng)或者組件的行為。 在嵌入式系統(tǒng)中,通常使用循環(huán)或者中斷處理程序來(lái)實(shí)現(xiàn)狀態(tài)機(jī)

當(dāng)系統(tǒng)需要執(zhí)行某個(gè)任務(wù)時(shí),可以根據(jù)狀態(tài)機(jī)的狀態(tài)選擇不同的操作,例如:

  • 控制系統(tǒng)狀態(tài):例如控制器根據(jù)狀態(tài)機(jī)的狀態(tài)選擇執(zhí)行不同的操作,從而控制整個(gè)系統(tǒng)的狀態(tài),例如開(kāi)關(guān)燈、控制電機(jī)等。
  • 系統(tǒng)調(diào)度:例如操作系統(tǒng)根據(jù)狀態(tài)機(jī)的狀態(tài)選擇執(zhí)行不同的任務(wù),從而實(shí)現(xiàn)系統(tǒng)的調(diào)度。
  • 系統(tǒng)事件處理:例如網(wǎng)絡(luò)通信系統(tǒng)根據(jù)狀態(tài)機(jī)的狀態(tài)選擇不同的數(shù)據(jù)處理方式,例如處理接收到的數(shù)據(jù)、發(fā)送數(shù)據(jù)等。
  • 系統(tǒng)錯(cuò)誤處理:例如系統(tǒng)出現(xiàn)錯(cuò)誤時(shí),可以根據(jù)狀態(tài)機(jī)的狀態(tài)選擇不同的錯(cuò)誤處理方式,例如重新啟動(dòng)系統(tǒng)、輸出錯(cuò)誤信息等。

總之,狀態(tài)機(jī)可以幫助我們將系統(tǒng)的復(fù)雜性分解為多個(gè)簡(jiǎn)單的狀態(tài),根據(jù)不同的狀態(tài)選擇執(zhí)行不同的操作,從而更好地實(shí)現(xiàn)系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)。

主要流程

  1. 定義狀態(tài)和事件
    首先需要定義系統(tǒng)可能存在的所有狀態(tài),通常用枚舉類(lèi)型來(lái)表示。 同時(shí)需要定義可能發(fā)生的所有事件,例如輸入的數(shù)據(jù)、定時(shí)器到達(dá)等。
  2. 初始化狀態(tài)機(jī)
    在程序啟動(dòng)時(shí),需要將狀態(tài)機(jī)初始化為特定的狀態(tài)。
  3. 定義狀態(tài)轉(zhuǎn)換和動(dòng)作
    使用switch-case if-else 函數(shù)指針等語(yǔ)句來(lái)定義狀態(tài)轉(zhuǎn)換和動(dòng)作。 當(dāng)事件發(fā)生時(shí),判斷當(dāng)前狀態(tài),并根據(jù)不同的事件執(zhí)行相應(yīng)的動(dòng)作,并將狀態(tài)轉(zhuǎn)換為下一個(gè)狀態(tài)。
  4. 事件處理
    當(dāng)有事件發(fā)生時(shí),將事件作為參數(shù)傳遞給狀態(tài)機(jī),并調(diào)用狀態(tài)轉(zhuǎn)換和動(dòng)作函數(shù)。
  5. 循環(huán)執(zhí)行
    狀態(tài)機(jī)通常作為一個(gè)獨(dú)立的任務(wù)運(yùn)行,并在一個(gè)無(wú)限循環(huán)中等待事件的發(fā)生。

舉例

1#include 
 2
 3// 定義狀態(tài)機(jī)的所有可能狀態(tài)
 4enum {
 5    STATE_IDLE,
 6    STATE_RUNNING,
 7    STATE_COMPLETE,
 8    NUM_STATES
 9};
10
11// 定義狀態(tài)機(jī)的事件類(lèi)型
12enum {
13    EVENT_START,
14    EVENT_STOP,
15    NUM_EVENTS
16};
17
18// 定義狀態(tài)機(jī)的數(shù)據(jù)結(jié)構(gòu)
19typedef struct {
20    int current_state;
21    void (*process_event)(int event);
22} state_machine_t;
23
24// 定義狀態(tài)機(jī)的處理函數(shù)
25void idle_state(int event) {
26    if (event == EVENT_START) {
27        printf("Idle state: starting...\\n");
28        // 將狀態(tài)機(jī)的當(dāng)前狀態(tài)改為運(yùn)行狀態(tài)
29        state_machine.current_state = STATE_RUNNING;
30    }
31}
32
33void running_state(int event) {
34    if (event == EVENT_STOP) {
35        printf("Running state: stopping...\\n");
36        // 將狀態(tài)機(jī)的當(dāng)前狀態(tài)改為完成狀態(tài)
37        state_machine.current_state = STATE_COMPLETE;
38    }
39}
40
41void complete_state(int event) {
42    printf("Complete state: done.\\n");
43}
44
45// 初始化狀態(tài)機(jī)
46state_machine_t state_machine = {
47    .current_state = STATE_IDLE,
48    .process_event = idle_state
49};
50
51int main() {
52    // 在循環(huán)中讀取事件并將其傳遞給狀態(tài)機(jī)
53    while (1) {
54        int event;
55        scanf("%d", &event);
56        state_machine.process_event(event);
57        if (state_machine.current_state == STATE_COMPLETE) {
58            break;
59        }
60    }
61    return 0;
62}

在上面的例子中,我們定義了三個(gè)狀態(tài):空閑狀態(tài)、運(yùn)行狀態(tài)和完成狀態(tài)。 我們還定義了兩個(gè)事件:?jiǎn)?dòng)事件和停止事件。 狀態(tài)機(jī)的數(shù)據(jù)結(jié)構(gòu)包含當(dāng)前狀態(tài)和處理當(dāng)前狀態(tài)的函數(shù)的指針。 我們還定義了三個(gè)處理函數(shù),分別處理空閑狀態(tài)、運(yùn)行狀態(tài)和完成狀態(tài)。 在處理函數(shù)中,我們根據(jù)當(dāng)前狀態(tài)和事件決定下一個(gè)狀態(tài)以及執(zhí)行相應(yīng)的操作。 在應(yīng)用程序中,我們初始化狀態(tài)機(jī),然后在循環(huán)中讀取事件并將其進(jìn)行傳遞。

案例2

1// 定義狀態(tài)枚舉值
 2typedef enum {
 3  STATE_OFF,
 4  STATE_ON
 5} led_state_t;
 6
 7// 定義狀態(tài)機(jī)結(jié)構(gòu)體
 8typedef struct {
 9  led_state_t state;  // 當(dāng)前狀態(tài)
10  void (*turn_on)();  // 執(zhí)行開(kāi)啟操作的函數(shù)指針
11  void (*turn_off)(); // 執(zhí)行關(guān)閉操作的函數(shù)指針
12} led_fsm_t;
13
14// 初始化狀態(tài)機(jī)
15void led_fsm_init(led_fsm_t* fsm, void (*turn_on)(), void (*turn_off)()) {
16  fsm->state = STATE_OFF;
17  fsm->turn_on = turn_on;
18  fsm->turn_off = turn_off;
19}
20
21// 狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換
22void led_fsm_transition(led_fsm_t* fsm, bool button_pressed) {
23  switch (fsm->state) {
24    case STATE_OFF:
25      if (button_pressed) {
26        fsm->state = STATE_ON;
27        fsm->turn_on();
28      }
29      break;
30    case STATE_ON:
31      if (button_pressed) {
32        fsm->state = STATE_OFF;
33        fsm->turn_off();
34      }
35      break;
36    default:
37      break;
38  }
39}
40
41// 主函數(shù)
42int main() {
43  // 定義LED狀態(tài)機(jī)
44  led_fsm_t led_fsm;
45  // 初始化狀態(tài)機(jī)
46  led_fsm_init(&led_fsm, turn_on_led, turn_off_led);
47  while (1) {
48    // 讀取輸入
49    bool button_pressed = read_button();
50    // 狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換
51    led_fsm_transition(&led_fsm, button_pressed);
52    // 等待下一次執(zhí)行
53    delay(10);
54  }
55  return 0;
56}

示例3

1/*舉類(lèi)型state_t,其中包含四個(gè)狀態(tài):IDLE、WAITING、RUNNING和STOPPED。*/
 2typedef enum {
 3    STATE_IDLE,
 4    STATE_WALKING,
 5    STATE_TURNING_LEFT,
 6    STATE_TURNING_RIGHT,
 7    STATE_STOPPED
 8} robot_state_t;
 9
10void transition_fn(void);
11/*用于存儲(chǔ)當(dāng)前狀態(tài)和狀態(tài)轉(zhuǎn)移規(guī)則*/
12typedef struct {
13    robot_state_t current_state;
14    void (*transition_fn)(void);
15} robot_t;
16
17robot_t robot;
18
19int main(void) {
20    // initialize robot
21    robot.current_state = STATE_IDLE;
22    robot.transition_fn = transition_fn;
23
24    // main loop
25    while (1) {
26        switch (robot.current_state) {
27            case STATE_IDLE:
28                // do nothing
29                break;
30            case STATE_WALKING:
31                // move robot forward
32                break;
33            case STATE_TURNING_LEFT:
34                // turn robot left
35                break;
36            case STATE_TURNING_RIGHT:
37                // turn robot right
38                break;
39            case STATE_STOPPED:
40                // stop robot
41                break;
42        }
43    }
44}
45
46void transition_fn(void) {
47    switch (robot.current_state) {
48        case STATE_IDLE:
49            // transition to STATE_WALKING
50            robot.current_state = STATE_WALKING;
51            break;
52        case STATE_WALKING:
53            // transition to STATE_TURNING_LEFT or STATE_TURNING_RIGHT or STATE_STOPPED
54            if (/* condition for turning left */) {
55                robot.current_state = STATE_TURNING_LEFT;
56            } else if (/* condition for turning right */) {
57                robot.current_state = STATE_TURNING_RIGHT;
58            } else if (/* condition for stopping */) {
59                robot.current_state = STATE_STOPPED;
60            }
61            break;
62        case STATE_TURNING_LEFT:
63            // transition to STATE_WALKING
64            robot.current_state = STATE_WALKING;
65            break;
66        case STATE_TURNING_RIGHT:
67            // transition to STATE_WALKING
68            robot.current_state = STATE_WALKING;
69            break;
70        case STATE_STOPPED:
71            // transition to STATE_IDLE
72            robot.current_state = STATE_IDLE;
73            break;
74    }
75}

當(dāng)然實(shí)現(xiàn)狀態(tài)機(jī)的方式并不是惟一的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5045

    文章

    18816

    瀏覽量

    298459
  • 控制系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    6417

    瀏覽量

    110092
  • 通信協(xié)議
    +關(guān)注

    關(guān)注

    28

    文章

    810

    瀏覽量

    40119
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134027
  • 狀態(tài)機(jī)
    +關(guān)注

    關(guān)注

    2

    文章

    489

    瀏覽量

    27391
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式狀態(tài)機(jī)的幾種大牛才懂的操作

    狀態(tài)機(jī)嵌入式軟件中隨處可見(jiàn),可能你會(huì)說(shuō)狀態(tài)機(jī)有什么難的,不就是 switch 嗎? switch僅僅是最基礎(chǔ)的一個(gè)點(diǎn),關(guān)于狀態(tài)機(jī)的更多操作,或許你都沒(méi)有見(jiàn)過(guò),下面分享幾種
    發(fā)表于 11-17 10:41 ?1373次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>狀態(tài)機(jī)</b>的幾種大牛才懂的操作

    嵌入式軟件開(kāi)發(fā)中常用的狀態(tài)機(jī)編程實(shí)現(xiàn)

    嵌入式軟件開(kāi)發(fā)中,狀態(tài)機(jī)編程是一個(gè)十分重要的編程思想,它也是嵌入式開(kāi)發(fā)中一個(gè)常用的編程框架。掌握了狀態(tài)機(jī)編程思想,可以更加邏輯清晰的實(shí)現(xiàn)復(fù)
    發(fā)表于 09-06 10:25 ?1762次閱讀

    基于狀態(tài)機(jī)嵌入式系統(tǒng)開(kāi)發(fā)

    給大家分享下,基于狀態(tài)機(jī)嵌入式系統(tǒng)開(kāi)發(fā),慢慢看吧
    發(fā)表于 12-22 19:44

    嵌入式狀態(tài)機(jī)編程的概念是什么

    干貨 | 嵌入式狀態(tài)機(jī)編程干貨篇文章描述了基本的狀態(tài)機(jī)編程概念,感覺(jué)還可以。如果在搭上事件驅(qū)動(dòng)框架,就可以寫(xiě)一個(gè)簡(jiǎn)單的RTOS了,這個(gè)OS可以作為一種不可剝奪型內(nèi)核。...
    發(fā)表于 12-22 06:25

    LSM6DSOX嵌入式有限狀態(tài)機(jī)的使用和配置的信息

    本文檔旨在提供有關(guān) ST 的 LSM6DSOX 嵌入式有限狀態(tài)機(jī)的使用和配置的信息。LSM6DSOX 可配置為由用戶(hù)定義的運(yùn)動(dòng)模式激活中斷信號(hào)生成。為此,最多可以為運(yùn)動(dòng)檢測(cè)獨(dú)立編程 16 組嵌入式有限
    發(fā)表于 09-06 06:36

    ISM330DHCX嵌入式有限狀態(tài)機(jī)的使用和配置信息

    本文檔旨在提供有關(guān) ST 的 ISM330DHCX嵌入式有限狀態(tài)機(jī)的使用和配置的信息。ISM330DHCX 可配置為由用戶(hù)定義的運(yùn)動(dòng)模式激活中斷信號(hào)生成。為此,最多可以為運(yùn)動(dòng)檢測(cè)獨(dú)立編程 16 組嵌入式有限
    發(fā)表于 09-08 08:00

    LSM6DSOX嵌入式有限狀態(tài)機(jī)的使用和配置的信息

    本文檔旨在提供有關(guān) ST 的 LSM6DSOX 嵌入式有限狀態(tài)機(jī)的使用和配置的信息。LSM6DSOX 可配置為由用戶(hù)定義的運(yùn)動(dòng)模式激活中斷信號(hào)生成。為此,最多可以為運(yùn)動(dòng)檢測(cè)獨(dú)立編程 16 組嵌入式有限
    發(fā)表于 09-13 07:33

    狀態(tài)機(jī)嵌入式系統(tǒng)中的應(yīng)用

    為了便于研究和描述狀態(tài)機(jī)嵌入式前后臺(tái)軟件系統(tǒng)中的應(yīng)用,本文將以移動(dòng)2G光纖直放站近端機(jī)的監(jiān)控軟件案例來(lái)闡述和說(shuō)明。
    發(fā)表于 05-23 10:48 ?2089次閱讀
    <b class='flag-5'>狀態(tài)機(jī)</b>在<b class='flag-5'>嵌入式</b>系統(tǒng)中的應(yīng)用

    嵌入式軟件中狀態(tài)機(jī)的抽象與實(shí)現(xiàn)

    文中提出了 在嵌入式軟件中把狀態(tài)機(jī)作為一個(gè)獨(dú)立模塊從控制模塊中抽象出來(lái)的思想 , 描述了 抽象出來(lái)的狀態(tài)機(jī)模塊 。 并介紹了 如何將這種狀態(tài)機(jī)抽象模塊應(yīng)用到實(shí)際項(xiàng)目中 。
    發(fā)表于 03-22 15:47 ?1次下載

    有限狀態(tài)機(jī)嵌入式系統(tǒng)中的實(shí)現(xiàn)及應(yīng)用

    如何使嵌入式軟件代碼更加可靠 增強(qiáng)程序的可維護(hù)性 一直以來(lái)都是嵌入式程序員追 求的目標(biāo)。論述了有限狀態(tài)機(jī)的原理和其實(shí)現(xiàn)方法;采用狀態(tài)機(jī)方法編
    發(fā)表于 03-22 15:40 ?1次下載

    有限狀態(tài)機(jī)嵌入式軟件中的應(yīng)用

    有限狀態(tài)機(jī)嵌入式軟件中的應(yīng)用,感興趣的小伙伴們可以看看。
    發(fā)表于 07-26 10:43 ?27次下載

    嵌入式狀態(tài)機(jī)的設(shè)置

    狀態(tài)機(jī)嵌入式軟件中隨處可見(jiàn),可能你會(huì)說(shuō)狀態(tài)機(jī)有什么難的,不就是 switch 嗎?
    的頭像 發(fā)表于 11-02 09:04 ?1001次閱讀

    嵌入式狀態(tài)機(jī)的編程優(yōu)點(diǎn)分析

    嵌入式狀態(tài)機(jī)編程是真的好用,寫(xiě)出來(lái)的程序結(jié)構(gòu)非常清晰!所以平時(shí)用的也比較多。
    的頭像 發(fā)表于 02-25 16:21 ?768次閱讀

    C語(yǔ)言實(shí)現(xiàn)嵌入式狀態(tài)機(jī)簡(jiǎn)單描述與應(yīng)用

    嵌入式狀態(tài)機(jī)是一種常用的軟件設(shè)計(jì)模式,它能夠提高代碼的可讀性和可維護(hù)性。
    發(fā)表于 05-20 14:52 ?1524次閱讀

    LSM6DSOX嵌入式有限狀態(tài)機(jī)的使用和配置

    電子發(fā)燒友網(wǎng)站提供《LSM6DSOX嵌入式有限狀態(tài)機(jī)的使用和配置.pdf》資料免費(fèi)下載
    發(fā)表于 07-31 10:55 ?4次下載
    LSM6DSOX<b class='flag-5'>嵌入式</b>有限<b class='flag-5'>狀態(tài)機(jī)</b>的使用和配置