最近又看到一本好書《刪繁就簡——單片機入門到精通》,裏面講的不少都是我不知道的或者沒有注意的。優化
單片機處理與它等位寬的數據時是最快的。讓8位單片機和32位單片機去處理一個32位的數據天然是32位的單片機快。另外在文中,還給出了一個例子,關於數據的複製,有兩段代碼。一個是沒有通過優化的代碼,另外一個是考慮到不一樣處理器不一樣位寬的代碼。spa
//代碼一:
void Copy_TestFunc(char *desBuf, char *srcBuf, unsigned long size) { while(size) { *desBuf = *srcBuf; size--; desBuf++; srcBuf++; } } //代碼2 void Copy_TestFunc1(char *desBuf, char *srcBuf, unsigned long size) { long *p1, *p2; short *p3, *p4; char *p5, *p6; if((((long)desBuf&0x3)==0) && (((long)srcBuf&0x3)==0)) { //32bits mode p1 = (long*)desBuf; p2 = (long*)srcBuf; while(size>=4) { *p1 = *p2; size -= 4; p1++; p2++; } p5 = (char*)p1; p6 = (char*)p2; while(size) { *p5 = *p6; size--; p5++; p6++; } } else if((((long)desBuf&0x1)==0) && (((long)srcBuf&0x1)==0)) { //16bits mode p3 = (short*)desBuf; p4 = (short*)srcBuf; while(size>=2) { *p3 = *p4; size -= 2; p1++; p2++; } if(size) { (char*)p3 = (char*)p4; } } else { //8bits mode while(size) { *desBuf = *srcBuf; size--; desBuf++; srcBuf++; } } }其中代碼一沒有考慮具體硬件平臺,每次都是一個字節的複製,當若是硬件平臺位寬高時,好比32位。數據複製量大時,效率就會下降。而代碼二考慮到了不一樣位寬的處理器,這樣效率就天然提升了。
另外我還學到了一個建議,咱們常常會在程序中設置標誌變量,若是你的單片機支持位運算的話。那麼能夠位定義,好比51單片機,咱們能夠bit flag = 0;然而若是當你的處理器不支持位運算,在RAM空間容許狀況下,咱們最好使用與處理器等位寬的變量表示。不然彙編效率會低下。好比8位單片機cha x不一樣位表示不一樣狀態信息。如今須要對bit0進行位置1和清0操做。則x |= 1 和 x&= 0xFE,效率沒有直接x=1和x=0高。code
參考《刪繁就簡——單片機入門到精通》
it
天天都進步一點。入門