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

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

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

分享一個嵌入式編程模板

STM32嵌入式開發(fā) ? 來源:STM32嵌入式開發(fā) ? 2023-09-10 10:10 ? 次閱讀

輸入事件到狀態(tài)機

#include "stdio.h"
#define EXECUTE_VOID(func)  {if((func)!=NULL) (func());}


typedef void (*select_machine_t)(void);


typedef enum _event_index
{
 event_index_1 = 0,
 event_index_2,
 event_index_3,
 event_index_end
} event_index_e; 


typedef enum _status_index
{
 status_index_1 = 0,
 status_index_2,
 status_index_end
} status_index_e;


void machine_1(void);
void machine_2(void);
void machine_3(void);
void machine_4(void);


select_machine_t select_machine[event_index_end][status_index_end] = 
{
 {machine_1, machine_2},
 {NULL,      machine_3},
 {machine_4, NULL}
};


void machine_1(void)
{
 printf("machine_1
");
}


void machine_2(void)
{
 printf("machine_2
");
}


void machine_3(void)
{
 printf("machine_3
");
}


void machine_4(void)
{
 printf("machine_4
");
}


int main(void)
{
 EXECUTE_VOID(select_machine[0][1]);
}

		

對應(yīng):

(1)條件A:status_index_e(2)條件B:event_index_e

(3)switch:

EXECUTE_VOID(select_machine[0][1] );

		當(dāng)一個外部事件來的時候(比如按鍵輸入),通過一個全局的結(jié)構(gòu)體變量(C語言中最常用的方法)引入當(dāng)前的實時狀態(tài),由條件導(dǎo)向各種狀態(tài)機。這里的實現(xiàn)是通過二維數(shù)組即兩個下標代表兩個條件,兩個條件的交點就是具體的狀態(tài)機。b73ebf7e-4f7d-11ee-a25d-92fbcf53809c.png

狀態(tài)機到面向過程

以上實現(xiàn)的是“輸入外部事件>>>>引流到>>>>狀態(tài)機”那如何實現(xiàn)“狀態(tài)機>>>>執(zhí)行>>>>具體地操作”呢?狀態(tài)機有一個固定的執(zhí)行流程(當(dāng)然也有根據(jù)條件執(zhí)行不同的運行流程的分支),其實這些個流程都是非常確定的執(zhí)行過程。在開發(fā)過程中的經(jīng)驗體現(xiàn):就是對所有執(zhí)行流程的精確完整的分析,然后將其全部羅列出來。“全部羅列出來”這個執(zhí)行流程在程序中有兩種體現(xiàn)方式:1、把所有的執(zhí)行流程以“空函數(shù)”的形式羅列出來。2、把所有的執(zhí)行流程以“函數(shù)指針”的形式羅列出來:好處一:可以把軟件框架寫出來,具體邏輯流程已經(jīng)做好。好處二:具體的函數(shù)的接口可以先空著(NULL),待寫好了函數(shù)就把函數(shù)名賦值給它(sys_api_func* = you_func ;)。好處三:

通用性更高,邏輯性更強。

void (sys_api_func1)(void);
void (sys_api_func2)(void);
void (sys_api_func3)(void);
...


void sys_api_init(void)
{
 sys_api_func1 = NULL;   // 還沒有寫好實現(xiàn)函數(shù)就先賦為NULL
 sys_api_func2 = NULL;
 sys_api_func3 = NULL;
 ...
}


// 狀態(tài)機1
void machine_1(void)
{
 execute_api_void(sys_api_func1);  // 狀態(tài)機:步驟一
 execute_api_void(sys_api_func2);  // 狀態(tài)機:步驟二
 ...                               // 狀態(tài)機:步驟....
}

	


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

    關(guān)注

    5054

    文章

    18920

    瀏覽量

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

    關(guān)注

    180

    文章

    7581

    瀏覽量

    135652
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3545

    瀏覽量

    93501

原文標題:分享一個嵌入式編程模板

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    深入了解嵌入式編程

    能從PC機器編程去看嵌入式問題,那是第步;學(xué)會用嵌入式編程思想,那是第二步;用PC的思想和嵌入式
    的頭像 發(fā)表于 10-18 09:56 ?3598次閱讀

    什么是嵌入式編程

    《C嵌入式編程設(shè)計模式》第章 什么是嵌入式編程嵌入式系統(tǒng)的基本知識面向?qū)ο?/div>
    發(fā)表于 11-08 06:15

    嵌入式系統(tǒng)編程教學(xué)分析

    通過volatile關(guān)鍵字的使用、嵌入式系統(tǒng)工程設(shè)置、嵌入式系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)設(shè)計、嵌入式系統(tǒng)算法設(shè)計四方面的介紹,分析了嵌入式系統(tǒng)
    發(fā)表于 07-01 17:07 ?26次下載

    基于嵌入式SCADA系統(tǒng)的開關(guān)量信號采集模板設(shè)計

      O 引言   本文設(shè)計的開關(guān)量信號采集模板嵌入式SCADA系統(tǒng)的種插件,稱為智能數(shù)字量采集
    發(fā)表于 10-25 14:07 ?1195次閱讀
    基于<b class='flag-5'>嵌入式</b>SCADA系統(tǒng)的開關(guān)量信號采集<b class='flag-5'>模板</b>設(shè)計

    嵌入式c語言編程(由淺入深)

    本內(nèi)容詳細介紹了嵌入式c語言編程的各項知識,包括嵌入式c語言編程,嵌入式C語言開發(fā)、嵌入式C語言
    發(fā)表于 11-02 14:37 ?0次下載
    <b class='flag-5'>嵌入式</b>c語言<b class='flag-5'>編程</b>(由淺入深)

    嵌入式C編程

    嵌入式C編程,非常有用的資料,介紹嵌入式C語言編程
    發(fā)表于 12-29 17:29 ?0次下載

    嵌入式C編程與ATmelAVR

    嵌入式C編程與ATmelAVR 非常好的資源
    發(fā)表于 12-29 17:56 ?0次下載

    C嵌入式系統(tǒng)編程

    C嵌入式系統(tǒng)編程
    發(fā)表于 10-23 16:27 ?14次下載

    什么是嵌入式編程

    什么是嵌入式編程?對于嵌入式系統(tǒng),許多人很容易將它與單片機編程混淆。其實,嵌入式編程指的是在我們
    發(fā)表于 06-29 11:05 ?1w次閱讀
    什么是<b class='flag-5'>嵌入式</b><b class='flag-5'>編程</b>

    解析嵌入式軟件開發(fā)語言:嵌入式C編程

    解析嵌入式軟件開發(fā)語言:嵌入式C編程在我們初學(xué)嵌入式開發(fā)的時候,總會出現(xiàn)問題。那就是C語言和
    發(fā)表于 10-20 11:51 ?7次下載
    解析<b class='flag-5'>嵌入式</b>軟件開發(fā)語言:<b class='flag-5'>嵌入式</b>C<b class='flag-5'>編程</b>

    嵌入式linux報警,嵌入式Linux下LED報警燈驅(qū)動設(shè)計及編程.doc

    設(shè)計及編程.實驗?zāi)康睦斫怛?qū)動本質(zhì),掌握嵌入式Linux系統(tǒng)下驅(qū)動開發(fā)相關(guān)知識,包括端口寄存器訪問、接口函數(shù)編寫、和文件系統(tǒng)掛接、注冊及相關(guān)應(yīng)用編程等知識點。二.實驗內(nèi)容實驗5.1
    發(fā)表于 11-01 17:21 ?5次下載
    <b class='flag-5'>嵌入式</b>linux報警,<b class='flag-5'>嵌入式</b>Linux下LED報警燈驅(qū)動設(shè)計及<b class='flag-5'>編程</b>.doc

    視頻教程-嵌入式Linux多任務(wù)編程-嵌入式

    嵌入式Linux多任務(wù)編程 嵌入式工程師、嵌入式講師、10多年
    發(fā)表于 11-02 11:21 ?22次下載
    視頻教程-<b class='flag-5'>嵌入式</b>Linux多任務(wù)<b class='flag-5'>編程</b>-<b class='flag-5'>嵌入式</b>

    視頻教程-嵌入式Linux文件與串口編程-嵌入式

    嵌入式Linux文件與串口編程 嵌入式工程師、嵌入式講師、10多年
    發(fā)表于 11-02 15:06 ?15次下載
    視頻教程-<b class='flag-5'>嵌入式</b>Linux文件與串口<b class='flag-5'>編程</b>-<b class='flag-5'>嵌入式</b>

    《C嵌入式編程設(shè)計模式》讀書筆記

    《C嵌入式編程設(shè)計模式》第章 什么是嵌入式編程嵌入式系統(tǒng)的基本知識面向?qū)ο?/div>
    發(fā)表于 11-03 16:06 ?13次下載
    《C<b class='flag-5'>嵌入式</b><b class='flag-5'>編程</b>設(shè)計模式》讀書筆記

    嵌入式C++編程

    特點展示如何使用 C ++ 來構(gòu)建利用可用硬件資源的強大并發(fā)系統(tǒng)。從嵌入式編程入門和 C ++ 17 的最新特性開始,帶您了解優(yōu)秀編程的各個方面您將學(xué)習(xí)如何使用 C ++ 的并發(fā)性、內(nèi)存管理和函數(shù)
    發(fā)表于 11-04 10:36 ?10次下載
    <b class='flag-5'>嵌入式</b>C++<b class='flag-5'>編程</b>