91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

Felix愷 ? 來源:jf_58031680 ? 作者:jf_58031680 ? 2025-11-11 00:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

MCU:MSPM0G3507

前段時間在課內做實驗的時候碰到了比較豐富的交互需求,遂打開UART,#include "stdio.h",然后開始重定向。雖然網上有廣為流傳的重定向方案,但是常年玩STM32的我有點迷惑:為什么TI Driverlib的重定向需要定義三個函數(shù)呢?

Trial

按照 STM32 重定向的方法,先對fputc進行重定向:

int fputc(int _c, FILE *_fp) {
    while((UART0 - > STAT & UART_STAT_TXFF_MASK));
    UART0 - > TXDATA = _c;
    return _c;
}

觀察到,在這種重定向的方案下,printf函數(shù)可以輸出常字符串,但是無法進行變量的格式化輸出。

根據(jù)網絡上的方案,補充fputsputs函數(shù),稍作修改:

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成功實現(xiàn)了完整的重定向,可以進行變量的格式化輸出——但是,sprintf依然無法工作,為什么呢?

觀察三個函數(shù)的輸入參數(shù),其中兩個都包含了一個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類型并沒有被簡單地改為簡單的存儲指針,而是依然保留了“數(shù)據(jù)流”的形式 。再結合debug中端點的觸發(fā)情況,以及函數(shù)之間的調用關系,嘗試對FILE*指針進行寫入。若調用了puts,認為上層的標準輸出走的是printf(),就向下傳遞空指針,將輸出導向 UART。如果stream不是自己設定的空指針,就去編輯stream指向的緩沖區(qū)。

Result

對重定向的三個函數(shù)進行如下修改:

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;
}

重定向成功,sprintfprintf均可以正常工作!

More…

那個結構體我還沒用完,估計在重定向輸入流的時候會用到更多的元素。但是知道這些已經足夠了,可以搞點花招,比如把UARTx → TXDATA直接丟到stream里面去,當然FIFO只有一個入口,不需要地址偏移,這么看也是有點麻煩;或者直接把自己的指定buffer設為默認輸出區(qū)域,等等,雖然更復雜了,但是相對于僅僅把FILE作為一個獨立指針,還是更加靈活有趣的!

