打印
[牛人杂谈]

半主机

[复制链接]
826|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
捉虫天师|  楼主 | 2017-1-26 13:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
半主机是用于 ARM 目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机。 例如,使用此机制可以启用 C 库中的函数,如 printf() 和 scanf(),来使用主机的屏幕和键盘,而不是在目标系统上配备屏幕和键盘。
沙发
捉虫天师|  楼主 | 2017-1-26 14:00 | 只看该作者
这种机制很有用,因为开发时使用的硬件通常没有最终系统的所有输入和输出设备。 半主机可让主机来提供这些设备。
半主机是通过一组定义好的软件指令(如 SVC)来实现的,这些指令通过程序控制生成异常。 应用程序调用相应的半主机调用,然后调试代理处理该异常。 调试代理提供与主机之间的必需通信。
半主机接口对 ARM 公司提供的所有调试代理都是通用的。 在无需移植的情况下使用 RealView ARMulator ISS、指令集系统模型 (ISSM)、实时系统模型 (RTSM)、RealView ICE 或 RealMonitor 时,会执行半主机操作,请参阅Figure 8.1。
在很多情况下,半主机由库函数内的代码调用。 应用程序还可以直接调用半主机操作。 有关 ARM C 库中的半主机支持的详细信息,请参阅《库和浮点支持指南》中的第 2 章 C 和 C++ 库。

使用特权

评论回复
板凳
捉虫天师|  楼主 | 2017-1-26 14:01 | 只看该作者
ARMv7 之前的 ARM 处理器使用 SVC 指令(以前称为 SWI 指令)进行半主机调用。 但是,如果要为 ARMv6-M 或 ARMv7-M(如 Cortex™-M1 或 Cortex-M3 处理器)进行编译,请使用 BKPT 指令来实现半主机。

使用特权

评论回复
地板
捉虫天师|  楼主 | 2017-1-26 14:01 | 只看该作者
半主机是这么一种机制,它使得在ARM目标上跑的代码,如果主机电脑运行了调试器,那么该代码可以使用该主机电脑的输入输出设备。
  这点非常重要,因为开发初期,可能开发者根本不知道该 ARM 器件上有什么输入输出设备,而半主基机制使得你不用知道ARM器件的外设,利用主机电脑的外设就可以实现输入输出调试。
  所以要利用目标 ARM器件的输入输出设备,首先要关掉半主机机制。然后再将输入输出重定向到 ARM 器件上,如 printf 和 scanf,你需要重写 fputc和 fgetc 函数。下面就是将 scanf 和 printf 重定向到 uart 的代码。

/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  ch: the char to be send.
  * @param  *f:
  * @retval the char that send out.
  */
int fputc(int ch, FILE *f)  
{
    /* lace your implementation of fputc here */
    /* e.g. write a character to the USART */
     
    /* Loop until the end of transmission */
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {
    }
    USART_SendData(USART1, (uint8_t) ch);

    return ch;
}

/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  *f
  * @retval the char that received.
  */
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;
}

使用特权

评论回复
5
捉虫天师|  楼主 | 2017-1-26 14:02 | 只看该作者
半主机是用于 ARM 目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机。 例如,使用此机制可以启用 C 库中的函数,如 printf() 和 scanf(),来使用主机的屏幕和键盘,而不是在目标系统上配备屏幕和键盘。
这种机制很有用,因为开发时使用的硬件通常没有最终系统的所有输入和输出设备。 半主机可让主机来提供这些设备。
半主机是通过一组定义好的软件指令(如 SVC)来实现的,这些指令通过程序控制生成异常。 应用程序调用相应的半主机调用,然后调试代理处理该异常。 调试代理提供与主机之间的必需通信。
半主机接口对 ARM 公司提供的所有调试代理都是通用的。 在无需移植的情况下使用 RealView ARMulator® ISS、指令集系统模型 (ISSM)、实时系统模型 (RTSM)、RealView ICE 或 RealMonitor 时,会执行半主机操作。
标准库使用半主机模式,半主机是通过一组定义好的软件指令 (如 SVC)SVC 指令 (以前称为 SWI 指令)来实现的,这些指令通过程序控制生成异常。 应用程序调用相应的半主机调用,然后调试代理处理该异常。调试代理(这里的调试代理是仿真器)提供与主机之间的必需通信。也就是说使用半主机模式必须使用仿真器调试。
ARMv7 之前的 ARM 处理器使用 SVC 指令 (以前称为 SWI 指令)进行半主机调
用。 但是,如果要为 ARMv6-M 或 ARMv7-M (如 Cortex™-M1 或 Cortex-M3 处
理器)进行编译,请使用 BKPT 指令来实现半主机。
简单的来说,半主机模式就是通过仿真器实现开发板在电脑上的输入和输出。和半主机模式功能相同的是ITM调试机制。

