(原創) 如何有效減少Nios II EDS所編譯程式碼大小? (IC Design) (Nios II)
Abstract
由於體積和成本因素,嵌入式系統的記憶體都很小,所以系統開發人員都很在意編譯出的程式碼大小,本文討論減少Nios II EDS編譯程式碼大小的方法。
使用環境:Nios II EDS 7.2 SP1
Introduction
以DE2而言,on-chip memory最多只能49KB,SRAM只有512KB,SDRAM也只有8MB,這和Intel x86平台動不動都有上G的記憶體不同,尤其有時為了簡化debug因素,只用on-chip memory時,最常遇到的就是on-chip memory塞不下所編譯的程式碼,以下討論幾種能有效減少Nios II程式碼的方法。
Solution
1.使用Release模式
預設為Debug模式,由於需要debug symbol,檔案大小較大。
選好project,按右鍵,Active Build Configuration -> 勾選Relase。由於Nios II EDS除了軟體project外,還會自帶一個system library project,兩個project都要改成Release模式。
2.調整gcc參數
Nios II EDS預設的gcc並沒有啟動最佳化,可以調成-O3或者-Os。
選好project,按右鍵,Properties ,左側選C/C++ Build,在左側 Total Settings tab選General,在右側Optimization Levels選Optimize most(-O3)或Optimize size(-Os),效果可能要自己實際試試看,且將Debug Level選None。
3.使用Reduced device drivers
一些周邊提供了兩種模式的驅動程式,一種強調的是『速度』,一種強調的是『檔案大小』,Nios II EDS預設使用強調『速度』的驅動程式,勾選Reduced Device Drivers可有效減少程式碼大小。
選好project,按右鍵,System Library Properties ,將Reduced device drivers打勾。
4.縮小Max file descriptors常數
預設為32,根據Nios II Software Developer's Handbook說法,將此常數變小有助於減少編譯程式碼大小。
選好project,按右鍵,System Library Properties ,設定Max file descriptors常數。
5.將stdout、stderr、stdin設為null
若你的軟體程式完全沒用到stdout、stderr、stdin,可將此設為null,將可略為減少編譯程式碼大小。
選好project,按右鍵,System Library Properties ,將stdout、stderr、stdin設為null。
6.使用Small C library
若你使用到ANSI C函數,可選擇使用Small C library,這是gcc為嵌入式系統重新量身訂作的ANSI C standard library。
選好project,按右鍵,System Library Properties ,將Small C library打勾。
7.使用UNIX-Style File I/O
若你還想進一步減少編譯程式碼大小,就連Small C library都不要用,事實上,Nios II的HAL已經提供了UNIX-Style File I/O函數,直接使用將可有效減少編譯程式碼大小。
8.自己實作ANSI C函數
若你只需要一小部份的ANSI C函數,事實上可以自己實作,而不要使用整個ANSI C library。如getchar()函數:
2 char c;
3 return ( read (0, &c, 1) == 1) ? (unsigned char) c : EOF;
4}
9.使用Lightwieght device driver API
一些周邊如JTAG UART、UART、Optrex 16207 LCD支援Lightweight device driver API,可減少編譯程式碼大小。
選好project,按右鍵,System Library Properties ,將Lightweight device driver API打勾。
10.使用Minimal character-mode API
若你僅使用簡單的IO功能,可不需include ANSI的stdio.h,而用sys/alt_stdio.h取代,sys/alt_stdio.h提供了alt_printf()、alt_putchar()、alt_putstr()與alt_getchar(),如此將可減少編譯程式碼大小。
11.移除不需要的驅動程式
若有硬體周邊存在,無論你軟體程式是否存取該硬體,Nios II EDS預設會幫你加上該硬體的驅動程式,如此將會增加編譯程式碼大小,請手動移除不需要的硬體驅動程式。
12.避免Clean exit
Clean exit會將所有C函數內部I/O buffer清除,並呼叫任何對atexit()註冊的函數,Nios II EDS預設使用Clean exit。
選好project,按右鍵,System Library Properties ,不要選Clean exit(flush buffers)。
13.勾選Program never exits
嵌入式系統通常不會結束,所以可勾選Program never exits減少exit所造成的負擔。
選好project,按右鍵,System Library Properties ,勾選Program never exits。
14.不要使用C++
Nios II EDS預設支援C++,但C++所編譯的程式碼大小較大,建議使用純C語言撰寫。
選好project,按右鍵,System Library Properties ,不要勾選Support C++。
See Also
(原創) 如何使用ModelSim-Altera對Nios II仿真? (SOC) (Nios II) (SOPC Builder) (ModelSim) (DE2)
Conclusion
我只是將Nios II Software Developers's Handbook中提到的方法簡單的加以整理,更詳細請直接參考Altera手冊。
Reference
Nios II Software Developer's Handbook
紫藤2的NiosII如何降低代碼長度