關於變量類型與代碼效率

最近又看到一本好書《刪繁就簡——單片機入門到精通》,裏面講的不少都是我不知道的或者沒有注意的。優化

單片機處理與它等位寬的數據時是最快的。讓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


天天都進步一點。入門

相關文章
相關標籤/搜索