簡單的說,就是我們嵌入式程式中,類似printf的介面是會與我們pc進行通訊,以方便我們借助我們除錯板的**器在pc上用開發工具進行除錯。
在嵌入式的程式設計中你是避免不了使用printf、fopen、fclose等函式的但是因為嵌入式的程式中並沒有對這些函式的底層實現,使得裝置執行時會進入軟體中斷baeb處,這時就需要__use_no_semihosting_swi這 個宣告,使程式遇到這些檔案操作函式時不停在此中斷處。
mdk上開啟半主機模式-需要swo線(換言之,需要使用jtag接線),而我們程式模式開啟的半主機模式,所以,我們需要禁止半主機模式。當目標板脫離**器(jlink/ulink)單獨執行時,不能使用半主機模式。否則進入軟體中斷baeb處,無法再執行下去。
這條語句可以關閉半主機模式,只需要在任意乙個c檔案中加入即可。
還有在使用keil程式設計的過程中還會遇到..\obj\usart.axf: error: l6915e: library reports error: __use_no_semihosting was requested, but _ttywrch was referenced
說的大概的意思就是關掉了半主機模式,但是函式__ttywrch被要求了,這時要把函式重寫一遍,當然出現其他的函式被要求的時候,可以參考上面的函式進行編寫,只要放到任意乙個.c原始檔之中即可。
如下,再程式加入以下**即可。這裡我們不僅禁止了半主機,還將printf介面重定向未串列埠輸出。
#if 1
#pragma import(__use_no_semihosting)
//解決hal庫使用時,某些情況可能報錯的bug
//因為禁止了半主機模式,需要重寫乙個半主機模式下的介面,如下
int _ttywrch(int ch)
//標準庫需要的支援函式
struct __file
; /* file is typedef』 d in stdio.h. */
file __stdout;
//定義_sys_exit()以避免使用半主機模式
void _sys_exit(int x)
//重定義fputc函式
int fputc(int ch, file *f)
#endif
**關於 microlib
microlib 是預設 c 庫的備選庫。 它用於必須在極少量記憶體環境下執行的深層嵌入式應用程式。 這些應用程式不在作業系統中執行。microlib 不會嘗試成為符合標準的 iso c 庫。
microlib 進行了高度優化以使**變得很小。 它的功能比預設 c 庫少,並且根本不具備某些 iso c 特性。某些庫函式的執行速度也比較慢,例如,memcpy()。
STM32半主機模式
在keil中程式設計時常會遇到 use no semihosting swi的警告,這時你就是進入了半主機模式。在嵌入式的程式設計中你是避免不了使用printf fopen fclose等函式的但是因為嵌入式的程式中並沒有對這些函式的底層實現,使得裝置執行時會進入軟體中斷baeb處,這時就需要 us...
stm32半主機模式
在keil中程式設計時常會遇到 use no semihosting swi的警告,這時你就是進入了半主機模式。在嵌入式的程式設計中你是避免不了使用printf fopen fclose等函式的但是因為嵌入式的程式中並沒有對這些函式的底層實現,使得裝置執行時會進入軟體中斷baeb處,這時就需要 us...
STM32啟動模式
stm32三種啟動模式對應的儲存介質均是晶元內建的,它們是 1 使用者快閃儲存器 晶元內建的flash。2 sram 晶元內建的ram區,就是記憶體啦。3 系統儲存器 晶元內部一塊特定的區域,晶元出廠時在這個區域預置了一段bootloader,就是通常說的isp程式。這個區域的內容在晶元出廠後沒有人...