實力尚淺,還請多多指教!

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • uart
    +關注

    關注

    22

    文章

    1314

    瀏覽量

    106682
  • DriverLib
    +關注

    關注

    0

    文章

    3

    瀏覽量

    2076
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    【乾芯QXS320F開發(fā)板試用】基于printf重定向的高速串口調試方案

    。 二、代碼分析 核心代碼的邏輯是通過重定向(Retarget) C語言標準庫的 printf 和 puts 函數(shù),使得原本輸出到控制臺的內容,改由芯片的物理串口(SCI)發(fā)出。這一點以前做過
    發(fā)表于 01-07 17:30

    Linux中13個基本Cat命令示例

    This is test1 file. This is test2 file. 9、使用標準輸出重定向操作符 我們可以將文件的標準輸出
    發(fā)表于 12-26 06:09

    【瑞薩RA6E2地奇星開發(fā)板試用】串口通信報錯:標準輸出流 stdout 未定義

    在跟著官方串口通信報錯: 問題可能是: 使用了 printf 或類似標準庫函數(shù) 但未實現(xiàn)重定向到串口所需的基礎設施 LLVM 工具鏈(Clang/LD)無法找到 stdout 的定義 已知在
    發(fā)表于 12-17 18:39

    跌落試驗的核心:解析自由跌落、定向跌落等主要測試模式的區(qū)別

    從模擬隨機意外的自由跌落到精準打擊的定向跌落,每一種測試模式都是通往更高產品可靠性道路上不可或缺的一環(huán)。北京沃華慧通測控技術有限公司提供的不僅是一臺冰冷的設備,更是一套完整的、可靠的測試解決方案
    的頭像 發(fā)表于 11-17 08:00 ?1260次閱讀
    跌落試驗的核心:解析自由跌落、<b class='flag-5'>定向</b>跌落等主要測試模式的區(qū)別

    廣凌標準化考場建設方案的核心模塊

    一套完整的校園標準化考場建設方案,不僅是技術的集成,更是教育公平與現(xiàn)代化治理的體現(xiàn)。通過智能化、綠色化的手段,標準化考場體系為考試安全筑起堅實防線,同時推動教育資源的均衡分配。
    的頭像 發(fā)表于 11-07 18:10 ?291次閱讀
    廣凌<b class='flag-5'>標準</b>化考場建設<b class='flag-5'>方案</b>的核心模塊

    UART在5.2.0版本E2S中的重定向

    隨著FSP庫版本更新到5.2.0,在開發(fā)過程中就會發(fā)現(xiàn)4.0.0版本的串口重定義并不適用于最新版本。繼續(xù)使用原來的重定向代碼時,編譯器就會報錯。根據(jù)報錯的信息發(fā)現(xiàn),缺少了幾個函數(shù)的定義,這里補全定義即可。
    的頭像 發(fā)表于 10-31 15:28 ?4021次閱讀
    UART在5.2.0版本E2S中的<b class='flag-5'>重定向</b>

    【RA4E2開發(fā)板評測】FSP5.2之后的串口重定向問題解決方法

    _read(int fd, char *pBuffer, int size); /* 重定向 printf 輸出 */ int _write(int fd, char *pBuffer, int
    發(fā)表于 08-29 07:02

    LWH12060YAH國產電源模塊完美替代TI PTH12060YAH方案

    在電子元器件國產化替代浪潮下,Leadway推出的LWH12060YAH電源模塊以其優(yōu)異的性能參數(shù)和完全兼容的封裝設計,成為TI PTH12060YAH的理想替代方案。關鍵參數(shù)對比指標
    發(fā)表于 08-28 09:23

    【RA-Eco-RA6M4開發(fā)板評測】移植xprintf實現(xiàn)標準輸入輸出

    代碼 一. 前言前面我們實現(xiàn)了串口收發(fā),為了方便調試 ,我們繼續(xù)移植xprintf實現(xiàn)標準輸入輸出。雖說也可以重定向編譯器使用的標準庫的_read,_write等接口,但是移植xpr
    發(fā)表于 07-19 22:37

    20205新疆國際煤博會:礦用尋北儀提供高可靠定向解決方案

    2025新疆國際煤炭工業(yè)博覽會的收官之日,我們的MEMS尋北儀與定向短節(jié)受到一致好評,專為復雜工業(yè)場景打造,尤其適用于煤炭井下定向掘進、鉆探軌跡控制等關鍵環(huán)節(jié),重新定義尋北技術標準
    的頭像 發(fā)表于 07-18 15:43 ?616次閱讀
    20205新疆國際煤博會:礦用尋北儀提供高可靠<b class='flag-5'>定向</b>解決<b class='flag-5'>方案</b>

    MEMS定向短節(jié)在HDD中如何精準定向

    MEMS定向短節(jié)以自尋北原理、最新MEMS陀螺技術和捷聯(lián)慣導技術為復雜環(huán)境定向鉆孔提供了可靠的解決方案,保證測量和輸出精度。 用于定向鉆孔/
    的頭像 發(fā)表于 07-08 14:46 ?530次閱讀

    為什么MEMS定向短節(jié)能引領鉆探未來

    在采礦設備、定向鉆孔、地質鉆探等領域,精準的定向測量技術是保障作業(yè)效率與安全的核心。ER-MNS-09 MEMS定向短節(jié)憑借最新MEMS陀螺技術,以緊湊、可靠、高性能的設計,成為復雜環(huán)境下定向
    的頭像 發(fā)表于 06-03 17:28 ?564次閱讀
    為什么MEMS<b class='flag-5'>定向</b>短節(jié)能引領鉆探未來

    101040010\\101040010K定向耦合器KRYTAR

    \\101040010K定向耦合器配有符合行業(yè)標準的2.4\\2.92mm母連接器。緊湊型包裝尺寸僅為2.0英寸(長)x 0.40英寸(寬)x 0.65英寸(高),重量僅為1.3盎司。工作溫度為-54°至+85
    發(fā)表于 04-16 09:19

    【瑞薩RA2L1入門學習】+Uasrt輸出

    ,這是因為MCU使用的串口是TTL串口,而PC使用USB串口。 3.新建工程配置屬性 重定向printf輸出到串口 需要添加一段代碼來將 printf 輸出重定向到串口UAR
    發(fā)表于 03-31 13:47

    STM32CubeIDE STM32H743XIH6串口無法重定向,且發(fā)送內容波特率不對亂碼怎么解決?

    STM32CubeIDE重定向無效果,且使用HAL_UART_Transmit(&huart1, (uint8_t *)\"0123rn\", sizeof
    發(fā)表于 03-11 06:42