打印
[牛人杂谈]

Semihosting (半主机) 机制

[复制链接]
1126|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xinpian101|  楼主 | 2017-8-21 20:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Semihosting 具体来讲是指一种让代码在ARM 目标上运行,但使用运行了 ARM 调试器的主机上I/O 设备的方法;也就是让ARM 目标将输入/ 输出请求从应用程序代码传递到运行调试器的主机的一种机制。通常这些输入/输出设备包括键盘、屏幕和磁盘I/O。半主机由一组已定义的SWI 操作来实现。库函数调用相应的SWI(软件中断),然后调试代理程序处理SWI 异常,并提供所需的与主机之间的通讯。
semihost 仅仅是一种调试手段,它的机理就是利用MULTI_IDE等工具捕捉目标环境运行过程中产生的值为0x123456的SWI中断,然后向上位机的ADS 软件发送对应的调试信息。对于我们最后的应用代码来说,都是nonsemihost类型的。如果我们在调试中使用semihost,那么只要在最后重定义 ADS中的一些使用到的库函数(比如fputc),代码就可以从semihost向nonsemihost的类型转变。
沙发
xinpian101|  楼主 | 2017-8-21 20:31 | 只看该作者
半主机模式
这一章描述半主机模式机构。半主机模式提供的代码在运行ARM debugger时将主机电脑的部件灵活的应用到ARM
目标中(中国人不懂了吧,放心外国人也不会明白的)。例如工具包括:键盘输入,屏蔽输出和磁盘的输入输出这一章包括下列部分:
1 半主机
半主机是为了在运行调试时主机电脑与ARM输入输出通信的一个机构。这个机构可以这样使用,例如允许运行C语言库类似printf和scanf,用于屏蔽和主机键盘甚至有一个屏蔽和键盘在目标系统上。这个机构的好处在于硬件不用拥有全套的输入输出设备,这个机构允许主机电脑提供这些工具。
Semihosting 是通过设置软件中断来实现的。这个应用调用了适当的软件中断和易于操作的软件中断的向量。
这个代理调试提供了与主机必须的通信。在很多案例中,semihosting的软件中断被库函数代码调用。在应用中总是直接调用semihosting软件中断。涉及到编译器中的c语言库的描述和向导库有更多的信息提供对semihosting的支持。semihosting软件中断通常被ARM的代理调试所保护。semihosting可以运行在 ARMulator,
RealMonitor, Angel, or Multi-ICE 模式不需要任何设备。关于半主机在C语言库的进一步信息参看相关文档