使用特权

评论回复
6
捉虫天师|  楼主 | 2017-1-26 14:03 | 只看该作者
半主机和ITM功能相当,他们都是调试机制,开发板均借助仿真器与电脑连接,实现单片机利用主机的屏幕键盘的输入输出。
这两种机制的运行均需要仿真器,否则无法运行。
       开发式一般单片机需要独立运行,开发者应去掉仿真器,把printf函数通过单片机的外设来实现,例如通过开发板的串口,lcd或者sd卡。
      MDK中通常使用以下两种方法:
方法1.使用微库,因为使用微库的话,不会使用半主机模式.
int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);
    USART1->DR = (u8) ch;      
return ch;
}  
方法2.仍然使用标准库,在主程序添加下面代码:
​#pragma import(__use_no_semihosting)
​struct __FILE
{
int handle;
};
FILE __stdout;      
_sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);//Ñ»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï   
    USART1->DR = (u8) ch;      
return ch;
}

使用特权

评论回复
7
捉虫天师|  楼主 | 2017-1-26 14:04 | 只看该作者
网上的大部分资料都是禁用了半主机模式,没有使用过半主机模式借助主机的键盘输入参数,看了很多资料,都是讲半主机的,但讲的内容太浅显,
我没有学会使用半主机,更多的是学会了禁用半主机模式,我们好像忽略了半主机模式的意义。

使用特权

评论回复
8
zhuomuniao110| | 2017-1-26 18:03 | 只看该作者
以前真是没用过这个概念,不过内容是用过。

使用特权

评论回复
9
734774645| | 2017-1-26 19:03 | 只看该作者
貌似使用调试器在电脑上输入或显示都是半主机了。

使用特权

评论回复
10
dongnanxibei| | 2017-1-26 19:56 | 只看该作者
如果让显示的内容通过串口发送给计算机显示或者接受计算机输入的内容应该也算。

使用特权

评论回复
11
gejigeji521| | 2017-1-26 20:27 | 只看该作者
半主机接口对 ARM 公司提供的所有调试代理都是通用的。51不知道可以不

使用特权

评论回复
12
huangcunxiake| | 2017-1-26 20:32 | 只看该作者
很多人不知道这个概念,但是在不知不觉中已经使用无数次了。

使用特权

评论回复
13
wahahaheihei| | 2017-1-27 13:45 | 只看该作者
一般使用ARM内核的都是支持这种模式的

使用特权

评论回复
14
yiyigirl2014| | 2017-1-27 14:50 | 只看该作者
半主机接口对 ARM 公司提供的所有调试代理都是通用的。 在无需移植的情况下使用 RealView ARMulator® ISS、指令集系统模型 (ISSM)、实时系统模型 (RTSM)、RealView ICE 或 RealMonitor 时,会执行半主机操作。

使用特权

评论回复
15
dongnanxibei| | 2017-1-27 14:55 | 只看该作者
在无需移植的情况下使用 RealView ARMulator ISS、指令集系统模型 (ISSM)、实时系统模型 (RTSM)、RealView ICE 或 RealMonitor 时,会执行半主机操作

使用特权

评论回复
16
稳稳の幸福| | 2017-1-27 15:37 | 只看该作者
因为开发时使用的硬件通常没有最终系统的所有输入和输出设备。 半主机可让主机来提供这些设备

使用特权

评论回复
17
天灵灵地灵灵| | 2017-1-27 16:52 | 只看该作者
以后有时间好好研究一下这个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

195

主题

3117

帖子

7

粉丝