(原創) 如何有效減少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模式。

nios_ii_size_00

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。

 nios_ii_size_01

3.使用Reduced device drivers

一些周邊提供了兩種模式的驅動程式,一種強調的是『速度』,一種強調的是『檔案大小』,Nios II EDS預設使用強調『速度』的驅動程式,勾選Reduced Device Drivers可有效減少程式碼大小。

選好project,按右鍵,System Library Properties ,將Reduced device drivers打勾。

nios_ii_size_02

4.縮小Max file descriptors常數

預設為32,根據Nios II Software Developer's Handbook說法,將此常數變小有助於減少編譯程式碼大小。

選好project,按右鍵,System Library Properties ,設定Max file descriptors常數。

nios_ii_size_03

5.將stdout、stderr、stdin設為null

若你的軟體程式完全沒用到stdout、stderr、stdin,可將此設為null,將可略為減少編譯程式碼大小。

選好project,按右鍵,System Library Properties ,將stdout、stderr、stdin設為null。

nios_ii_size_04

6.使用Small C library

若你使用到ANSI C函數,可選擇使用Small C library,這是gcc為嵌入式系統重新量身訂作的ANSI C standard library。

選好project,按右鍵,System Library Properties ,將Small C library打勾。

nios_ii_size_05

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()函數:

1int getchar(void{
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打勾。

nios_ii_size_06

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)。

 nios_ii_size_07

13.勾選Program never exits

嵌入式系統通常不會結束,所以可勾選Program never exits減少exit所造成的負擔。

選好project,按右鍵,System Library Properties ,勾選Program never exits。

nios_ii_size_08

14.不要使用C++

Nios II EDS預設支援C++,但C++所編譯的程式碼大小較大,建議使用純C語言撰寫。

選好project,按右鍵,System Library Properties ,不要勾選Support C++。

nios_ii_size_09

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
紫藤2NiosII如何降低代碼長度

posted on 2008-01-20 15:05  真 OO无双  阅读(3566)  评论(3编辑  收藏  举报

导航