半主機是這麼一種機制,它使得在ARM目標上跑的代碼,若是主機電腦運行了調試器,那麼該代碼可使用該主機電腦的輸入輸出設備。
這點很是重要,由於開發初期,可能開發者根本不知道該 ARM 器件上有什麼輸入輸出設備,而半主基機制使得你不用知道ARM器件的外設,利用主機電腦的外設就能夠實現輸入輸出調試。
因此要利用目標 ARM器件的輸入輸出設備,首先要關掉半主機機制。而後再將輸入輸出重定向到 ARM 器件上,如 printf 和 scanf,你須要重寫 fputc和 fgetc 函數。下面就是將 scanf 和 printf 重定向到 uart 的代碼。
函數
int fputc(int ch, FILE *f)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{
}
USART_SendData(USART1, (uint8_t) ch);
return ch;
}
int fgetc(FILE *f)
{
int ch;
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
{
}
ch = USART_ReceiveData(USART1);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{
}
USART_SendData(USART1, (uint8_t) ch);
return ch;
}
printf() 之類的函數,使用了半主機模式。使用標準庫會致使程序沒法運行 ,如下是解決方法 :
方法 1.使用微庫 ,由於使用微庫的話 ,不會使用半主機模式 .
若是使用的是 MDK,請在工程屬性的 「Target 「- 》」Code Generation 「中勾選 」Use MicroLIB 「這樣之後就能夠
使用 printf ,sprintf 函數了
方法 2.仍然使用標準庫 ,在主程序添加下面代碼 :
/*爲確保沒有從 C 庫連接使用半主機的函數,由於不使用半主機,標準 C 庫 stdio.h 中有些使用半主機的
函數要從新寫 ,您必須爲這些函數提供本身的實現 */ui
#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;.net
在獨立應用程序中,您不太可能支持半主機操做。 所以,必須確保您的應用程序中沒有連接 C 庫半主機函數。
爲確保沒有從 C 庫連接使用半主機的函數, 必須導入符號 __use_no_semihosting 。可在您工程的任何 C 或彙編語言源文件中執行此操做,以下所示:
在 C 模塊中,使用 #pragma 指令:
#pragma import(__use_no_semihosting)
在彙編語言模塊中,使用 IMPORT 指令:
IMPORT __use_no_semihosting
若是仍然連接了使用半主機的函數,則連接器會報告錯誤。
————————————————
版權聲明:本文爲CSDN博主「Robben.Han」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/hxlawf/article/details/89491088調試