我要講的提高代碼效率的方法很簡單,不涉及底層。簡單講就是程序非阻塞。
何為阻塞?阻塞就是程序停在那里一動不動,比如又或者使用for循環做的延時- void delay(int time)
- {
- int i=0;
- for(i=0;i<time;i++);
- }
復制代碼 要想程序執行效率高就不能使用毫秒級的阻塞寫法,極短的阻塞是可以的比如IIC的電平翻轉的間隔延時。非阻塞寫法的一大重要方法就是狀態機,以常用的LED閃爍為例。我們先準備三個函數。- 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;
- }
- }
復制代碼 我們再創建一個全局變量用于設置LED閃爍間隔
接下來寫一個LED閃爍函數并把其放在大循環調用
- 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;
- }
- }
復制代碼 接下來我們還需要對DelayTime_LED進行處理
- DelayTimeCount_ms(&DelayTime_LED);
復制代碼 上邊這條語句需要放在滴答中斷里(51沒有專用滴答定時器可以用普通定時器模擬一個或者直接扔到大循環里也行)。可以發現用這種方法程序會飛快地循環不會在某個地方停下來。
這玩意沒啥技術含量無非就是多寫幾行代碼。如果有興趣的話可以看看我發的矩陣鍵盤驅動和modbus主機驅動里邊有更詳細的應用。
|