在keil中编程时常会遇到__use_no_semihosTIng_swi的正告,这时你便是进入了半主机形式。
在嵌入式的编程中你是避免不了运用printf、fopen、fclose等函数的可是由于嵌入式的程序中并没有对这些函数的底层完成,使得设备运转时会进入软件中止BAEB处,这时就需求__use_no_semihosTIng_swi这 个声明,使程序遇到这些文件操作函数时不断在此中止处,具体操作如下,将下列程序参加你的工程中:
#pragmaimport(__use_no_semihosTIng_swi)#pragmaimport(_main_redirecTIon)constchar__stdin_name[150];constchar__stdout_name[150];constchar__stderr_name[150];typedefintFILEHANDLE;//重写规范库函数,这时printf、fopen、fclose等文件操作函数运转时就会调用你的重写函数,这些重写函数仅仅几个简略的比如,并没有重写一切的文件操作函数void_sys_exit(intstatus){while(1);}FILEHANDLE_sys_open(constchar*name,intopenmode){return0;}int_sys_close(FILEHANDLEfh){return0;}int_sys_write(FILEHANDLEfh,constunsignedchar*buf,unsignedlen,intmode){return0;}int_sys_read(FILEHANDLEfh,unsignedchar*buf,unsignedlen,intmode){return0;}int_sys_istty(FILEHANDLEfh){return0;}int_sys_seek(FILEHANDLEfh,longpos){return0;}int_sys_ensure(FILEHANDLEfh){return0;}long_sys_flen(FILEHANDLEfh){return0;}int_sys_tmpnam(char*name,intfileno,unsignedmaxlength){return0;}void_ttywrch(intch){}time_ttime(time_t*t){return0;}intremove(constchar*filename){return0;}char*_sys_command_string(char*cmd,intlen){return0;}clock_tclock(void){return0;}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
若呈现如下编译过错:Error: L6915E: Library reports error: __use_no_semihosting_swi was requested, but _ttywrch was referenced,此刻你只需重写_ttywrch 函数即可
MDK上敞开半主机形式-需求SWO线(换言之,需求运用JTAG接线)
当方针板脱离仿真器(jlink/ulink)独自运转时,不能运用半主机形式
pragma import(__use_no_semihosting_swi)
这条句子能够封闭半主机形式,只需求在恣意一个C文件中参加即可。
还有在运用keil编程的过程中还会遇到。.\OBJ\USART.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced
说的大约的意思便是关掉了半主机形式,可是函数__ttywrch被要求了,这时要把函数重写一遍,当然呈现其他的函数被要求的时分,能够参阅上面的函数进行编写,只需放到恣意一个.c源文件之中即可。
关于 microlib
microlib 是缺省 C 库的备选库。 它用于必须在极少量内存环境下运转的深层嵌入式应用程序。 这些应用程序不在操作系统中运转。microlib 不会测验成为契合规范的 ISO C 库。
microlib 进行了高度优化以使代码变得很小。 它的功用比缺省 C 库少,而且底子不具备某些 ISO C 特性。某些库函数的运转速度也比较慢,例如,memcpy()。