在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

STM32的printf函數重定向方法

STM32嵌入式開發 ? 來源:CSDN ? 2023-07-10 16:22 ? 次閱讀

法1:使用MicroLIB庫

1.1 KEIL-MDK中的Use MicroLIB選項

在MDK開發環境中,b79be2f4-1ef8-11ee-962d-dac502259ad0.png

MicroLib是缺省c庫的備選庫,它可裝入少量內存中,與嵌入式應用程序配合使用,且這些應用程序不在操作系統中運行。

MicroLib進行了高度優化以使代碼變得很小,功能比缺省c庫少,不具備某些ISO c特性,部分庫函數的運行速度也比較慢,如內存拷貝函數memcpy()。MicroLib與缺省c庫之間的主要差異在網上有許多文章都有寫到,這里摘抄記錄:
  • MicroLib 不符合 ISO C 庫標準。不支持某些 ISO 特性,并且其他特性具有的功能也較少。
  • MicroLib 不符合 IEEE 754 二進制浮點算法標準。
  • MicroLib 進行了高度優化以使代碼變得很小。
  • 無法對區域設置進行配置。缺省 C 區域設置是唯一可用的區域設置。
  • 不能將 main() 聲明為使用參數,并且不能返回內容。
  • 不支持 stdio,但未緩沖的 stdin、stdout 和 stderr 除外。
  • MicroLib對 C99 函數提供有限的支持。
  • MicroLib不支持操作系統函數。
  • MicroLib不支持與位置無關的代碼。
  • MicroLib不提供互斥鎖來防止非線程安全的代碼。
  • MicroLib不支持寬字符或多字節字符串。
  • 與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()函數的原型為:b7d131f2-1ef8-11ee-962d-dac502259ad0.png此函數原本是將字符ch打印到文件指針stream所指向的文件流去的,現在我們不需要打印到文件流,而是打印到串口1。基于前面的代碼:b7e98db0-1ef8-11ee-962d-dac502259ad0.png注意,需要包含頭文件stdio.h,否則FILE類型未定義。勾選了Use MicroLib選項,重定向fputc()函數后,我們就可以在工程代碼中使用printf()函數了:b8107fec-1ef8-11ee-962d-dac502259ad0.pngprintf()函數的使用方法跟之前一樣,運行結果:b829fdd2-1ef8-11ee-962d-dac502259ad0.png

法2:不使用MicroLIB庫

2.1 半主機模式

半主機模式是ARM的一種機制,實現將來ARM應用程序代碼的輸入/輸出請求傳送至運行著調試器的主機。例如設置使用半主機模式下的ARM應用程序,可以使用printf()和scanf()來使用主機的顯示器和鍵盤,而不需要在ARM系統上搭配顯示器和鍵盤。半主機通過一組定義好的軟件指令(如SVC)來實現的,這些指令在程序控制下產生異常,ARM應用程序調用半主機對應的異常處理函數,然后調試代理處理該異常。一般的ARM應用程序中并不需要半主機操作,在這里為確保ARM應用程序中沒有鏈接MicroLib的半主機相關函數,我們要取消ARM的半主機工作模式。

2.2 實現代碼

在工程中加上如下代碼:b8696634-1ef8-11ee-962d-dac502259ad0.png這樣操作后,在不使用MicroLib的前提下,仍能使用printf()函數將調試信息打印到USART1上了。

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

    關注

    37

    文章

    7033

    瀏覽量

    124796
  • STM32
    +關注

    關注

    2287

    文章

    10988

    瀏覽量

    361622
  • 函數
    +關注

    關注

    3

    文章

    4365

    瀏覽量

    63943

