久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1203|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

關(guān)于如何提高代碼的執(zhí)行效率

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:446156 發(fā)表于 2024-11-8 18:19 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我要講的提高代碼效率的方法很簡(jiǎn)單,不涉及底層。簡(jiǎn)單講就是程序非阻塞。
何為阻塞?阻塞就是程序停在那里一動(dòng)不動(dòng),比如
  1. while(a==0);
復(fù)制代碼
又或者使用for循環(huán)做的延時(shí)
  1. void delay(int time)
  2. {
  3.      int i=0;
  4.      for(i=0;i<time;i++);
  5. }
復(fù)制代碼
要想程序執(zhí)行效率高就不能使用毫秒級(jí)的阻塞寫法,極短的阻塞是可以的比如IIC的電平翻轉(zhuǎn)的間隔延時(shí)。非阻塞寫法的一大重要方法就是狀態(tài)機(jī),以常用的LED閃爍為例。我們先準(zhǔn)備三個(gè)函數(shù)。
  1. void DelayTimeCount_ms(uint16_t *DelayTime_Count)
  2. {
  3.      if(*DelayTime_Count==0)
  4.      {
  5.          *DelayTime_Count=0;
  6.      }
  7.      else
  8.      {
  9.          *DelayTime_Count-=1;
  10.      }
  11. }
  12. void Set_Delay_Time(uint16_t Time,uint16_t *DelayTime_Count)
  13. {
  14.      *DelayTime_Count=Time;
  15. }
  16. uint8_t CheckDelay(uint16_t *DelayTime_Count)
  17. {
  18.      if(*DelayTime_Count==0)
  19.      {
  20.          return 0;
  21.      }
  22.      else
  23.      {
  24.          return 1;
  25.      }
  26. }
復(fù)制代碼
我們?cè)賱?chuàng)建一個(gè)全局變量用于設(shè)置LED閃爍間隔
  1. uint16_t DelayTime_LED;
復(fù)制代碼
接下來寫一個(gè)LED閃爍函數(shù)并把其放在大循環(huán)調(diào)用
  1. void LED_Twinkle(uint16_t HarfPeriod)
  2. {
  3.     static uint8_t Status=0;

  4.     switch(Status)
  5.     {
  6.         case 0:
  7.         {
  8.             LED(ON);
  9.             Set_Delay_Time(HarfPeriod,&DelayTime_LED);
  10.             Status++;
  11.         }break;
  12.         case 1:
  13.         {
  14.             if(CheckDelay(&DelayTime_LED) == 0)
  15.             {
  16.                 Status++;
  17.             }
  18.         }break;
  19.         case 2:
  20.         {
  21.             LED(OFF);
  22.             Set_Delay_Time(HarfPeriod,&DelayTime_LED);
  23.             Status++;
  24.         }break;
  25.         case 3:
  26.         {
  27.             if(CheckDelay(&DelayTime_LED) == 0)
  28.             {
  29.                 Status = 0;
  30.             }
  31.         }break;
  32.     }
  33. }
復(fù)制代碼
接下來我們還需要對(duì)DelayTime_LED進(jìn)行處理
  1. DelayTimeCount_ms(&DelayTime_LED);
復(fù)制代碼
上邊這條語句需要放在滴答中斷里(51沒有專用滴答定時(shí)器可以用普通定時(shí)器模擬一個(gè)或者直接扔到大循環(huán)里也行)。可以發(fā)現(xiàn)用這種方法程序會(huì)飛快地循環(huán)不會(huì)在某個(gè)地方停下來。
這玩意沒啥技術(shù)含量無非就是多寫幾行代碼。如果有興趣的話可以看看我發(fā)的矩陣鍵盤驅(qū)動(dòng)和modbus主機(jī)驅(qū)動(dòng)里邊有更詳細(xì)的應(yīng)用。



評(píng)分

參與人數(shù) 2黑幣 +85 收起 理由
1109 + 15 贊一個(gè)!
admin + 70 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:401564 發(fā)表于 2024-11-9 09:36 | 只看該作者
太復(fù)雜了
先聲明一個(gè)全局變量  u8 time_sys = 0;
然后,開啟定時(shí)器和中斷,在中斷中 time_sys++;就什么都不用管,這就是一個(gè)低配版的STM32滴答定時(shí)器了

void key_disp_sw(u8 i)
{
        static u8 ren = 0;
        static u16 key_ms = 0;//
        if(ren != i)
        {
                ren = i;
                key_ms = (key_ms < 250) ? (key_ms + 1) : key_ms;
                if((key_ms >= 延時(shí)時(shí)間) && (觸發(fā)條件))
                {
                  ......................................................
                        key_ms = 0;
                     清除觸發(fā)條件;
                }
        }
}


key_disp_sw(time_sys);
回復(fù)

使用道具 舉報(bào)

板凳
ID:446156 發(fā)表于 2024-11-9 11:21 | 只看該作者
Y_G_G 發(fā)表于 2024-11-9 09:36
太復(fù)雜了
先聲明一個(gè)全局變量  u8 time_sys = 0;
然后,開啟定時(shí)器和中斷,在中斷中 time_sys++;就什么都不 ...

復(fù)雜在那里
回復(fù)

使用道具 舉報(bào)

地板
ID:57414 發(fā)表于 2024-11-9 20:38 | 只看該作者
看懂了,謝謝樓主!
回復(fù)

使用道具 舉報(bào)

5#
ID:401564 發(fā)表于 2024-11-11 00:17 | 只看該作者

一樣的功能,一樣的效率,一樣的原理
看你代碼多少行,我的代碼多少行
回復(fù)

使用道具 舉報(bào)

6#
ID:446156 發(fā)表于 2024-11-11 08:29 | 只看該作者
Y_G_G 發(fā)表于 2024-11-11 00:17
一樣的功能,一樣的效率,一樣的原理
看你代碼多少行,我的代碼多少行

我要建立一個(gè)通用框架,并非就事論事
回復(fù)

使用道具 舉報(bào)

7#
ID:301191 發(fā)表于 2024-11-16 13:51 | 只看該作者
頂一下
回復(fù)

使用道具 舉報(bào)

8#
ID:108361 發(fā)表于 2025-4-16 11:10 | 只看該作者
建立通用框架,就不用造什么輪子,直接freertos;就是論事,就用一個(gè)全局變量在定時(shí)器里++做滴答計(jì)數(shù),主循環(huán)檢測(cè)時(shí)間是否達(dá)到預(yù)設(shè)值
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日日操操 | 国产欧美一区二区三区另类精品 | 久久伊人操 | 久久亚洲一区二区三区四区 | 成人免费视频 | 日韩在线国产 | 国产91在线播放精品91 | 在线中文视频 | 久久最新网址 | 亚洲v区 | 一区二区三区免费网站 | 久久久久久久久久毛片 | 日本欧美大片 | 在线免费观看视频你懂的 | 天天干狠狠操 | 亚洲成人精品在线观看 | 中文字幕一区二区三区四区五区 | 激情六月丁香 | 天天爱天天操 | 成人久久久 | 中文在线视频观看 | 一区二区三区四区在线视频 | 久久69精品久久久久久国产越南 | 免费在线观看一级毛片 | 久草热视频 | 激情欧美一区二区三区 | 日韩专区中文字幕 | 亚洲视频免费在线播放 | 天天干天天草 | 一区二区三区不卡视频 | 欧美性久久 | 亚洲一区二区免费 | 欧美日韩久久 | 99热最新网址| 91黄色免费看 | 一区观看| 亚洲一区不卡 | 国产1区| 亚洲精品免费视频 | 久久精品一 | 中文字幕精 |