matter智能家居espc2-c3公司深圳樂鑫芯片代理商C語言存儲資源優化,受限于尺寸、功耗以及成本等因素,嵌入式系統中存儲資源 RAM和ROM通常不易擴展。特別在單處理器芯片系統中,程序和數據只能使用片內有限的存儲資源,因此,在嵌人式系統軟件開發過程中,常常需要優化資源的使用,減少程序對存儲資源的需求。
1.ROM空間優化
在嵌人式系統中,用ROM 保存二進制程序代碼和程序中所需的數據,系統中的ROM 空間分為代碼空間和數據空間。
(1)代碼空間
通常優化程序代碼長度的方法有兩個:一是使用指令長度小的指令集;二是優化程序,減少指令數。
RISC-V 指令集架構中包括擴展指令集“C”。“C”是壓縮指令集模塊,指令長度為 16 位。在完成相同操作的情況下,使用 RISC-V 壓縮指令集“C”的程序長度是使用32 位指令集的一半。例如,matter智能家居espc2-c3公司深圳樂鑫芯片代理商RV32I 兩個數相加指令“add rd,rd,rsl”的長度是32位,而“C”指令“c.add rd,rs1”的長度是 16位。
一些通過簡化運算提高程序速度的優化方法同時也縮短程序的長度。用更簡單的算法替代復雜算法,可以減少程序指令數。在參數值確定或在數值有限的情況下,可以用簡單計算替代復雜運算。例如,計算a³時,用乘法“b=a* a * a”替換指數函數“b=pow(a,3,0f)”后,計算部分由 100 多條指令減少到2條指令。
另外,一些加速程序的優化方法會增加程序的指令數。例如,循環展開、內聯函數等手段將增加程序代碼的長度。matter智能家居espc2-c3公司深圳樂鑫芯片代理商使用此類方法對程序進行優化時需要權衡程序行速度和空間的問題,在空間允許的情況下進行速度優化。
(2) 數據空間
ROM中所保存的程序運行時所需的數據通常包括變量初始值、常和其他數據,通過修改數據類型、調整數據結構等方法可以優化 ROM 中數據空間的大小。
不同數據類型占用存儲空間的大小不同。選擇與變量數值范圍相應的數據類型將會提高數據空間的利用效率。例如,灰度圖像每個像素的取值范圍是0~255,如果將圖像數組類型聲明為 int image[][],則每個像素占用4字節,其中3個高位字節中的數據為 0。matter智能家居espc2-c3公司深圳樂鑫芯片代理商如果將圖像數組類型聲明為 unsigned char image[][],則每個像素占用1字節,內存空間得到充分應用。
“空洞”是編譯器自動添加的沒有被使用的內存空間。“空洞”中可能會存在一些隨機數據或者為 0。優化數據結構可以減少或消除數據結構空間中的“空洞”。例如,在缺省情況下,編譯器為數據結構和結構體中的成員分配空間時做對齊處理。例如,short a 以雙字節對齊,inta以4字節對齊。結構體本身則以處理器支持的自然邊界對齊。RISC-V RV32I處理器的自然邊界寬度是4字節。優化結構體內成員的順序,可以減少結構體中的“空洞”,縮短結構體所占用的內存空間的長度。
如圖8.5所示,在圖(a)中聲明結構體 mydatal,圖(b)是編譯器為結構 mydatal分配的存儲空間格式,結構體總長度為 12 字節。其中,“x”處是編譯器添加的“空洞”,共有4字節“空洞”。
(a)結構體聲明
struct mydatal {
char a;
int b;
char c;
short d;
}
(b)存儲分配格式
地址 +0 +1 +2 +3
+0 a[7:0] x x x
+4 b[7:0] b[15:8] b[16:23] b[24:31]
+8 c[7:0] x d[15:8] d[7:0]
圖 8.5 結構體聲明(1)
將圖8.5(a)中的結構體調整成員順序得到如圖 8.6(a)所示的結構體 mydata2譯器為結構體 mydata2分配的存儲空間,格式如圖 8.6(b)所示,共 8 字節。matter智能家居espc2-c3公司深圳樂鑫芯片代理商調整成員順序后,消除了“空洞”,結構體減少了 4 字節長度。
(a)結構體聲明
struct mydata2{
char a;
char c;
short d;
int b;
}
(b)存儲分配格式
地址 +0 +1 +2 +3
+0 a[7:0] c[7:0] d[15:8] d[7:0]
+4 b[7:0] b[15:8] b[23:16] b[31:24]
圖8.6結構體聲明(2)
在結構體添加關鍵字“packaged”,將結構體聲明為緊致型結構。編譯器對結構體中的成員不做對齊處理,不添加“空洞”,順序排列。使用“packaged”能夠縮短結構體總長度,但數據不對其將會增加處理器運行過程中訪問數據時的開銷。
2.RAM空間優化
matter智能家居espc2-c3公司深圳樂鑫芯片代理商在嵌入式系統中,程序運行時處理器可以從 ROM 取指令,也可以從 RAM 取指令。如果運行時程序代碼在 ROM 中,則系統 RAM 只需提供序中的變量空間和程序運行時動態申請的空間。如果系統要求在 RAM 運行程序,則RAM還需提程序代碼空間。
將編譯器生成程序過程中分配的空間稱為靜態空間,而在程序運行過程中分配的空間稱為動態空間。靜態空間在整個程序活動期間內都有效,動態空間在程序運行時申請和釋放。
在程序中應盡量使用動態內存空間,提高內存使用效率。
在示8.11(a)中,圖像處理函數 void imageproc 分配了 3個圖像數組空間,在函數活動期間占用3*M*N字節。在示例 8.11(b)中,函數 void imageproc 內,在需要時用malloc 申請空間,然后用free 釋放,在函數活動期間大占用2*M*N字節??梢?使用動態申請內存更有利于優化內存空間。
示例8.11:內存空間分配。
(a)
void imageproc(......)
{
char a[m][N];
char b[M][N];
char c[M][N];
......
func1(a,b);
......
func2(b,c);
.....
}
--------------------------------------------------------
(b)
void imageproc(......)
{
char *a,*b,*c;
a=(char *)malloc(.--):
b=(char *)malloc(...);
......
func1(a, b);
free(a);
......
c=(char *)malloc(...);
func2(b,c);
......
free(b);
free(c);
}
優化數據類型和數據結構的方法同樣也可用于優化 RAM空間。