STM32 串口 #pragma import(__use_no_semihosting)解析
標準庫函數的默認輸出設備是顯示器, 要實現在串口或 LCD 輸出,必須重定義標準庫函數里調用的與輸出 設備相關的函數 . 例如 :printf 輸出到串口,需要將 fputc 里面的輸出指向串口 (重定向 ),方法如下 : 只要自己添加一個 int fputc(int ch, FILE *f) 函數,能夠輸出字符就可以了 #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.g. write a character to the USART */ USART_SendData(USART1, (uint8_t) ch); /* Loop until the end of transmission */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); return ch; } 因 printf() 之類的函數,使用了半主機模式。使用標準庫會導致程序無法運行 ,以下是解決方法 : 方法 1.使用微庫 ,因為使用微庫的話 ,不會使用半主機模式 . 如果使用的是 MDK,請在工程屬性的 “Target “- 》”Code Generation “中勾選 ”Use MicroLIB “這樣以后就可以 使用 printf ,sprintf 函數了 方法 2.仍然使用標準庫 ,在主程序添加下面代碼 : /*為確保沒有從 C 庫鏈接使用半主機的函數,因為不使用半主機,標準 C 庫 stdio.h 中有些使用半主機的 函數要重新寫 ,您必須為這些函數提供自己的實現 */ #pragma import(__use_no_semihosting) ?// 確保沒有從 C 庫鏈接使用半主機的函數 _sys_exit(int ?x) //定義 _sys_exit() 以避免使用半主機模式 { x = x; } struct __FILE ?// 標準庫需要的支持函數 { int handle; }; /* FILE is typedef ’ d in stdio.h. */ FILE __stdout; 在獨立應用程序中,您不太可能支持半主機操作。 因此,必須確保您的應用程序中沒有鏈接 C 庫半主機 函數。 為確保沒有從 C 庫鏈接使用半主機的函數, 必須導入符號 __use_no_semihosting 。可在您工程的 任何 C 或匯編語言源文件中執行此操作,如下所示: ? 在 C 模塊中,使用 #pragma 指令: #pragma import(__use_no_semihosting) ? 在匯編語言模塊中,使用 IMPORT 指令: IMPORT __use_no_semihosting 如果仍然鏈接了使用半主機的函數,則鏈接器會報告錯誤。 --------------------- 本文來自 牛奶Tao 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/tao658/article/details/81204094?utm_source=copy
總結
以上是生活随笔為你收集整理的STM32 串口 #pragma import(__use_no_semihosting)解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: keil编译出错关于__use_no_s
- 下一篇: RV1108调试串口参数设置