国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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函數可以輸出常字符串,但是無法進行變量的格式化輸出。

根據網絡上的方案,補充fputsputs函數,稍作修改:

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

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

More…

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

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

審核編輯 黃宇

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

    關注

    22

    文章

    1305

    瀏覽量

    106187
  • DriverLib
    +關注

    關注

    0

    文章

    3

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

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

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

    UART在5.2.0版本E2S中的重定向

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

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

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

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

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

    【RA-Eco-RA6M4開發板評測】移植xprintf實現標準輸入輸出

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

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

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

    MEMS定向短節在HDD中如何精準定向

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

    為什么MEMS定向短節能引領鉆探未來

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

    101040010\\101040010K定向耦合器KRYTAR

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

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

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

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

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

    101040006/101040006K定向耦合器KRYTAR

    101040006/101040006K定向耦合器KRYTAR KRYTAR推出的101040006/101040006K定向耦合器,進一步豐富了多用途帶狀線設計的選項。101040006
    發表于 03-07 09:45

    DeepSeek獲殊榮,成為ai.com重定向官網

    近日,記者發現,在瀏覽器中輸入“ai.com”這一頂級域名時,頁面將直接重定向至DeepSeek的官方網站。這一變化引起了業界的廣泛關注,標志著DeepSeek在人工智能領域的地位得到了高度認可
    的頭像 發表于 02-11 15:41 ?880次閱讀

    全面掌握Linux重定向技巧:讓命令行操作效率翻倍的秘密

    #1 linux輸出重定向 $ command > file 2>1 這里的 ,表示重定向的目標不是一個 文件 ,而是一個 文件描述符 ,內置的文件描述符如下 1 => stdout2
    的頭像 發表于 01-08 10:19 ?780次閱讀