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

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

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

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

聊聊C語(yǔ)言|特殊狀態(tài)機(jī)

玩轉(zhuǎn)單片機(jī) ? 來源:玩轉(zhuǎn)單片機(jī) ? 2023-06-18 14:12 ? 次閱讀

|核心機(jī)制

狀態(tài)機(jī)是非常常用的框架之一,本質(zhì)就是通過記錄狀態(tài)值來執(zhí)行對(duì)應(yīng)動(dòng)作,但是有個(gè)問題就是每個(gè)對(duì)應(yīng)的狀態(tài)值都有對(duì)應(yīng)的動(dòng)作,如果碰到需要等待信號(hào)量再觸發(fā)的情況下需要特定處理,有沒更好的方法處理這種情況呢,答案很多是有的。要解決這需求就要保證代碼退出時(shí)和下次進(jìn)入時(shí)的位置是不變的,怎么實(shí)現(xiàn)呢?

實(shí)現(xiàn)這個(gè)需求的方式有很多,這里就使用純C來實(shí)現(xiàn):

#include

intfunction(void)
{
staticintstate;
switch(state)
{
case0:
do
{
printf("state:%d
",state);
state=1;
return0;
case1:;
printf("state:%d
",state);
}while(0);
}
}

intmain()
{
function();//輸出state:0
function();//輸出state:1
function();//輸出state:1
while(1)
{
}
}

這里還是采用狀態(tài)機(jī)來實(shí)現(xiàn),由于狀態(tài)值沒有發(fā)生改變,函數(shù)調(diào)用時(shí)觸發(fā)的動(dòng)作不變,這就保證了函數(shù)退出時(shí)和再次進(jìn)入的“入口”相同。

|優(yōu)化代碼

在介紹優(yōu)化前,先介紹一下C相關(guān)的宏:

intmain()
{
printf("%d
",__LINE__);//顯示所在行號(hào)
printf("%s
",__func__);//顯示所在函數(shù)
printf("%s
",__TIME__);//顯示當(dāng)前時(shí)間
printf("%s
",__DATE__);//顯示當(dāng)前日期
printf("%s
",__FILE__);//顯示所處文件名,在源代碼中插入當(dāng)前源代碼文件名
printf("%d
",__STDC__);//編譯器遵循ANSI C標(biāo)準(zhǔn)時(shí)該標(biāo)識(shí)被賦值為1;
return0;
}

簡(jiǎn)單優(yōu)化一下:

#include

intstate=0;

voidfunction_init(void)
{
state=0;
}

intfunction_handle(intcondition)
{
switch(state)
{
case0:
do
{
state=__LINE__;
case__LINE__:
if(!condition)
return0;
else
return1;
}while(0);
}
}

intmain()
{
//等待
intcondition=1;
function_init();
if(!function_handle(condition))
{
printf("pass
");
}
else
{
printf("obsolete
");
}
//觸發(fā)
condition=0;
function_init();
if(!function_handle(condition))
{
printf("pass
");
}
else
{
printf("obsolete
");
}
//等待
condition=1;
function_init();
if(!function_handle(condition))
{
printf("pass
");
}
else
{
printf("obsolete
");
}
//觸發(fā)
condition=0;
function_init();
if(!function_handle(condition))
{
printf("pass
");
}
else
{
printf("obsolete
");
}

while(1)
{
}
}

簡(jiǎn)單封裝一下:

#include

#defineBegin()
switch(state)
{
case0:

#defineWAIT(condition)
do
{
state=__LINE__;
case__LINE__:
if(!condition)
return0;
else
return1;
}while(0)

#defineEnd()}

intstate=0;

voidfunction_init(void)
{
state=0;
}

intfunction_handle(intcondition)
{
Begin();
WAIT(condition);
End();
}

intmain()
{
//等待
intcondition=1;
function_init();
if(!function_handle(condition))
{
printf("pass
");
}
else
{
printf("obsolete
");
}
//觸發(fā)
condition=0;
function_init();
if(!function_handle(condition))
{
printf("pass
");
}
else
{
printf("obsolete
");
}
//等待
condition=1;
function_init();
if(!function_handle(condition))
{
printf("pass
");
}
else
{
printf("obsolete
");
}
//觸發(fā)
condition=0;
function_init();
if(!function_handle(condition))
{
printf("pass
");
}
else
{
printf("obsolete
");
}
while(1)
{
}
}

| 最后優(yōu)化

源碼:

#include
#include
#include
#include

#definePT_BEGIN()
switch(pt->state)
{
case0:

#definePT_END()
pt->state=0;
return0;
}

#definePT_WAIT_UNTIL(condition)
do
{
pt->state=__LINE__;
case__LINE__:
if(!(condition))
return0;
}while(0)

typedefstruct
{
uint8_tstate;
}pt_t;

voidpt_init(pt_t*pt)
{
pt->state=0;
}

boolpt_run(pt_t*pt)
{
returnpt->state!=0;
}

intthread_fun(pt_t*pt)
{
staticuint32_tcounter=0;

PT_BEGIN();

while(1)
{
printf("counter=%lu
",counter++);
PT_WAIT_UNTIL(counter%10==0);
}

PT_END();
}

intmain()
{
pt_tpt_a;
pt_tpt_b;
pt_init(&pt_a);
pt_init(&pt_b);
while(true)
{
if(!pt_run(&pt_a))
{
thread_fun(&pt_a);
}
if(!pt_run(&pt_b))
{
thread_fun(&pt_b);
}
}

return0;
}

最后就完成了一個(gè)簡(jiǎn)單的線程,純C編寫非常方便移植和改寫!




審核編輯:劉清

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

    關(guān)注

    12

    文章

    550

    瀏覽量

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

    關(guān)注

    180

    文章

    7606

    瀏覽量

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

    關(guān)注

    2

    文章

    492

    瀏覽量

    27561

原文標(biāo)題:C語(yǔ)言|特殊狀態(tài)機(jī)

文章出處:【微信號(hào):玩轉(zhuǎn)單片機(jī),微信公眾號(hào):玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于C語(yǔ)言狀態(tài)機(jī)實(shí)現(xiàn)方案

    關(guān)于狀態(tài)機(jī),基礎(chǔ)的知識(shí)點(diǎn)可以自行理解。本文主要講解的是一個(gè)有限狀態(tài)機(jī)FSM通用的寫法,目的在于更好理解,移植,節(jié)省代碼閱讀與調(diào)試時(shí)間,體現(xiàn)出編程之美。
    發(fā)表于 09-13 09:28 ?862次閱讀
    基于<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的<b class='flag-5'>狀態(tài)機(jī)</b>實(shí)現(xiàn)方案

    如何設(shè)計(jì)自動(dòng)駕駛系統(tǒng)的狀態(tài)機(jī)

    狀態(tài)機(jī)模塊在自動(dòng)駕駛系統(tǒng)中扮演著關(guān)鍵的角色,它負(fù)責(zé)管理和控制各個(gè)功能的狀態(tài)轉(zhuǎn)換和行為執(zhí)行。今天我們來聊聊如何設(shè)計(jì)自動(dòng)駕駛系統(tǒng)的狀態(tài)機(jī)
    發(fā)表于 09-19 15:07 ?2691次閱讀
    如何設(shè)計(jì)自動(dòng)駕駛系統(tǒng)的<b class='flag-5'>狀態(tài)機(jī)</b>

    c語(yǔ)言狀態(tài)機(jī)資料(轉(zhuǎn))

    c語(yǔ)言狀態(tài)機(jī)資料 親 喜歡的拿去用吧
    發(fā)表于 08-07 14:32

    有限狀態(tài)機(jī)的硬件描述語(yǔ)言設(shè)計(jì)方法

    實(shí)驗(yàn)?zāi)康? 1、 熟悉用硬件描述語(yǔ)言(VHDL)設(shè)計(jì)一般狀態(tài)機(jī)所包含的幾個(gè)基本部分;2、 掌握用硬件描述語(yǔ)言(VHDL)設(shè)計(jì)Moore型和Mealy型有限狀態(tài)機(jī)的方法;3、 了解
    發(fā)表于 09-03 09:48 ?0次下載

    狀態(tài)機(jī)舉例

    狀態(tài)機(jī)舉例 你可以指定狀態(tài)寄存器和狀態(tài)機(jī)狀態(tài)。以下是一個(gè)有四種狀態(tài)的普通狀態(tài)機(jī)。 // Th
    發(fā)表于 03-28 15:18 ?989次閱讀

    狀態(tài)機(jī)原理及用法

    狀態(tài)機(jī)原理及用法狀態(tài)機(jī)原理及用法狀態(tài)機(jī)原理及用法
    發(fā)表于 03-15 15:25 ?0次下載

    狀態(tài)機(jī)概述 如何理解狀態(tài)機(jī)

    本篇文章包括狀態(tài)機(jī)的基本概述以及通過簡(jiǎn)單的實(shí)例理解狀態(tài)機(jī)
    的頭像 發(fā)表于 01-02 18:03 ?1w次閱讀
    <b class='flag-5'>狀態(tài)機(jī)</b>概述  如何理解<b class='flag-5'>狀態(tài)機(jī)</b>

    淺談狀態(tài)機(jī)的要素、分類

    說到單片機(jī)編程,不得不說到狀態(tài)機(jī)狀態(tài)機(jī)做為軟件編程的主要架構(gòu)已經(jīng)在各種語(yǔ)言中應(yīng)用,當(dāng)然包括C語(yǔ)言
    的頭像 發(fā)表于 10-20 17:27 ?5091次閱讀

    FPGA:狀態(tài)機(jī)簡(jiǎn)述

    本文目錄 前言 狀態(tài)機(jī)簡(jiǎn)介 狀態(tài)機(jī)分類 Mealy 型狀態(tài)機(jī) Moore 型狀態(tài)機(jī) 狀態(tài)機(jī)描述 一段式
    的頭像 發(fā)表于 11-05 17:58 ?7439次閱讀
    FPGA:<b class='flag-5'>狀態(tài)機(jī)</b>簡(jiǎn)述

    單片機(jī)C語(yǔ)言 -- 基于條件選擇的狀態(tài)機(jī)編程技巧

    單片機(jī)C語(yǔ)言 -- 基于條件選擇的狀態(tài)機(jī)編程技巧
    發(fā)表于 11-23 17:51 ?16次下載
    單片<b class='flag-5'>機(jī)</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b> -- 基于條件選擇的<b class='flag-5'>狀態(tài)機(jī)</b>編程技巧

    狀態(tài)模式(狀態(tài)機(jī))

    以前寫狀態(tài)機(jī),比較常用的方式是用 if-else 或 switch-case,高級(jí)的一點(diǎn)是函數(shù)指針列表。最近,看了一文章《c語(yǔ)言設(shè)計(jì)模式–狀態(tài)模式(
    發(fā)表于 12-16 16:53 ?9次下載
    <b class='flag-5'>狀態(tài)</b>模式(<b class='flag-5'>狀態(tài)機(jī)</b>)

    C語(yǔ)言狀態(tài)機(jī)編程思想

    關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容文章來源:頭條-嵌入式在左C語(yǔ)言在右鏈接:https://www.toutiao.com/i6843028812112855564/有限狀態(tài)機(jī)概念有限狀態(tài)機(jī)
    發(fā)表于 01-13 13:32 ?15次下載
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言狀態(tài)機(jī)</b>編程思想

    單片機(jī)狀態(tài)機(jī)淺談

    說到單片機(jī)編程,不得不說到狀態(tài)機(jī)狀態(tài)機(jī)做為軟件編程的主要架構(gòu)已經(jīng)在各種語(yǔ)言中應(yīng)用,當(dāng)然包括C語(yǔ)言
    發(fā)表于 02-10 10:44 ?12次下載
    單片<b class='flag-5'>機(jī)</b>之<b class='flag-5'>狀態(tài)機(jī)</b>淺談

    如何生成狀態(tài)機(jī)框架

    生成狀態(tài)機(jī)框架 使用FSME不僅能夠進(jìn)行可視化的狀態(tài)機(jī)建模,更重要的是它還可以根據(jù)得到的模型自動(dòng)生成用C++或者Python實(shí)現(xiàn)的狀態(tài)機(jī)框架。首先在FSME界面左邊的樹形列表中選擇"R
    的頭像 發(fā)表于 09-13 16:54 ?1003次閱讀
    如何生成<b class='flag-5'>狀態(tài)機(jī)</b>框架

    什么是狀態(tài)機(jī)狀態(tài)機(jī)的種類與實(shí)現(xiàn)

    狀態(tài)機(jī),又稱有限狀態(tài)機(jī)(Finite State Machine,F(xiàn)SM)或米利狀態(tài)機(jī)(Mealy Machine),是一種描述系統(tǒng)狀態(tài)變化的模型。在芯片設(shè)計(jì)中,
    的頭像 發(fā)表于 10-19 10:27 ?9724次閱讀
    主站蜘蛛池模板: 久久这里只有精品1| 国产99久久久欧美黑人刘玥| 麻豆成人久久精品二区三区网站| 拔萝卜电视剧高清免费| 亚洲精品永久免费| 日本一二三区在线视频| 老湿影院色情a| 久久99r66热这里只有精品| 国产成人精品综合久久久| jaPanesmature儿母| 诱人的秘书BD在线观看| 香港论理午夜电影网| 日本无码专区亚洲麻豆| 污污内射在线观看一区二区少妇| 欧洲video60| 毛片免费观看| 欧美日韩在线成人看片a| 久久这里只有精品国产99| 男人J进女人P| 蜜桃视频一区二区| 久久日本精品国产精品| 好爽胸大好深好多水| 国产亚洲欧美在线中文BT天堂网| 国产69TV精品久久久久99| 国产一区二区波多野结衣| 快播萝莉影院| 日日噜噜夜夜爽爽| 日本少妇无码精品12P| 羞羞影院男女爽爽影院尤物| 性生大片免费看| 在教室伦流澡到高潮H免费视频 | qvod 在线| SM双性精跪趴灌憋尿调教H| 国产精品第100页| 国产人人为我我为人人澡| 国产精品成人自拍| 久久电影午夜| 免费光看午夜请高视频| 甜涩性爱下载| 亚洲成a人不卡在线观看| 亚洲成人黄色在线|