|
我們開發(fā)的電表,基于單片機(jī)的,電表的功能越來越多,要求我們再硬件不變的情況下增加這些功能,所以就經(jīng)常會考慮程序大小問題,有時真的會按字節(jié)去省空間,因為,就是那幾個字節(jié)編譯就爆掉了。但是還要求盡量程序可維護(hù)性好(簡單、直接、易讀)。這時就要去程序中尋找能省空間的地方,能用指針就考慮要不要換指針,犧牲一些可讀性,使用for&if代替switch的一些表達(dá)式。重復(fù)的語句使用函數(shù)代替,使用位域,尋找簡便的程序處理方法等,,打開編譯產(chǎn)生的map文件分析哪里占的存儲大,進(jìn)行精簡,真是挺有意思的。就好像捉迷藏。
這些省空間的操作有些基于C語言的特性,比如指針,比如位操作,比如位域操作在保留可讀性的情況下代替一堆flag。
struct file_data{
unsigned int day: 5;
unsigned int month: 4;
unsigned int year: 7;
}
struct file_data fd;
fd.day = 20;
fd.month = 4;
fd.year = 22;
這樣定義,變量day占了5個位,month占4個位,year占7位。同時也保留了可讀性。
雖然這種寫法省空間,但是有限,而且不太好用,迫不得已還是別這么搞。但是位操作的話這么些會好看一點如:
struct bits{
unsigned int flag_0: 1;
unsigned int flag_1: 1;
unsigned int flag_2: 1;
unsigned int flag_3: 1;
unsigned int flag_4: 1;
unsigned int flag_5: 1;
unsigned int flag_6: 1;
unsigned int flag_7: 1;
};
struct bits flag_grop;
if(flag_grop.flag_0 == 1)
{
flag_grop.flag_1 = 0;
}
這樣寫一些還可以。
還有聯(lián)合體,在不增加開銷的情況下簡潔的提供了多種解析數(shù)據(jù)的方式,真是一個不錯的工具
union bits{
u8 data;
unsigned int flag_0: 1;
unsigned int flag_1: 1;
unsigned int flag_2: 1;
unsigned int flag_3: 1;
unsigned int flag_4: 1;
unsigned int flag_5: 1;
unsigned int flag_6: 1;
unsigned int flag_7: 1;
};
union bits flag_grop;
flag_grop = 0xAA;
if(flag_grop.int flag_0 == 1)
{}
if(flag_grop.int flag_1 == 1)
{}
...
如上該聯(lián)合體只占了一個字節(jié)的空間。提供了兩種方便讀寫操作的解析數(shù)據(jù)的方式 字節(jié)操作與位操作。
聯(lián)合體用來處理通訊挺好的。
假設(shè)串口發(fā)送數(shù)據(jù)是按字節(jié)發(fā)送,但是我們要發(fā)送的數(shù)據(jù)可能時16位的或者32位的,還會面臨先發(fā)高子節(jié)還是低字節(jié)問題。1、我們可以使用指針
將一個整型數(shù)據(jù)分為4次發(fā)送。2、我們也可以利用聯(lián)合體的特性將整型數(shù)據(jù)分4次發(fā)出。還能增加一點可讀性。
今天看到一句話:no time to be brief 感覺有時用著還挺好
|
評分
-
查看全部評分
|