原文標題:STM32的printf函數重定向方法

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

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

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

    stdio.h實現了printf函數?

    我們平時包含的 stdio.h 頭文件,里面是不是實現了 printf 函數? 為什么會有這個疑問?因為每次使用 printf,就得包含 stdio.h ,這就導致很多同學誤以為,stdio.h
    的頭像 發表于 12-18 10:28 ?489次閱讀

    嵌入式 學習-飛凌嵌入式ElfBoard ELF 1板卡-shell腳本編寫之輸入輸出重定向

    終端)更改為從指定文件中獲取。輸出重定向使用方法:1.命令 > 文件名(將命令執行的結果輸出到文件中,輸出的結果會覆蓋掉文件原來的內容)。2.命令 &gt
    發表于 09-24 10:06

    飛凌嵌入式ElfBoard ELF 1板卡-shell腳本編寫之輸入輸出重定向

    重定向使用方法:1.命令 > 文件名(將命令執行的結果輸出到文件中,輸出的結果會覆蓋掉文件原來的內容)。2.命令 >> 文件名(將命令
    發表于 09-23 10:23

    重定向了fputc及putchar函數,但printf沒有輸出,為什么?

    重定向了fputc及putchar函數,但printf沒有輸出 刪除了drivers/drv_uart.c drv_uart.h 刪除了文件rt-thread\\components
    發表于 07-18 07:44

    在ESP8266_RTOS_SDK中應該怎么把ESP_LOGI重定向到UART1?

    如題,請問在ESP8266_RTOS_SDK中應該怎么把ESP_LOGI重定向到UART1? 在Esp_log.h文件中找到 /** * @brief Set function used
    發表于 07-15 06:21

    esp32c3能不能將串口打印函數重定向到自己軟件模擬的uart上?

    模擬uart,用于打印日志;請問這種做法可以實現嗎?可以將打印函數重定向到該模擬uart嗎?如果可以,麻煩指導一下重定向需要修改哪幾個函數? ps:打印的
    發表于 06-20 06:32

    請問ESP32C3如何重定向控制臺串口?

    軟件環境:esp-idf v4.4 硬件環境:esp32c3 問題描述:需要將控制臺輸出重定向到 UART1(RX: GPIO4,TX:GPIO5),UART0 用來做上下位機通信。 按照這個鏈接
    發表于 06-07 08:12

    請問如何將printf使用的stdout重定向到asclin?

    /v4.9.3.0-infineon-1.0/docs/userguide.pdf 第 406 頁中關于 printf 的唯一說明是 stdout 重定向到模擬 io 調試器。 當然,您可以使用 Ifx_Console_print,但我想知道是否可以通過標準庫來實現。
    發表于 06-03 06:48

    STM32CubeIde生成的工程,使用printf函數沒有調用_write和__io_putchar函數,為什么?

    。而且printf函數的返回值與字符串的長度相等。 以前用STM32CubeIde生成的工程也使用了同樣的單板調試,也使用串口輸出,沒有任何問題。這次不知道為啥會這樣。printf
    發表于 05-24 06:13

    關于使用DAVE 4開發XMC4200時UART打印的問題求解

    設置了 UART。 不過,在使用多條 printf(\"\" ) 語句時,我注意到并非所有輸出都被完全打印出來,這似乎會影響 UART 的正常傳輸。 據我觀察,許多用戶都在使用重定向
    發表于 05-21 06:35

    芯海通用 MCU 應用筆記:在 MDK 開發環境下代碼重定向到 RAM 執行的幾種方法

    空間并寫入新的代碼。此外還具備執行效率高,壽命長優點。 本文檔介紹和說明在 MDK 開發環境下將代碼重定向到 RAM 中執行的方法。本文檔使用開發環境位 keil UVision,版本號
    發表于 05-16 11:58

    芯海通用 MCU應用筆記 :在 IAR 及 MDK 開發環境下使用 printf 函數重定向移植差異指南

    printf 函數支持的差異。并在本應用筆記結尾處給出可以一鍵移植到 Keil、IAR8.x、IAR9.x 版本下的通用重定向代碼。 Keil 和 IAR 都是常用的開發工具 IDE,在實際項目開發
    發表于 05-16 11:56

    STM32F103RCT6串口重定向數據發送和接收,如何才能不接收MCU發出去的數據?

    不知道各位有沒有出現過這樣的情況,我使用STM32F103RCT6芯片編寫串口程序,重定向printf函數到串口1,數據可以正常地發送和接收,但是有個問題 我仿真的時候發現,我每次用
    發表于 05-16 08:25
    主站蜘蛛池模板: 天天干夜夜艹 | 四虎国产欧美成人影院 | 奇米影视亚洲狠狠色777不卡 | 9966国产精品视频 | 亚洲综合色丁香婷婷六月图片 | 一本到中文字幕高清不卡在线 | 日本色频| 五月天婷婷丁香 | 人人澡人人澡碰人人看软件 | 欧美中字 | 日本人六九视频69jzz免费 | 色女人网 | 在线精品91青草国产在线观看 | 国产h视频在线 | 2018天堂视频免费观看 | 婷婷四房综合激情五月性色 | 天天鲁天天爽天天视频 | 日本69sex护士hd | 伊人天天干 | 日本理论在线观看被窝网 | 免费拍拍视频 | 免费在线观看一级片 | 特级生活片 | 亚洲综合狠狠 | 久久成人网18网站 | 九九精品影院 | 在线亚洲综合 | 欧美大香a蕉免费 | brazzers在线| 免费看男女下面日出水视频 | 天天色影院 | 一级网站在线观看 | 理论片午夜| 天堂日本| brazzers在线| 男人j进女人j视频 | 天天噜噜色| 天天摸天天碰成人免费视频 | 性欧美高清极品猛交 | 校园 春色 欧美 另类 小说 | 午夜两性网|