STM32的printf函式重定向

2021-12-30 05:18:26 字數 2284 閱讀 1994

stm32的printf函式重定向

在前面學習了stm32的串列埠程式設計,通過usart1向計算機的串列埠除錯助手列印資料,或者接收計算機串列埠除錯助手的資料,接下來我們可以實現stm32工程上的printf()函式了,方便用於程式開發中除錯資訊的列印。

1.1 keil-mdk中的use microlib選項

在mdk開發環境中,

microlib是預設c庫的備選庫,它可裝入少量記憶體中,與嵌入式應用程式配合使用,且這些應用程式不在作業系統中執行。

microlib進行了高度優化以使**變得很小,功能比預設c庫少,不具備某些iso c特性,部分庫函式的執行速度也比較慢,如記憶體拷貝函式memcpy()。

microlib與預設c庫之間的主要差異在網上有許多文章都有寫到,這裡摘抄記錄:

(1)microlib 不符合 iso c 庫標準。 不支援某些 iso 特性,並且其他特性具有的功能也較少。

(2)microlib 不符合 ieee 754 二進位制浮點演算法標準。

(3)microlib 進行了高度優化以使**變得很小。

(4)無法對區域設定進行配置。 預設 c 區域設定是唯一可用的區域設定。

(5)不能將 main() 宣告為使用引數,並且不能返回內容。

(6)不支援 stdio,但未緩衝的 stdin、stdout 和 stderr 除外。

(7)microlib對 c99 函式提供有限的支援。

(8)microlib不支援作業系統函式。

(9)microlib不支援與位置無關的**。

(10)microlib不提供互斥鎖來防止非執行緒安全的**。

(11)microlib不支援寬字元或多位元組字串。

(12)與stdlib不同,microlib不支援可選擇的單或雙區記憶體模型。microlib只提供雙區記憶體模型,即單獨的堆疊和堆區。

microlib提供了乙個有限的stdio子系統,它僅支援未緩衝的stdin、stdout和stderr,那麼也就是說勾選了use microlib選項後,在**工程中就可以使用printf()函式咯?

然而事實並非如此,這樣直接使用printf()函式,其列印的字串最終不知道列印到何處。我們要做的是將除錯資訊列印到usart1中,所以需要對printf()函式所依賴的列印輸出函式fputc()重定向(microlib中的printf()函式列印操作依賴fputc())。

1.2 重定向fputc函式

在microlib的stdio.h中,fputc()函式的原型為:

int fputc(int ch, file* stream)

此函式原本是將字元ch列印到檔案指標stream所指向的檔案流去的,現在我們不需要列印到檔案流,而是列印到串列埠1。基於前面的**:

#include

int fputc(int ch, file* stream)

注意,需要包含標頭檔案stdio.h,否則file型別未定義。

勾選了use microlib選項,重定向fputc()函式後,我們就可以在工程**中使用printf()函式了:

int main(void)

printf()函式的使用方法跟之前一樣,執行結果:

2.1 半主機模式

半主機模式是arm的一種機制,實現將來arm應用程式**的輸入/輸出請求傳送至執行著偵錯程式的主機。例如設定使用半主機模式下的arm應用程式,可以使用printf()和scanf()來使用主機的顯示器和鍵盤,而不需要在arm系統上搭配顯示器和鍵盤。

半主機通過一組定義好的軟體指令(如svc)來實現的,這些指令在程式控制下產生異常,arm應用程式呼叫半主機對應的異常處理函式,然後除錯**處理該異常。

第二段話感覺理解起來有點模糊,但是第一段還是懂它在講什麼的。一般的arm應用程式中並不需要半主機操作,在這裡為確保arm應用程式中沒有鏈結microlib的半主機相關函式,我們要取消arm的半主機工作模式。

2.2 實現**

在工程中加上如下**:

//取消arm的半主機工作模式

#pragma import(__use_no_semihosting)

struct __file ;

file __stdout;

_sys_exit(int x)

int fputc(int ch, file *f)

STM32學習記錄 printf函式重定位

功能 重定位printf函式,使printf作為串列埠列印輸出函式。代替usart send string 函式 步驟 usart.c中包含usart初始化函式 1 usart初始化 使能時鐘 使能gpio gpio和usart初始化 2 開啟usart 3 在usart.c中加入如下 ifdef ...

STM32的printf函式重定向

在前面學習了stm32的串列埠程式設計,通過usart1向計算機的串列埠除錯助手列印資料,或者接收計算機串列埠除錯助手的資料,接下來我們可以實現stm32工程上的printf 函式了,方便用於程式開發中除錯資訊的列印。1.法1 使用microlib庫 1.1 keil mdk中的use microl...

STM32中如何使用printf 函式

stm32串列埠通訊中使用printf傳送資料配置方法 開發環境 keil rvmdk 在stm32串列埠通訊程式中使用printf傳送資料,非常的方便。可在剛開始使用的時候總是遇到問題,常見的是硬體訪真時無法進入main主函式,其實只要簡單的配置一下就可以了。下面就說一下使用printf需要做哪些...