法1:使用MicroLIB庫
1.1 KEIL-MDK中的Use MicroLIB選項
在MDK開發環境中,
MicroLib是缺省c庫的備選庫,它可裝入少量內存中,與嵌入式應用程序配合使用,且這些應用程序不在操作系統中運行。
MicroLib進行了高度優化以使代碼變得很小,功能比缺省c庫少,不具備某些ISO c特性,部分庫函數的運行速度也比較慢,如內存拷貝函數memcpy()。MicroLib與缺省c庫之間的主要差異在網上有許多文章都有寫到,這里摘抄記錄:- MicroLib 不符合 ISO C 庫標準。不支持某些 ISO 特性,并且其他特性具有的功能也較少。
- MicroLib 不符合 IEEE 754 二進制浮點算法標準。
- MicroLib 進行了高度優化以使代碼變得很小。
- 無法對區域設置進行配置。缺省 C 區域設置是唯一可用的區域設置。
- 不能將 main() 聲明為使用參數,并且不能返回內容。
- 不支持 stdio,但未緩沖的 stdin、stdout 和 stderr 除外。
- MicroLib對 C99 函數提供有限的支持。
- MicroLib不支持操作系統函數。
- MicroLib不支持與位置無關的代碼。
- MicroLib不提供互斥鎖來防止非線程安全的代碼。
- MicroLib不支持寬字符或多字節字符串。
- 與stdlib不同,MicroLib不支持可選擇的單或雙區內存模型。MicroLib只提供雙區內存模型,即單獨的堆棧和堆區。
1.2 重定向fputc函數
在MicroLib的stdio.h中,fputc()函數的原型為:



法2:不使用MicroLIB庫
2.1 半主機模式
半主機模式是ARM的一種機制,實現將來ARM應用程序代碼的輸入/輸出請求傳送至運行著調試器的主機。例如設置使用半主機模式下的ARM應用程序,可以使用printf()和scanf()來使用主機的顯示器和鍵盤,而不需要在ARM系統上搭配顯示器和鍵盤。半主機通過一組定義好的軟件指令(如SVC)來實現的,這些指令在程序控制下產生異常,ARM應用程序調用半主機對應的異常處理函數,然后調試代理處理該異常。一般的ARM應用程序中并不需要半主機操作,在這里為確保ARM應用程序中沒有鏈接MicroLib的半主機相關函數,我們要取消ARM的半主機工作模式。2.2 實現代碼
在工程中加上如下代碼:
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
操作系統
+關注
關注
37文章
7095瀏覽量
124969 -
STM32
+關注
關注
2290文章
11017瀏覽量
362464 -
函數
+關注
關注
3文章
4371瀏覽量
64225
原文標題:STM32的printf函數重定向方法
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
多晶硅錠定向凝固生長方法
鑄錠澆注法是較早出現的一種技術,該方法先將硅料置于熔煉坩堝中加熱熔化,隨后利用翻轉機械將其注入模具內結晶凝固,最初主要用于生產等軸多晶硅。近年來,為提升多晶硅電池轉換效率,通過控制模具中熔體凝固過程的溫度,創造定向散熱條件,從而獲得定向
STM32CubeIDE STM32H743XIH6串口無法重定向,且發送內容波特率不對亂碼怎么解決?
STM32CubeIDE重定向無效果,且使用HAL_UART_Transmit(&huart1, (uint8_t *)\"0123rn\", sizeof
發表于 03-11 06:42
DeepSeek獲殊榮,成為ai.com重定向官網
近日,記者發現,在瀏覽器中輸入“ai.com”這一頂級域名時,頁面將直接重定向至DeepSeek的官方網站。這一變化引起了業界的廣泛關注,標志著DeepSeek在人工智能領域的地位得到了高度認可
全面掌握Linux重定向技巧:讓命令行操作效率翻倍的秘密
#1 linux輸出重定向 $ command > file 2>1 這里的 ,表示重定向的目標不是一個 文件 ,而是一個 文件描述符 ,內置的文件描述符如下 1 => stdout2
stdio.h實現了printf函數?
我們平時包含的 stdio.h 頭文件,里面是不是實現了 printf 函數? 為什么會有這個疑問?因為每次使用 printf,就得包含 stdio.h ,這就導致很多同學誤以為,stdio.h
【RA-Eco-RA4E2-64PIN-V1.0開發板試用】02、UART串口通信
= 1;
break;
}
default:
break;
}
}
還是在debug_bsp_uart.c文件中,加入重定向 printf 輸出的函數
/* 重定向
發表于 12-14 11:44
51單片機中為什么很少出現printf的身影
流,他能跟外部交互的,只有串口。 51單片機用的開發語言是C語言,雖然跟標準C有點區別,但是 printf 函數還是可以用的,只要修改 printf 的輸

嵌入式 學習-飛凌嵌入式ElfBoard ELF 1板卡-shell腳本編寫之輸入輸出重定向
終端)更改為從指定文件中獲取。輸出重定向使用方法:1.命令 > 文件名(將命令執行的結果輸出到文件中,輸出的結果會覆蓋掉文件原來的內容)。2.命令 >
發表于 09-24 10:06
飛凌嵌入式ElfBoard ELF 1板卡-shell腳本編寫之輸入輸出重定向
重定向使用方法:1.命令 > 文件名(將命令執行的結果輸出到文件中,輸出的結果會覆蓋掉文件原來的內容)。2.命令 >> 文件名(將命令
發表于 09-23 10:23
STM32CUBEMX(8)--USART通過定時器中斷方式接收不定長數據
=0;//接受到數據標志
/* USER CODE END PV */
定義printf的重定向函數fputc。
/* USER CODE BEGIN 0 */
void printf
發表于 09-06 16:48
STM32CUBEMX(2)--USART通過DMA方式接收不定長數據
]; //接收緩沖區
uint8_t recv_end_flag = 0,Rx_len;//接收完成中斷標志,接收到字符長度
/* USER CODE END PV */
函數聲明和串口重定向
發表于 09-04 11:48
還不會嗎?三分鐘讓你速通Printf~
一、Printf簡介Printf是一個標準的c庫API,用來打印信息顯示的。Printf的底層輸出調用,在windows環境下是fputc函數,在GNUC環境下是__io_putcha

重定向了fputc及putchar函數,但printf沒有輸出,為什么?
重定向了fputc及putchar函數,但printf沒有輸出
刪除了drivers/drv_uart.c drv_uart.h
刪除了文件rt-thread\\components
發表于 07-18 07:44
在ESP8266_RTOS_SDK中應該怎么把ESP_LOGI重定向到UART1?
如題,請問在ESP8266_RTOS_SDK中應該怎么把ESP_LOGI重定向到UART1?
在Esp_log.h文件中找到
/**
* @brief Set function used
發表于 07-15 06:21
esp32c3能不能將串口打印函數重定向到自己軟件模擬的uart上?
模擬uart,用于打印日志;請問這種做法可以實現嗎?可以將打印函數重定向到該模擬uart嗎?如果可以,麻煩指導一下重定向需要修改哪幾個函數?
ps:打印的
發表于 06-20 06:32
評論