亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: 關(guān)于如何提高代碼的執(zhí)行效率-進(jìn)階篇 [打印本頁(yè)]

作者: qinlu123    時(shí)間: 2025-3-10 10:55
標(biāo)題: 關(guān)于如何提高代碼的執(zhí)行效率-進(jìn)階篇
我在上一篇帖子簡(jiǎn)單展示了如何使用狀態(tài)機(jī)來(lái)替代阻塞延時(shí),這一篇我將向大家展示如何使用結(jié)構(gòu)體和函數(shù)指針來(lái)構(gòu)建對(duì)象。假設(shè)有個(gè)需求是需要三個(gè)LED分別按照5HZ、1HZ和0.5HZ的頻率來(lái)閃爍,我們應(yīng)該怎么實(shí)現(xiàn)它呢?如果按照上篇的解決方案需要三個(gè)LED_Twinkle函數(shù),只是函數(shù)內(nèi)部關(guān)于開(kāi)關(guān)LED的部分不一樣。這樣存在一個(gè)問(wèn)題,假如LED_Twinkle是一個(gè)非常復(fù)雜函數(shù),那么寫(xiě)三遍非常費(fèi)時(shí)費(fèi)力容易出bug并且編譯出的可執(zhí)行文件體積還大。于是乎面向?qū)ο蠛痛a分層呼之欲出,廢話不多說(shuō)先上代碼。

  1. struct LED_Obj
  2. {
  3.    uint8_t Status;
  4.    uint16_t DelayTime_LED;
  5.    void (*LED_OnOff)(uint8_t Com);
  6. };
  7. void LED1_OnOff(uint8_t Com)
  8. {
  9.    if(Com != 0)
  10.    {
  11.      LED1(ON);
  12.    }
  13.    else
  14.    {
  15.      LED1(OFF);
  16.    }
  17. }
  18. void LED2_OnOff(uint8_t Com)
  19. {
  20.    if(Com != 0)
  21.    {
  22.      LED2(ON);
  23.    }
  24.    else
  25.    {
  26.      LED2(OFF);
  27.    }
  28. }
  29. void LED3_OnOff(uint8_t Com)
  30. {
  31.    if(Com != 0)
  32.    {
  33.      LED3(ON);
  34.    }
  35.    else
  36.    {
  37.      LED3(OFF);
  38.    }
  39. }
  40. struct LED_Obj LED1 =
  41. {
  42.    .LED_OnOff = LED1_OnOff
  43. };
  44. struct LED_Obj LED2 =
  45. {
  46.    .LED_OnOff = LED2_OnOff
  47. };
  48. struct LED_Obj LED3 =
  49. {
  50.    .LED_OnOff = LED3_OnOff
  51. };
  52. void DelayTimeCount_ms(uint16_t *DelayTime_Count)
  53. {
  54.    if(*DelayTime_Count==0)
  55.    {
  56.      *DelayTime_Count=0;
  57.    }
  58.    else
  59.    {
  60.      *DelayTime_Count-=1;
  61.    }
  62. }
  63. void Set_Delay_Time(uint16_t Time,uint16_t *DelayTime_Count)
  64. {
  65.    *DelayTime_Count=Time;
  66. }
  67. uint8_t CheckDelay(uint16_t *DelayTime_Count)
  68. {
  69.    if(*DelayTime_Count==0)
  70.    {
  71.      return 0;
  72.    }
  73.    else
  74.    {
  75.      return 1;
  76.    }
  77. }
  78. void LED_Twinkle(struct LED_Obj *LED,uint16_t HarfPeriod)
  79. {
  80.    switch(LED->Status)
  81.    {
  82.      case 0:
  83.      {
  84.         LED->LED_OnOff(ON);
  85.         Set_Delay_Time(HarfPeriod,&LED->DelayTime_LED);
  86.         LED->Status++;
  87.       }break;
  88.      case 1:
  89.      {
  90.         if(CheckDelay(&LED->DelayTime_LED) == 0)
  91.         {
  92.            LED->Status++;
  93.         }
  94.      }break;
  95.      case 2:
  96.      {
  97.         LED->LED_OnOff(OFF);
  98.         Set_Delay_Time(HarfPeriod,&LED->DelayTime_LED);
  99.         LED->Status++;
  100.       }break;
  101.      case 3:
  102.      {
  103.        if(CheckDelay(&LED->DelayTime_LED) == 0)
  104.        {
  105.          LED->Status = 0;
  106.        }
  107.      }break;
  108.    }
  109. }
  110. void LED_Run(void)
  111. {
  112.    LED_Twinkle(&LED1,100);
  113.    LED_Twinkle(&LED2,500);
  114.    LED_Twinkle(&LED3,1000);
  115. }
  116. void Task_1mS(void)
  117. {
  118.    DelayTimeCount_ms(&LED1.DelayTime_LED);
  119.    DelayTimeCount_ms(&LED2.DelayTime_LED);
  120.    DelayTimeCount_ms(&LED3.DelayTime_LED);
  121. }
