嵌入式如何使用printf列印

2021-10-10 06:22:28 字數 1678 閱讀 3250

我們在程式中使用printf把需要列印的資訊列印到控制台上,那麼在嵌入式中如何用printf來輸出列印資訊呢?

有兩種方法:

其一,把fput()函式重新定義:因為printf()會呼叫fputc()函式向控制台發資料,我們將fputc()重定義,在該函式裡邊用串列埠發資料,所以當我們呼叫printf()時,就可以通過串列埠把資料發出去。

其二,重新定義乙個類似printf的函式

首先,介紹把fput()重新定義的方法

struct __file

;file __stdout;

file __stdin;

int fputc(int ch, file * p_file)

因為printf()會呼叫fputc()函式向控制台發資料,我們將fputc()重定義,在該函式裡邊用串列埠發資料,所以當我們呼叫printf()時,就可以通過串列埠把資料發出去。

接下來介紹第二種方法:

#include

#include

#define max_length 200

static uint8_t debug_buffer[max_length] = ;

void test_printf(const char *fmt, ...)

然後,就可以呼叫test_printf()往外發資料了。

eg:int num = 100;

test_printf(「this is test num: %d」,num);

注:

1、在c中,當我們無法列出傳遞函式的所有實參的型別和數目時,可以用省略號指定參數列。

eg:void test_printf(const char *fmt, ...)

2、函式引數的傳遞原理

我們知道,函式的引數再記憶體中是存在棧中的,形參的存入順序是從右向左存入的,void func(int x, float y, long z),在呼叫函式時,形參入棧的順序是z > y >x,即z先入棧。

棧是從上往下增長的,即從記憶體位址高的位置開始增長,往記憶體位址低的方向上增長。因此,我們只要知道形參中任一變數的記憶體位址,就可以得到其它變數的記憶體位址。

3、介紹下test_printf()的實現

在中定義了如下:

typedef char * va_list;

void va_start ( va_list ap, prev_param );

void va_end ( va_list ap );

void test_printf(const char *fmt, ...)

//定義指標vlist

va_list vlist;

//讓vlist指向形參的第乙個變數

va_start(vlist, fmt);

//把fmt和不定長的引數(vlist指向引數列表)複製到debug_buffer中

vsnprintf(debug_buffer, max_length, fmt, vlist);

hal_uart_transmit_it(&uartdebughandle, (uint8_t*)debug_buffer, strlen(debug_buffer));

//在使用完指標之後,需要把指標關掉,以防出現危險。

va_end(vlist);

如何學習嵌入式 嵌入式如何入門?

學習嵌入式,該學習什麼基本的知識呢?嵌入式如何入門?其次,應該對作業系統有所了解,這對你對硬體和軟體的理解,絕對有很大的幫助。應該把系統的管理理解一下,比如程序 執行緒,系統如何來分配資源的,系統如何來管理硬體的,當然,不是看書就能把這些理解透,如果不是一時能理解,沒關係,多看看,結合以後的專案經驗...

基於嵌入式printf()的基本用法

完整格式 1.x m n 格式字元 2.有 表示左對齊,無表示右對齊 3.x表示空位需要填的字元 4.m表示最小域寬 5.n表示精度,一般用於實型小數點保留位數,按照四捨五入原則 格式字元 整型 d格式,表示整型 hd格式,表示短整型 ld格式,表示長整型 lld l64d格式,表示64位整型 u格...

如何學習嵌入式

對於嵌入式工作室的同學,最大的困難莫過於真正的找到自己的方向。嵌入式本身實在包含太多的東西。以下是我進工作室半年的一些總結 基於linux開發平台 希望對大家有所幫助。對於選擇嵌入式方向的同學,大部分原因應該是覺得嵌入式包含的東西比較廣闊。可以學到很多東西。然而太廣闊的內容不一定是一件好事。就單單基...