那就是 標準函式庫 newlib ,因為這裡介紹的是 GCC 方案 所以得說明一下
在上個範例中,我使用的是 內存只有 32K 的 M0 。所以在最後編譯的時候
同學可能會遇到這樣的問題
region `FLASH' overflowed by 3572 bytes
有點糗了。
我也很好奇,當時並沒有發現這個問題。實際上也成功可以 printf 列印到 電腦端 Console。
在網路搜尋 newlib 會有多關於它的背景說明,這裡就跳過。不過我分享這個連結
https://community.arm.com/iot/embedded/b/embedded-blog/posts/shrink-your-mcu-code-size-with-gcc-arm-embedded-4-7
大意是 使用 printf 函式會需要 37K bytes 的 FLASH 及 5K bytes 的 RAM,對於 MCU 來說 真是沉重的負擔。
但使用 newlib 可以削減很多非必要性的功能。使程式碼更有效率....等。
OK,如何做?
因為我們已經安裝整套的 GCC ARM Embedded ,在之前已經安裝好了。
在 Eclipse 的 Project / Properties 對話框 裡
找到 C/C++ Build / Settings / GUN ARM Cross C Linker / Miscellaneous 選項
同學會找到 use newlib-nano 的 Checkbox ,使它 enable 打勾。
在下一個 use float with nano printf 也可以一併打勾,如果需要列印浮點數 最好是使用它。
將範例修改成
double _x1 = 3.1415926;
float _x2 = 3.1415926;
printf("Hello!\r\n");
printf("Double value:%f,sizeof:%lu\r\n",_x1,sizeof(double));
printf("Float value:%f,sizeof:%lu\r\n",_x2,sizeof(float));
列出結果是
Hello! Double value:3.141593,sizeof:8 Float value:3.141593,sizeof:4
如果將 use float with nano printf 給取消,會減少不少的 code size
但是無法列印浮點數,所以這部分要斟酌一下
Hello! Double value:,sizeof:8 Float value:,sizeof:4
0 comments:
發佈留言