keil編譯出錯(cuò)關(guān)于__use_no_semihosting_swi的使用
__use_no_semihosting_swi,即不使用半主機(jī)模式,防止程序進(jìn)入軟件中斷。
1.在嵌入式程序編譯時(shí)如果出現(xiàn)printf、fopen、fclose等文件操作,因程序中并沒(méi)有對(duì)這些函數(shù)的底層實(shí)現(xiàn),使得設(shè)備運(yùn)行時(shí)會(huì)進(jìn)入軟件中斷BAEB處,這時(shí)就需要__use_no_semihosting_swi這 個(gè)聲明,使程序遇到這些文件操作函數(shù)時(shí)不停在此中斷處,具體操作如下,將下列程序加入你的工程中:
//不使用半主機(jī)模式
#if 1 //如果沒(méi)有這段,則需要在target選項(xiàng)中選擇使用USE microLIB
#pragma import(__use_no_semihosting) //注釋本行, 方法1
struct __FILE {
int handle;
};
FILE __stdout;
_sys_exit(int x)
{
x = x;
}
//__use_no_semihosting was requested, but _ttywrch was referenced, 增加如下函數(shù), 方法2
_ttywrch(int ch)
{
ch = ch;
}
#endif
若出現(xiàn)如下編譯錯(cuò)誤:Error: L6915E: Library reports error: __use_no_semihosting_swi was requested, but _ttywrch was referenced,此時(shí)你只需重寫_ttywrch 函數(shù)即可
void _ttywrch(int ch){}。
2.__use_no_semihosting_swi也常用于對(duì)printf的重定向,通常是重定向到串口輸出,這時(shí)只需在1中的重寫函數(shù)中加入:
int fputc(int ch, FILE *f)
{
uart_send_char(ch);//你的串口發(fā)送字符函數(shù)
return ch;
}
這樣即可。