|
发表于 2018-2-19 13:49:50
|
显示全部楼层
本帖最后由 shouzama 于 2018-2-19 14:28 编辑
依我接觸 ARDUINO 這些日子以來的想法,以 UNO 來說,
BOOTLOADER 佔約 2KB,ATmega328P 可用的程式空間
=32-2=30KB,變數空間 2048B
在這個限制下,除非就差那麼一些些 BYTES,硬擠擠不下,
擴充又變得相對複雜不划算,才會去考慮局部/全面精簡程式
第一個可以精簡的是 BOOTLOADER,直接將 ATmega328P
接上 USB2TTL 燒錄器燒錄,就可以拿回 2KB (實做上也可
最小化系統)
不夠? 精簡程式碼,重覆的程式區段就做成函式,以函式
呼叫的方式,犠牲一點執行時間換取程式碼的空間
還不夠? 試著放棄別人寫好的庫,自己寫程式取代,這點
並非做不到,只是要深入瞭解所要控制的元件的硬體及
信號型式/時脈,這部份我想是玩 ARDUINO 能免則免的部份吧
如果程式空間夠用、執行速度夠快,我不會想去研究精簡
程式的方法,如同 maxims 站友所言,那不是 ARDUINO 的
開發精神(訴求)所在,想要精簡,我會像以前那樣再用組合語言
寫 8051,不會轉學 C 玩 ARDUINO
也就是說,以樓主的範例程式而言,沒有精簡的必要,但如果
程式大到差一點點能擠進去的話,相對就很有用處了,利用關鍵字
我找到了一份參考文:
從 Arduino 到 AVR 晶片(1) -- AVR 晶片與 IO ports 範例 (作者:Cooper Maa)
剛剛試著編譯了一下他舉的 blink 程式,一般寫法:
草稿碼使用了 928 bytes (2%) 的程式儲存空間。上限為 32256 bytes。
全域變數使用了 9 bytes (0%) 的動態記憶體,剩餘 2039 bytes 給區域變數。上限為 2048 bytes 。
DDRx、PORTx 的寫法:
草稿碼使用了 644 bytes (1%) 的程式儲存空間。上限為 32256 bytes。
全域變數使用了 9 bytes (0%) 的動態記憶體,剩餘 2039 bytes 給區域變數。上限為 2048 bytes 。
組譯結果程式碼大小有明顯差別,值得一試,不過我認為還是
寫幾個巨集指令取代,程式的便攜性、判讀性可以大幅改善 |
|