1、(原創 ) 如何有效減少 Nios II EDS 所編譯程式碼大小? (IC Design) (Nios II)作者: 真 OO 无双 来源:博客园 发布时间:2008-01-20 15:05 阅读:1288 次 原文链接 收藏 Abstract由於體積和成本因素,嵌入式系統的記憶體都很小,所以系統開發人員都很在意編譯出的程式碼大小,本文討論減少 Nios II EDS 編譯程式碼大小的方法。使用環境:Nios II EDS 7.2 SP1Introduction以 DE2 而言,on-chip memory 最多只能 49KB,SRAM 只有 512KB,SDRAM 也只有 8MB,這和In
2、tel x86 平台動不動都有上 G 的記憶體不同,尤其有時為了簡化 debug 因素,只用 on-chip memory 時,最常遇到的就是 on-chip memory 塞不下所編譯的程式碼,以下討論幾種能有效減少Nios II 程式碼的方法。Solution1.使用 Release 模式預設為 Debug 模式,由於需要 debug symbol,檔案大小較大。選好 project,按右鍵, Active Build Configuration - 勾選 Relase。由於 Nios II EDS 除了軟體project 外,還會自帶一個 system library project,兩
3、個 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一些周邊提供了兩種模式的驅動程式,一
4、種強調的是速度,一種強調的是檔案大小,Nios II EDS 預設使用強調速度的驅動程式,勾選 Reduced Device Drivers 可有效減少程式碼大小。選好 project,按右鍵, System Library Properties ,將 Reduced device drivers 打勾。4.縮小 Max file descriptors 常數預設為 32,根據 Nios II Software Developers Handbook 說法,將此常數變小有助於減少編譯程式碼大小。選好 project,按右鍵, System Library Properties ,設定 Max
5、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,按右鍵
6、, 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()函數:1 int getchar(void) 2 char c;3 return
7、 ( read (0, 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
8、 取代,sys/alt_stdio.h 提供了 alt_printf()、alt_putchar()、alt_putstr()與 alt_getchar(),如此將可減少編譯程式碼大小。11.移除不需要的驅動程式若有硬體周邊存在,無論你軟體程式是否存取該硬體,Nios II EDS 預設會幫你加上該硬體的驅動程式,如此將會增加編譯程式碼大小,請手動移除不需要的硬體驅動程式。12.避免 Clean exitClean exit 會將所有 C 函數內部 I/O buffer 清除,並呼叫任何對 atexit()註冊的函數,Nios II EDS 預設使用 Clean exit。選好 project
9、,按右鍵, 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 Developerss Handbook 中提到的方法簡單的加以整理,更詳細請直接參考 Altera 手冊。