1. 程式人生 > >STM32 串列埠 #pragma import(__use_no_semihosting)解析

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