日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

这两种printf()函数重定向方法,太实用了

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 这两种printf()函数重定向方法,太实用了 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:echobright

原文鏈接:https://blog.csdn.net/qq_29344757/article/details/75363639

在前面學習了STM32的串口編程,通過USART1向計算機的串口調試助手打印數據,或者接收計算機串口調試助手的數據,接下來我們可以實現STM32工程上的printf()函數了,方便用于程序開發中調試信息的打印。

法1:使用MicroLIB庫

1.1 KEIL-MDK中的Use MicroLIB選項

在MDK開發環境中,

MicroLib是缺省c庫的備選庫,它可裝入少量內存中,與嵌入式應用程序配合使用,且這些應用程序不在操作系統中運行。MicroLib進行了高度優化以使代碼變得很小,功能比缺省c庫少,不具備某些ISO c特性,部分庫函數的運行速度也比較慢,如內存拷貝函數memcpy()。

MicroLib與缺省c庫之間的主要差異在網上有許多文章都有寫到,這里摘抄記錄:

(1) MicroLib 不符合 ISO C 庫標準。不支持某些 ISO 特性,并且其他特性具有的功能也較少。

(2) MicroLib 不符合 IEEE 754 二進制浮點算法標準。

(3) MicroLib 進行了高度優化以使代碼變得很小。

(4) 無法對區域設置進行配置。缺省 C 區域設置是唯一可用的區域設置。

(5) 不能將 main() 聲明為使用參數,并且不能返回內容。

(6) 不支持 stdio,但未緩沖的 stdin、stdout 和 stderr 除外。

(7) MicroLib對 C99 函數提供有限的支持。

(8) MicroLib不支持操作系統函數。

(9) MicroLib不支持與位置無關的代碼。

(10) MicroLib不提供互斥鎖來防止非線程安全的代碼。

(11) MicroLib不支持寬字符或多字節字符串。

(12) 與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()函數的原型為:

int fputc(int ch, FILE* stream)

此函數原本是將字符ch打印到文件指針stream所指向的文件流去的,現在我們不需要打印到文件流,而是打印到串口1。基于前面的代碼:

#include <stdio.h> int fputc(int ch, FILE* stream) {//USART_SendData(USART1, (unsigned char) ch);//while (!(USART1->SR & USART_FLAG_TXE));USART_SendChar(USART1, (uint8_t)ch);return ch; }

注意,需要包含頭文件stdio.h,否則FILE類型未定義。勾選了Use MicroLib選項,重定向fputc()函數后,我們就可以在工程代碼中使用printf()函數了:

int main(void) {USART_Configuration();printf("\r\nstm32f103rct6\r\n");printf("\r\nCortex-M3\r\n");while (1); return 0; }

printf()函數的使用方法跟之前一樣,運行結果:

法2:不使用MicroLIB庫

2.1 半主機模式

半主機模式是ARM的一種機制,實現將來ARM應用程序代碼的輸入/輸出請求傳送至運行著調試器的主機。例如設置使用半主機模式下的ARM應用程序,可以使用printf()和scanf()來使用主機的顯示器和鍵盤,而不需要在ARM系統上搭配顯示器和鍵盤。

半主機通過一組定義好的軟件指令(如SVC)來實現的,這些指令在程序控制下產生異常,ARM應用程序調用半主機對應的異常處理函數,然后調試代理處理該異常。

第二段話感覺理解起來有點模糊,但是第一段還是懂它在講什么的。一般的ARM應用程序中并不需要半主機操作,在這里為確保ARM應用程序中沒有鏈接MicroLib的半主機相關函數,我們要取消ARM的半主機工作模式。

2.2 實現代碼

在工程中加上如下代碼:

#pragma import(__use_no_semihosting) struct __FILE { int handle; }; FILE __stdout; _sys_exit(int x) { x = x; } int fputc(int ch, FILE *f){ while((USART1->SR&0X40)==0);USART1->DR = (u8) ch; return ch; }

上面的代碼摘自正點原子的范例程序,具體每一行的意義目前也不大清楚。這樣操作后,在不使用MicroLib的前提下,仍能使用printf()函數將調試信息打印到USART1上了。

推薦閱讀:

專輯|Linux文章匯總

專輯|程序人生

專輯|C語言

我的知識小密圈

關注公眾號,后臺回復「1024」獲取學習資料網盤鏈接。

歡迎轉發,在看,評論~

總結

以上是生活随笔為你收集整理的这两种printf()函数重定向方法,太实用了的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 不许穿内裤随时挨c调教h苏绵 | 国产精品福利在线播放 | 中文字幕在线免费观看视频 | 人人草在线观看 | 黄色在线观看视频 | 特级大胆西西4444人体 | 国产爽爽视频 | 午夜久久久久久久久久久 | 午夜精品在线免费观看 | 99免费在线视频 | 一本大道久久久久精品嫩草 | а√天堂资源在线 | 久草蜜桃| 欧美激情亚洲激情 | 国产综合视频一区二区 | 日少妇b| 无套内谢少妇露脸 | 99re国产在线 | 男生舔女生胸 | 国产欧美一区二区三区免费看 | 国产激情自拍视频 | 日本激情视频网站 | 911精品 | 9999av| 亚洲草逼视频 | 51自拍视频 | 成人做爰www免费看视频网站 | 激情小说激情视频 | 国产一级二级三级在线观看 | 亚洲午夜久久久 | 国产综合在线视频 | 992av| 日韩亚洲视频在线观看 | 伊人av在线播放 | 亚洲AV成人无码电影在线观看 | 美女的胸给男人玩视频 | 露出调教羞耻91九色 | avtt亚洲天堂 | 国产精品久久久久一区二区 | 综合久久亚洲 | 色图视频| 欧美一区视频在线 | 国产一久久| 激情福利社 | 天堂网av在线 | a级在线观看视频 | 久久人| 日韩久久精品电影 | 国产精品久久久久久久久久久久久久久久久久 | 成人av片免费看 | 麻豆影视国产在线观看 | 日韩精品在线第一页 | 欧美三级电影在线观看 | 草在线视频 | 亚洲女同av | 免费看一级黄色大全 | 懂色av一区二区三区蜜臀 | 日韩精品一区二区三区丰满 | 天天插天天射天天干 | 天天操天天添 | 午夜影院91 | 天天想你免费观看完整版高清电影 | 中文字幕手机在线视频 | 欧美成人播放 | 免费一级淫片 | 看全色黄大色黄女片18 | 老司机免费精品视频 | 精品久久久久一区二区国产 | 免费观看高清在线 | 国产草逼视频 | 自拍三级视频 | 91久久影院 | 天天操天天干天天摸 | 永久免费未满视频 | 亚洲精品一区二区口爆 | 久久露脸国语精品国产 | 亚洲自拍偷拍网站 | 久久综合桃花网 | 中文人妻熟妇乱又伦精品 | а中文在线天堂 | 欧美三级手机在线观看 | 欧美成人a∨高清免费观看 国产精品999视频 | 尤物毛片| av高潮| 最好看的2019中文大全在线观看 | 亚洲欧美日韩精品一区 | 麻豆国产在线播放 | 在线免费日韩 | 青青草精品在线 | 香蕉视频国产在线观看 | 在线观看免费视频一区二区 | 性av在线 | 制服丝袜手机在线 | 日本三级黄在线观看 | a级片免费看 | 日韩一区二区影院 | 国产精品色呦呦 | 免费观看a视频 | 国产交换配乱淫视频免费 |