法1:使用MicroLIB庫
1.1 KEIL-MDK中的Use MicroLIB選項
在MDK開發(fā)環(huán)境中,![b79be2f4-1ef8-11ee-962d-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9D/9C/wKgZomToCHeAa5AcAACdMIXhSH4188.png)
MicroLib是缺省c庫的備選庫,它可裝入少量內(nèi)存中,與嵌入式應(yīng)用程序配合使用,且這些應(yīng)用程序不在操作系統(tǒng)中運行。
MicroLib進行了高度優(yōu)化以使代碼變得很小,功能比缺省c庫少,不具備某些ISO c特性,部分庫函數(shù)的運行速度也比較慢,如內(nèi)存拷貝函數(shù)memcpy()。MicroLib與缺省c庫之間的主要差異在網(wǎng)上有許多文章都有寫到,這里摘抄記錄:- MicroLib 不符合 ISO C 庫標(biāo)準(zhǔn)。不支持某些 ISO 特性,并且其他特性具有的功能也較少。
- MicroLib 不符合 IEEE 754 二進制浮點算法標(biāo)準(zhǔn)。
- MicroLib 進行了高度優(yōu)化以使代碼變得很小。
- 無法對區(qū)域設(shè)置進行配置。缺省 C 區(qū)域設(shè)置是唯一可用的區(qū)域設(shè)置。
- 不能將 main() 聲明為使用參數(shù),并且不能返回內(nèi)容。
- 不支持 stdio,但未緩沖的 stdin、stdout 和 stderr 除外。
- MicroLib對 C99 函數(shù)提供有限的支持。
- MicroLib不支持操作系統(tǒng)函數(shù)。
- MicroLib不支持與位置無關(guān)的代碼。
- MicroLib不提供互斥鎖來防止非線程安全的代碼。
- MicroLib不支持寬字符或多字節(jié)字符串。
- 與stdlib不同,MicroLib不支持可選擇的單或雙區(qū)內(nèi)存模型。MicroLib只提供雙區(qū)內(nèi)存模型,即單獨的堆棧和堆區(qū)。
1.2 重定向fputc函數(shù)
在MicroLib的stdio.h中,fputc()函數(shù)的原型為:![b7d131f2-1ef8-11ee-962d-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9D/9C/wKgZomToCHeAb6CqAAADsD1r8Vs817.png)
![b7e98db0-1ef8-11ee-962d-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9D/9C/wKgZomToCHeANH7ZAAARqjQ0JAY931.png)
![b8107fec-1ef8-11ee-962d-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9D/9C/wKgZomToCHeAbj5eAAASQFioE7A890.png)
![b829fdd2-1ef8-11ee-962d-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9D/9C/wKgZomToCHeAYXCtAACvUB70xDA342.png)
法2:不使用MicroLIB庫
2.1 半主機模式
半主機模式是ARM的一種機制,實現(xiàn)將來ARM應(yīng)用程序代碼的輸入/輸出請求傳送至運行著調(diào)試器的主機。例如設(shè)置使用半主機模式下的ARM應(yīng)用程序,可以使用printf()和scanf()來使用主機的顯示器和鍵盤,而不需要在ARM系統(tǒng)上搭配顯示器和鍵盤。半主機通過一組定義好的軟件指令(如SVC)來實現(xiàn)的,這些指令在程序控制下產(chǎn)生異常,ARM應(yīng)用程序調(diào)用半主機對應(yīng)的異常處理函數(shù),然后調(diào)試代理處理該異常。一般的ARM應(yīng)用程序中并不需要半主機操作,在這里為確保ARM應(yīng)用程序中沒有鏈接MicroLib的半主機相關(guān)函數(shù),我們要取消ARM的半主機工作模式。2.2 實現(xiàn)代碼
在工程中加上如下代碼:![b8696634-1ef8-11ee-962d-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9D/9C/wKgZomToCHeAZXilAAAUjjQ18GU671.png)
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6901瀏覽量
123824 -
STM32
+關(guān)注
關(guān)注
2273文章
10926瀏覽量
357825 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4349瀏覽量
63027
原文標(biāo)題:STM32的printf函數(shù)重定向方法
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
全面掌握Linux重定向技巧:讓命令行操作效率翻倍的秘密
#1 linux輸出重定向 $ command > file 2>1 這里的 ,表示重定向的目標(biāo)不是一個 文件 ,而是一個 文件描述符 ,內(nèi)置的文件描述符如下 1 => stdout2
stdio.h實現(xiàn)了printf函數(shù)?
我們平時包含的 stdio.h 頭文件,里面是不是實現(xiàn)了 printf 函數(shù)? 為什么會有這個疑問?因為每次使用 printf,就得包含 stdio.h ,這就導(dǎo)致很多同學(xué)誤以為,stdio.h
嵌入式 學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-shell腳本編寫之輸入輸出重定向
終端)更改為從指定文件中獲取。輸出重定向使用方法:1.命令 > 文件名(將命令執(zhí)行的結(jié)果輸出到文件中,輸出的結(jié)果會覆蓋掉文件原來的內(nèi)容)。2.命令 >
發(fā)表于 09-24 10:06
飛凌嵌入式ElfBoard ELF 1板卡-shell腳本編寫之輸入輸出重定向
重定向使用方法:1.命令 > 文件名(將命令執(zhí)行的結(jié)果輸出到文件中,輸出的結(jié)果會覆蓋掉文件原來的內(nèi)容)。2.命令 >> 文件名(將命令
發(fā)表于 09-23 10:23
重定向了fputc及putchar函數(shù),但printf沒有輸出,為什么?
重定向了fputc及putchar函數(shù),但printf沒有輸出
刪除了drivers/drv_uart.c drv_uart.h
刪除了文件rt-thread\\components
發(fā)表于 07-18 07:44
esp32c3能不能將串口打印函數(shù)重定向到自己軟件模擬的uart上?
模擬uart,用于打印日志;請問這種做法可以實現(xiàn)嗎?可以將打印函數(shù)重定向到該模擬uart嗎?如果可以,麻煩指導(dǎo)一下重定向需要修改哪幾個函數(shù)?
ps:打印的
發(fā)表于 06-20 06:32
請問如何將printf使用的stdout重定向到asclin?
/v4.9.3.0-infineon-1.0/docs/userguide.pdf 第 406 頁中關(guān)于 printf 的唯一說明是 stdout 重定向到模擬 io 調(diào)試器。
當(dāng)然,您可以使用 Ifx_Console_print,但我想知道是否可以通過標(biāo)準(zhǔn)庫來實現(xiàn)。
發(fā)表于 06-03 06:48
芯海通用 MCU應(yīng)用筆記 :在 IAR 及 MDK 開發(fā)環(huán)境下使用 printf 函數(shù)重定向移植差異指南
對 printf 函數(shù)支持的差異。并在本應(yīng)用筆記結(jié)尾處給出可以一鍵移植到 Keil、IAR8.x、IAR9.x 版本下的通用重定向代碼。
Keil 和 IAR 都是常用的開發(fā)工具 IDE,在實際項目開發(fā)
發(fā)表于 05-16 11:56
STM32F103RCT6串口重定向數(shù)據(jù)發(fā)送和接收,如何才能不接收MCU發(fā)出去的數(shù)據(jù)?
不知道各位有沒有出現(xiàn)過這樣的情況,我使用STM32F103RCT6芯片編寫串口程序,重定向printf函數(shù)到串口1,數(shù)據(jù)可以正常地發(fā)送和接收,但是有個問題
我仿真的時候發(fā)現(xiàn),我每次用
發(fā)表于 05-16 08:25
求助,關(guān)于HAL下的printf重定向輸出疑問求解
(1)網(wǎng)上查了使用printf重定向,串口輸出,函數(shù)如下,使用HAL_UART_Transmit函數(shù)。
int fputc(int ch,FILE *f)
{
uint8_t tem
發(fā)表于 05-10 06:04
STM8S如何在STVD環(huán)境下重定向printf函數(shù)實現(xiàn)UART簡化輸出?
printf(),網(wǎng)上IAR環(huán)境的重定向調(diào)通了,求STVD環(huán)境下的code。
3. 用STM8的官方例程UART1_Printf在STVD環(huán)境下編譯OK,但是debug時候報錯下載不了程序
4. 針對3
發(fā)表于 04-30 08:29
STM8L051片子使用重定向printf函數(shù)時總是報錯,沒辦法引用printf函數(shù)是什么原因?
STM8L051片子使用重定向printf函數(shù)時總是報錯,沒辦法引用printf函數(shù),不知道是什么原因,使用的是IAR編譯器,總是報內(nèi)存不足
發(fā)表于 04-28 08:05
用keil仿真無法用printf打印怎么解決?
用keil仿真 無法用printf打印.想用printf重定向到Usart1的方法,使printf打印信息能夠在UART#1的窗口打印出來.
發(fā)表于 04-11 08:20
STM32CubeIDE中打印重定向報錯怎么解決?
HAL_UART_Transmit( huart1 , (uint8_t *) ch, 1, 0xFFFF);報錯
printf重定向 報錯../Core/Src/main.c:42:21: error: \'huart1\' undeclared
已添加stdio.h頭
發(fā)表于 04-03 07:33
H7平臺如何重定向sqrtf函數(shù)到RAM中運行?
如題,H7平臺如何重定向sqrtf函數(shù)到RAM中運行,這個函數(shù)是庫函數(shù),不能使用__ramfunc前綴,有什么方法或是例程,網(wǎng)上找了很多ic
發(fā)表于 03-27 06:40
評論