|
我要講的提高代碼效率的方法很簡單,不涉及底層。簡單講就是程序非阻塞。
何為阻塞?阻塞就是程序停在那里一動不動,比如又或者使用for循環(huán)做的延時- void delay(int time)
- {
- int i=0;
- for(i=0;i<time;i++);
- }
復(fù)制代碼 要想程序執(zhí)行效率高就不能使用毫秒級的阻塞寫法,極短的阻塞是可以的比如IIC的電平翻轉(zhuǎn)的間隔延時。非阻塞寫法的一大重要方法就是狀態(tài)機,以常用的LED閃爍為例。我們先準(zhǔn)備三個函數(shù)。- void DelayTimeCount_ms(uint16_t *DelayTime_Count)
- {
- if(*DelayTime_Count==0)
- {
- *DelayTime_Count=0;
- }
- else
- {
- *DelayTime_Count-=1;
- }
- }
- void Set_Delay_Time(uint16_t Time,uint16_t *DelayTime_Count)
- {
- *DelayTime_Count=Time;
- }
- uint8_t CheckDelay(uint16_t *DelayTime_Count)
- {
- if(*DelayTime_Count==0)
- {
- return 0;
- }
- else
- {
- return 1;
- }
- }
復(fù)制代碼 我們再創(chuàng)建一個全局變量用于設(shè)置LED閃爍間隔
接下來寫一個LED閃爍函數(shù)并把其放在大循環(huán)調(diào)用
- void LED_Twinkle(uint16_t HarfPeriod)
- {
- static uint8_t Status=0;
- switch(Status)
- {
- case 0:
- {
- LED(ON);
- Set_Delay_Time(HarfPeriod,&DelayTime_LED);
- Status++;
- }break;
- case 1:
- {
- if(CheckDelay(&DelayTime_LED) == 0)
- {
- Status++;
- }
- }break;
- case 2:
- {
- LED(OFF);
- Set_Delay_Time(HarfPeriod,&DelayTime_LED);
- Status++;
- }break;
- case 3:
- {
- if(CheckDelay(&DelayTime_LED) == 0)
- {
- Status = 0;
- }
- }break;
- }
- }
復(fù)制代碼 接下來我們還需要對DelayTime_LED進行處理
- DelayTimeCount_ms(&DelayTime_LED);
復(fù)制代碼 上邊這條語句需要放在滴答中斷里(51沒有專用滴答定時器可以用普通定時器模擬一個或者直接扔到大循環(huán)里也行)?梢园l(fā)現(xiàn)用這種方法程序會飛快地循環(huán)不會在某個地方停下來。
這玩意沒啥技術(shù)含量無非就是多寫幾行代碼。如果有興趣的話可以看看我發(fā)的矩陣鍵盤驅(qū)動和modbus主機驅(qū)動里邊有更詳細的應(yīng)用。
|
評分
-
查看全部評分
|