ARM半主机模式介绍,及 printf (**)

ARM半主机模式介绍

关于串口读写打印的一些问题

要点:

1. 在 ARM C库中的 printf 函数,默认状态是“半主机模式”,其输出是需要专门的调试器配合之下,才能完成输出到上位机的操作。

2. 在从目标板直接输出到上位机的场合,由于没有调试器的配合,因此,需要屏蔽掉半主机模式。

3. 解决方法:微库法,代码法。

参考:

微库法,代码法:  https://www.bilibili.com/video/BV1bv4y1R7dp?p=44

--------------------------------------------------

半主机机制的作用  https://blog.csdn.net/dhs888888/article/details/125149268

半主机是用于ARM目标的一种机制,可将来自STM32单片机应用程序的输入输出请求传送至运行仿真器的PC主机。使用此机制可以启用C库中的函数,如printf()和scanf(),来使用PC主机的屏幕和键盘。这样就可以看到单片机的输入输出,方便进行调试。注意:这种机制的运行需要仿真器,否则无法运行。

简单的来说,半主机模式就是通过仿真器实现开发板在电脑上的输入和输出。

开发时单片机需要独立运行,开发者就应该去掉仿真器,把printf函数通过单片机的外设来实现,例如通过开发板的串口。

1.ARM半主机模式(Semihosting)  https://blog.csdn.net/propor/article/details/131332435

ARM Semihosting是ARM平台的一个独特功能,它允许使用主机上的输入和输出函数,通过硬件调试器转发到微控制器,通过挂接到I/O函数,如printf()和scanf(),甚至fopen()。

为什么要禁用半主机模式?   https://blog.csdn.net/qq_34810707/article/details/112255306

在嵌入式的编程中你是避免不了使用printf、fopen、fclose等函数的但是因为嵌入式的程序中并没有对这些函数的底层实现,使得设备运行时会进入软件中断BAEB处,这时就需要__use_no_semihosting_swi这 个声明,使程序遇到这些文件操作函数时不停在此中断处。
 

MDK上开启半主机模式-需要SWO线(换言之,需要使用JTAG接线),而我们程序模式开启的半主机模式,所以,我们需要禁止半主机模式。当目标板脱离仿真器(jlink/ulink)单独运行时,不能使用半主机模式。否则进入软件中断BAEB处,无法再执行下去。

=====================================

ARM半主机模式介绍

文章目录

        什么是半主机
        参考链接:

什么是半主机

半主机是一种机制,它使运行在arm目标上的代码能够在运行调试器的主机上通信和使用输入/输出功能。
这些工具包括键盘输入,屏幕输出和磁盘I/O。例如,你可以使用这种机制来启用C库中的函数,例如printf()和scanf(),以使用主机的额屏幕和键盘,而不是在目标系统上使用屏幕和键盘。
这很有用,因为开发硬件通常不具备最终系统的所有输入和输出功能。半主机使主计算机能够提供这些设施。
半主机是由一组定义好的软件指令实现的,例如SVC,它从程序控制中产生异常。应用程序调用适当的半主机调用,然后调试代理处理异常。调试代理提供与主机所需的通信。
半主机接口在ARM提供的多有调试代理中都是通用的。当您在开发平台上调试应用程序时,半主机操作会起作用,如下图所示:
在这里插入图片描述

在许多情况下,半主机是由库函数中的代码调用的。应用程序还可以直接调用半主机操作。
参考链接:

    ARM semihosting document
    Introduction to ARM Semihosting
    https://shawnhymel.com/1840/how-to-use-semihosting-with-stm32/
————————————————
版权声明:本文为CSDN博主「顶点元」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiaoyuanwuhui/article/details/131599215

关于串口读写打印的一些问题

1.禁用半主机模式

方法一:禁用半主机模式,禁用了半主机模式才能使用标准库函数printf()打印信息到串口,在程序中加入以下代码即可。那么什么是半主机模式?为什么不用它?半主机模式是ARM单片机的一种调试机制,跟串口调试不一样的是,它需要通过仿真器来连接电脑和ARM单片机,并调用相应的指令来实现单片机向电脑显示器打印信息(或者从电脑键盘读取输入)。简而言之,这种方法比串口调试更复杂(需要进行更多的配置操作),也更不灵活(一定要用仿真器)。


/********** 禁用半主机模式 **********/
#pragma import(__use_no_semihosting)
 
struct __FILE
{
    int a;
};
 
FILE __stdout;
 
void _sys_exit(int x)
{
    x=x;
}

方法二:使用微库(MicroLIB),只要在Keil的“Options for Target -> Target ->Use MicroLIB”上打钩,即可使用串口打印。微库是区别于C标准库的另一个库,当使用微库时,就默认关闭了半主机模式,也就不用添加上面的代码。这样虽然方便,但微库相对于C标准库而言,支持的功能更少,主要体现在对操作系统的支持上。所以能不用就不用。

2.重定向fputc

由于printf 最终会调用 fputc 进行字符串输出,但是这些函数是标准库提供的,而标准库没有提供源码给你,当你需要用的时候添加 <stdio.h> 即可。在PC端时,printf会将需要打印的信息打印到控制台上,但是单片机没有控制台,fputc 输出的位置可能需要改变,比如输出到 LCD、串口1、串口2,所以需要重定向fputc函数。

/*****************************************************
*function:    写字符文件函数
*param1:    输出的字符
*param2:    文件指针
*return:    输出字符的ASCII码
******************************************************/
int fputc(int ch, FILE *f)
{
    USART_SendData(USARTx, (unsigned char)ch);                //发送数据到串口
    while(USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET);        //等待上次发送结束
    return ch;
}

————————————————
版权声明:本文为CSDN博主「GPIO_InitStructure」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45520579/article/details/117223077

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值