1.1 软件中断接口
ARM和Thumb的软件中断指令包含了软件中断所要应用代码的编码信息。这个编码能够被系统中软件中断管理服务解码。关于软件中断管理服务更多的信息请看相关文档。半主机运行是被一个独立的软件中断号所请求的。
他区别于别的软件中断号是用来应用或者运行系统的。这个中断号是:
0x123456(ARM模式)
0xab(Thumb模式)
这个中断号表明这次软件中断是半主机的要求。为了区别于别的操作,这个运行通过R0。所有其它的参数通过R1。运行的结果返回到R0不管是一个直接的值还是一个指向数据块的指针,甚至没有返回结果,R0会被破坏。
可用的通过R0传递的半主机运行号如下:
0x00 to 0x31(ARM使用)
0x32 to 0xFF(保留为以后ARM使用)
0x100 to 0x1FF(保留为用户应用不会被ARM应用到)
如果你写自己的软件中断运行代码你要使用不同于半主机用的软件中断号它的典型值如下
0x200 to 0xFFFFFFFF(这些是未定义的)
这些不经常使用到,不推荐用户使用
在下列情况下运行号的值以运行名称的方式进入R0例如SYS_OPEN (0x01).
如果你调用软件中断使用汇编语言最好在运行名称,在semihost.h中声明你可以用EQU定义例如:
SYS_OPEN    EQU 0x01
SYS_CLOSE   EQU 0x02
改变半主机软件中断号:
如果不是必要建议不要改变如果一定要改变你需要:
改变你系统的所有代码包括库代码为新的中断号
重新装载你的调试来使用新的SWI号。
2 半主机执行
半主机的功能性与所有调试主机基本上是一样的。但是执行方式却是不同的。
2.1 ARMulator模式
当遇到半主机SWI,ARMulator立即响应SWI进入SWI指令的向量表但不执行。要让ARMulator支持需要改变
Default_Semihost in the default.ami file to No_Semihost.更多细节参看 Peripheral models
2.2 RealMonitor模式
RealMonitor执行一个SWI管理服务它让你的系统可以被半主机支持。当执行半双工SWI指令RealMonitorSWI管理服务完成与主机通信的请求。进一步的说明参看相关文档。
2.3 Angel模式
Angel模式在目标上电时装载了管理服务,给服务可以完成与主机的通信需求。
2.4 Multi—ICE模式
当使用Multi—ICE默认配置时半主机执行如下:
在ARM7处理器
a)在SWI向量处增加一个断点
b)当断点被触发Multi—ICE检查SWI号
c)如果SWI是半主机的Multi—ICE模仿重新启用应用。如果不是Multi—ICE就会停止处理器响应错误。
在其它处理器
a)捕捉SWI
b)如果SWI是半主机的Multi—ICE模仿重新启用应用。如果不是Multi—ICE就会停止处理器响应错误。
这个半主机机构可以被禁止或改变通过下列调试器的内部变量:
$semihosting_enabled
设置值为0是禁止半主机,如果你调试的应用在ROM,这个设置允许你应用一个额外的观察点
设置值为1允许半主机,这是默认的。
设置值为2可以确认半主机调试的信道。
除非半主机被禁止否则$vector_catch的S位不受影响。
$semihosting_vector
这个变量控制通过Multi-ICE 直接控制SWI设置的断点区域。他设置SWI默认异常向量表入口。
你应用半主机的请求就像自己的SWI服务一样设置$semihosting_vector给一个SWI服务的地址。如果你的SWI服务鉴定这是一个调用半主机的SWI则这个地址必须指向唯一的执行指令。无论进入你的SWI服务的值是多少所有的寄存器必须已经被恢复了。
Multi-ICE操作SWI和检查LR使软件中断返回你的代码。
无论$vector_catch的值如何,所有的异常和中断都会被捕获和响应就像一个错误条件一样。
更多的细节参看相关文档。
2.5 Multi-ICE DCC semihosting
Multi-ICE 能够用调试信道以至于内核在半主机占用时不会停止,可以设置$semihosting_enabled为2,更多细节参看用户手册。
3 添加一个SWI应用管理器
它对于半主机的SWI和你自己的专用SWI的实现都是有用处的。前提是你必须保证两个SWI机构能够正确地协同工作。这种方法依靠代理调试应用。
3.1 ARMulator模式
要让你自己的管理器与半主机的管理器协同工作,只需要简单的将你的SWI管理器放到SWI向量表中,没有其它的需求。
当一个适当的SWI在你的代码中ARMulator会分辨出它的指向进入响应的管理器。
3.2 RealMonitor模式
RealMonitorSWI服务器必须在你的应用中确认半主机被综合。(看相应文档)
3.3 Angel模式
应用SWI服务要添加:保存SWI向量、调整SWI向量使它指向SWI应用服务(更多细节看相应文档)
3.4 Multi—ICE模式

3.5 Multi-ICE DCC semihosting
当使用DDC半主机机构添加SWI应用服务必须向非DDC半主机模式一样正确

使用特权

评论回复
板凳
天灵灵地灵灵| | 2017-8-21 22:10 | 只看该作者
明天我跑个试试看

使用特权

评论回复
地板
捉虫天师| | 2017-8-21 22:34 | 只看该作者
就是概念性的问题,不必深究。概念都是专家装逼用的。

使用特权

评论回复
5
heisexingqisi| | 2017-8-25 16:18 | 只看该作者
就是用电脑上用的输入输出嘛

使用特权

评论回复
6
xixi2017| | 2017-8-25 20:08 | 只看该作者
键盘输入,屏蔽输出和磁盘的输入输出

使用特权

评论回复
7
wanduzi| | 2017-8-26 20:31 | 只看该作者
需要串口

使用特权

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

本版积分规则

113

主题

1471

帖子

1

粉丝