復(fù)制代碼



這段代碼涉及到結(jié)構(gòu)體和函數(shù)指針的語(yǔ)法知識(shí),關(guān)于語(yǔ)法這里不再贅述,我來(lái)介紹一下這段代碼是如何面向?qū)ο蠛头謱拥摹?br /> 結(jié)構(gòu)體:

struct LED_Obj
{
    uint8_t Status;
    uint16_t DelayTime_LED;
    void (*LED_OnOff)(uint8_t Com);
};



該結(jié)構(gòu)體成員包括運(yùn)行狀態(tài)變量(Status)、LED開(kāi)關(guān)延時(shí)變量(DelayTime_LED)以及作為上下層接口用來(lái)控制LED開(kāi)關(guān)的函數(shù)指針(*LED_OnOff)(uint8_t Com)
硬件層部分:

void LED1_OnOff(uint8_t Com);
void LED2_OnOff(uint8_t Com);
void LED3_OnOff(uint8_t Com);
這三個(gè)函數(shù)就是控制IO來(lái)實(shí)現(xiàn)LED開(kāi)關(guān)
結(jié)構(gòu)體實(shí)例化(對(duì)象):


struct LED_Obj LED1 =
{
    .LED_OnOff = LED1_OnOff
};
struct LED_Obj LED2 =
{
    .LED_OnOff = LED2_OnOff
};
struct LED_Obj LED3 =
{
    .LED_OnOff = LED3_OnOff
};



因?yàn)槲覀冇?個(gè)LED需要控制,所以需要?jiǎng)?chuàng)建3個(gè)LED_Obj對(duì)象并實(shí)現(xiàn)硬件層和應(yīng)用層的連接(函數(shù)指針初始化,指向一個(gè)函數(shù))
應(yīng)用層:


void LED_Twinkle(struct LED_Obj *LED,uint16_t HarfPeriod)
{
    switch(LED->Status)
    {
        case 0:
        {
            LED->LED_OnOff(ON);
            Set_Delay_Time(HarfPeriod,&LED->DelayTime_LED);
            LED->Status++;
        }break;
        case 1:
        {
            if(CheckDelay(&LED->DelayTime_LED) == 0)
            {
                LED->Status++;
            }
        }break;
        case 2:
        {
            LED->LED_OnOff(OFF);
            Set_Delay_Time(HarfPeriod,&LED->DelayTime_LED);
            LED->Status++;
        }break;
        case 3:
        {
            if(CheckDelay(&LED->DelayTime_LED) == 0)
            {
                LED->Status = 0;
            }
        }break;
    }
}
void LED_Run(void)
{
    LED_Twinkle(&LED1,100);
    LED_Twinkle(&LED2,500);
    LED_Twinkle(&LED3,1000);
}
void Task_1mS(void)
{
    DelayTimeCount_ms(&LED1.DelayTime_LED);
    DelayTimeCount_ms(&LED2.DelayTime_LED);
    DelayTimeCount_ms(&LED3.DelayTime_LED);
}

至此,我們就實(shí)現(xiàn)了三個(gè)LED的分別控制。




