在上一個分享貼文,其實漏交代一個部分。
那就是 標準函式庫 newlib ,因為這裡介紹的是 GCC 方案 所以得說明一下
在上個範例中,我使用的是 內存只有 32K 的 M0 。所以在最後編譯的時候
同學可能會遇到這樣的問題
有點糗了。
我也很好奇,當時並沒有發現這個問題。實際上也成功可以 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 也可以一併打勾,如果需要列印浮點數 最好是使用它。
將範例修改成
列出結果是
如果將 use float with nano printf 給取消,會減少不少的 code size
但是無法列印浮點數,所以這部分要斟酌一下
那就是 標準函式庫 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