2018年8月18日星期六

[STM32] printf 後記

在上一個分享貼文,其實漏交代一個部分。
那就是 標準函式庫 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:

發佈留言