作者: qinlu123    時(shí)間: 2025-3-10 11:08
注意LED(ON)屬于形式代碼,對(duì)于stm32來(lái)說(shuō)可能是HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);或者PAout(15) = 0;對(duì)于51單片機(jī)來(lái)說(shuō)可能是P1^0 = 0;
作者: wwzgch    時(shí)間: 2025-3-12 07:58
雖然看不懂,但是得先點(diǎn)贊
作者: qinlu123    時(shí)間: 2025-3-12 16:46
wwzgch 發(fā)表于 2025-3-12 07:58
雖然看不懂,但是得先點(diǎn)贊

我步子邁大啦?
作者: wwzgch    時(shí)間: 2025-3-12 21:41
qinlu123 發(fā)表于 2025-3-12 16:46
我步子邁大啦?

是我這理解能力有待進(jìn)步,平時(shí)都是用8位機(jī)。都是簡(jiǎn)單的寫(xiě)法,向群主學(xué)習(xí)
作者: ohshit    時(shí)間: 2025-3-13 09:05
間下AI怎么寫(xiě)
作者: qinlu123    時(shí)間: 2025-3-13 10:06
wwzgch 發(fā)表于 2025-3-12 21:41
是我這理解能力有待進(jìn)步,平時(shí)都是用8位機(jī)。都是簡(jiǎn)單的寫(xiě)法,向群主學(xué)習(xí)

我回復(fù)你之后,你的頁(yè)面右上角頭像左邊那里會(huì)有提醒嗎
作者: qinlu123    時(shí)間: 2025-3-13 16:06
大家可以把我上邊的代碼復(fù)制到deepseek,NNT的比我解釋的都好
作者: qinlu123    時(shí)間: 2025-3-13 16:22
我并沒(méi)有系統(tǒng)學(xué)習(xí)過(guò)面向?qū)ο缶幊蹋皇窃诠ぷ髦薪?jīng)常遇到很多重復(fù)功能,比如有好多個(gè)DS18B20接口(獨(dú)立總線),有好多個(gè)同型號(hào)的IIC設(shè)備(獨(dú)立總線),有好多個(gè)PID控制器等等。經(jīng)過(guò)不斷摸索不斷嘗試,發(fā)現(xiàn)這種編寫(xiě)代碼的方法最高效最易讀最易維護(hù),直到后來(lái)我才知道原來(lái)我這種寫(xiě)作方法就是面向?qū)ο蟆顟B(tài)機(jī)+面向?qū)ο罂梢允构ぷ魈貏e高效,我現(xiàn)在連操作系統(tǒng)都看不上(項(xiàng)目沒(méi)那么復(fù)雜)。希望初學(xué)者不要像我一樣多走好幾年彎路,提早走向面向?qū)ο缶幊痰膽驯А?hr noshade size="2" width="100%" color="#808080"> 作者: wwzgch    時(shí)間: 2025-3-13 18:49
qinlu123 發(fā)表于 2025-3-13 10:06
我回復(fù)你之后,你的頁(yè)面右上角頭像左邊那里會(huì)有提醒嗎

消息里面會(huì)有提醒,平時(shí)我登陸這個(gè)網(wǎng)站不多
作者: qinlu123    時(shí)間: 2025-3-14 07:54
發(fā)表于 2025-3-13 18:49
消息里面會(huì)有提醒,平時(shí)我登陸這個(gè)網(wǎng)站不多

@admin為啥我沒(méi)有提醒
作者: wwzgch    時(shí)間: 2025-3-14 10:51
qinlu123 發(fā)表于 2025-3-13 16:22
我并沒(méi)有系統(tǒng)學(xué)習(xí)過(guò)面向?qū)ο缶幊蹋皇窃诠ぷ髦薪?jīng)常遇到很多重復(fù)功能,比如有好多個(gè)DS18B20接口(獨(dú)立總線 ...

是的,不想被淘汰就要不斷的學(xué)習(xí)新的編程思想和技巧。樓主平時(shí)都用什么MCU做方案
作者: 188610329    時(shí)間: 2025-3-14 23:35
標(biāo)題和內(nèi)容不符,
標(biāo)題是: 關(guān)于如何提高代碼的執(zhí)行效率
而實(shí)際是: 反而降低了執(zhí)行效率




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1