MCU:MSPM0G3507
前段時間在課內做實驗的時候碰到了比較豐富的交互需求,遂打開UART,#include "stdio.h",然后開始重定向。雖然網上有廣為流傳的重定向方案,但是常年玩STM32的我有點迷惑:為什么TI Driverlib的重定向需要定義三個函數呢?
Trial
按照 STM32 重定向的方法,先對fputc進行重定向:
int fputc(int _c, FILE *_fp) {
while((UART0 - > STAT & UART_STAT_TXFF_MASK));
UART0 - > TXDATA = _c;
return _c;
}
觀察到,在這種重定向的方案下,printf函數可以輸出常字符串,但是無法進行變量的格式化輸出。
根據網絡上的方案,補充fputs和puts函數,稍作修改:
int fputs(const char *restrict s, FILE *restrict stream) {
uint16_t i, len;
len = strlen(s);
for (i = 0; i < len; i++) {
fputc(s[i], stream);
}
return len;
}
int puts(const char *s) {
int count = fputs(s, stdout);
count += fputs("n", stdout);
return count;
}
在這種重定向方法下,printf成功實現了完整的重定向,可以進行變量的格式化輸出——但是,sprintf依然無法工作,為什么呢?
觀察三個函數的輸入參數,其中兩個都包含了一個FILE*輸入變量,但是我們在使用的時候卻完全沒用到。找到FILE的定義:
struct __sFILE {
int fd; /* File descriptor */
unsigned char* buf; /* Pointer to start of buffer */
unsigned char* pos; /* Position in buffer */
unsigned char* bufend; /* Pointer to end of buffer */
unsigned char* buff_stop; /* Pointer to last read char in buffer */
unsigned int flags; /* File status flags (see below) */
};
typedef struct __sFILE FILE;
可見,在TI的庫中, FILE類型并沒有被簡單地改為簡單的存儲指針,而是依然保留了“數據流”的形式 。再結合debug中端點的觸發情況,以及函數之間的調用關系,嘗試對FILE*指針進行寫入。若調用了puts,認為上層的標準輸出走的是printf(),就向下傳遞空指針,將輸出導向 UART。如果stream不是自己設定的空指針,就去編輯stream指向的緩沖區。
Result
對重定向的三個函數進行如下修改:
int fputc(int _c, FILE *_fp) {
if(!(_fp)) {
while((UART0 - > STAT & UART_STAT_TXFF_MASK));
UART0 - > TXDATA = _c;
}
else
*(_fp- >pos) = _c;
return _c;
}
int fputs(const char* restrict s, FILE* restrict stream) {
uint16_t i, len;
len = strlen(s);
for(unsigned int i=0; i < len; i++) {
fputc(s[i], stream);
if(stream) stream- >pos++;
}
return len;
}
int puts(const char *_ptr) {
int count = fputs(_ptr,NULL);
count += fputs("n",NULL);
return count;
}
重定向成功,sprintf和printf均可以正常工作!
More…
那個結構體我還沒用完,估計在重定向輸入流的時候會用到更多的元素。但是知道這些已經足夠了,可以搞點花招,比如把UARTx → TXDATA直接丟到stream里面去,當然FIFO只有一個入口,不需要地址偏移,這么看也是有點麻煩;或者直接把自己的指定buffer設為默認輸出區域,等等,雖然更復雜了,但是相對于僅僅把FILE作為一個獨立指針,還是更加靈活有趣的!
實力尚淺,還請多多指教!
審核編輯 黃宇
-
uart
+關注
關注
22文章
1305瀏覽量
106187 -
DriverLib
+關注
關注
0文章
3瀏覽量
2058
發布評論請先 登錄
【瑞薩RA6E2地奇星開發板試用】串口通信報錯:標準輸出流 stdout 未定義
跌落試驗的核心:解析自由跌落、定向跌落等主要測試模式的區別
UART在5.2.0版本E2S中的重定向
【RA4E2開發板評測】FSP5.2之后的串口重定向問題解決方法
LWH12060YAH國產電源模塊完美替代TI PTH12060YAH方案
【RA-Eco-RA6M4開發板評測】移植xprintf實現標準輸入輸出
20205新疆國際煤博會:礦用尋北儀提供高可靠定向解決方案
MEMS定向短節在HDD中如何精準定向?
為什么MEMS定向短節能引領鉆探未來

TI Driverlib 標準輸出完整重定向的改進方案
評論