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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

單片機程序之高效的位移操

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年07月13日   【字體:

近來,在制作一些家用的小電器,又在收集、學習智能家居和物聯網方面的知識。緊接著網站又搬了一個新家,將近一個月沒有碼字了。這些好像都跟阿浩的做事效率有關,而這篇文章也是說效率的,但并不是說阿浩的效率如何的低,而是怎樣讓單片機執行更高效的代碼。

說到這里,有人或許會反駁我:用匯編不就行了嘛?答案是肯定的。用匯編寫程序,產生的代碼精短,執行效率高,無可置疑。但是當你要寫一個大型的程序,而對執行效率要求要高的話,選擇C語言來寫,具有優勢。這種優勢,就不在這大費口舌了。而下面介紹的幾個方法,對你寫出高效的C程序有一些幫助。

 


首先,必須知道的,一個C語言程序,最終是要編譯成機器碼給單片機執行的。也就是說,C語言將被編譯器,“翻譯”成匯編代碼,然后編譯成單片機最終的代碼。以上理解了就好辦,我們只需要讓C語言寫的代碼,“翻譯”成匯編代碼會,代碼行減少了,就說這種寫法更高效。

一.高效的位移操作

我們在許多模擬串行通信中需要用到移位操作。
例如,IIC、SPI,1-Wire總線等等

這里以1-Wire總線讀一個字節為例
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i = 0; i < 8; i++)
{
if(read_bit())
value| = 0 x 01< delay(10); //等待總線時隙
}
return(value);
}[\c]

這段代碼是正確的,但編譯后執行效率并不高。
而其實只要深入了解C和匯編之間的關系,寫出高效的C代碼,既有C的便利,又有匯編的效率。

下面對代碼進行修改剖析:
1.for(i=0;i 解釋一下:因為CPU判斷一個數是否為0,只需要一條指令。比判斷一個數多大要執行得快(需要3個指令)。

2.value|=0x01<>=1; //先右移一位,value最高位一定是0

if(read_bit()){
value|=0x80; //判斷總線狀態,如果是高,就把value的最高位置1
}[\c]

這樣寫出來的代碼變得極其高效,編譯后基本就是匯編級的代碼了。

二.位移操作,讓計算更高效

使用單片機AD采集信號方面,通常做法是連續采集N次,然后求平均值。
一般為了MCU計算更為“方便”,采集次數推薦用8,16,32,64,128,256等次數,你懂的,這些數比較特殊。
這里以采樣128次,然后求平均值為例。注:sampling()為外部采樣函數。

unsigned int total;
unsigned char i,val;
for(i=0;i<128;i++)
{
total+=sampling();
}
val=total/128;[\c]

以上代碼是通常的寫法,但是效率并不高,浪費資源。

改造進行
1.首先分析128這個數是0B10000000,發現其實第7位是1,其他位都為0,所以我們就可以判斷第7位的狀態來判斷128次采樣是否到了。
2.val=total/128 運用了除法運算,浪費資源,完全可以用右移的方法來代替(雖然有些編譯器會將此類運算轉換為位移運算,但寫成移位的鐵定沒錯)。
val=total/128等同于 val=(unsigned char)(total>>7);
但這并不完全高效,還再優化一下:
total>>7 還可以變通成(total<<1)>>8,先左移動一位,再右移動8位,不就成了右移 7 位了么? 因為位移1,4,8位的操作只需要一個指令。

unsigned int total;
unsigned char i=0
unsigned char val;
while(!(i&0x80)){ //判斷 i 第7位,只需要一個指令。
total+=sampling();
i++;
}
val=(unsigned char)((total<<1)>>8); //幾個指令就代替了幾十個指令的除法運算[\c]

編譯后的代碼量居然可以減少一半,而運算速度可以提高幾倍,再回頭,就可以理解為什么采用次數要用推薦的一些特殊值了。

關閉窗口

相關文章

主站蜘蛛池模板: 狠狠躁18三区二区一区 | 日日夜夜天天 | 亚洲视频在线一区 | 91精品中文字幕一区二区三区 | 毛片高清 | 亚洲一区二区中文字幕 | 黄色大片免费看 | 天天色天天射天天干 | www.亚洲一区二区三区 | 日韩一区二区在线视频 | 麻豆国产精品777777在线 | 色视频成人在线观看免 | 浮生影院免费观看中文版 | 亚洲精品久久久久久首妖 | 欧美成人精品二区三区99精品 | 蜜桃视频在线观看免费视频网站www | 成人日韩 | 亚洲一区中文字幕在线观看 | 97精品一区二区 | 日韩成人高清在线 | 丁香五月缴情综合网 | 国产视频久久 | 天堂精品视频 | 国产一级片 | 99精品久久 | 看片国产| 特级黄一级播放 | 欧美lesbianxxxxhd视频社区 | 日本视频中文字幕 | 日韩在线看片 | www.日韩av.com | 99福利视频导航 | 国产一在线 | 国产成人高清视频 | 国产午夜精品一区二区三区四区 | 精品国产乱码一区二区三区 | 日韩精品一区二区三区中文字幕 | 中文字幕亚洲欧美 | 久久久精品一区二区三区 | 美日韩中文字幕 | 在线日韩中文字幕 |