半主机模式和_MICROLIB 库 朴灿烈づ我的快乐病毒、 2023-06-01 06:15 1阅读 0赞 半主机是这么一种机制,它使得在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 中有些使用半主机的 函数要重新写 ,您必须为这些函数提供自己的实现 \*/ \#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 如果仍然链接了使用半主机的函数,则链接器会报告错误。 ———————————————— 版权声明:本文为CSDN博主「Robben.Han」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/hxlawf/article/details/89491088 转载于:https://www.cnblogs.com/jack-hzm/p/11464816.html
还没有评论,来说两句吧...