打印
[牛人杂谈]

新唐Cortex M0使用semihost输入输出办法

[复制链接]
1450|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xinpian101|  楼主 | 2017-8-21 20:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

Semihosting是一段功能代码,这段功能代码主要运行在PC上,并由调试工具上的固件来激活调用。而周工的EasyJTAG没有实现这个激活调用功能。(qemo是基于驻留程序angel来实现的)

ARM公司对Semihosting的中文解释是半主机机制。为什么叫半主机呢?主要是指应用程序的代码运行在目标系统上,当需要类似PC平台下的控制台输入输出时,会调用Semihosting去利用PC上的控制台输入输出设备:如打开关闭文件,PC显示器输出,键盘输入等等。.


沙发
xinpian101|  楼主 | 2017-8-21 20:37 | 只看该作者
从用户的角度来看,printf好像和普通的一样,关键的区别在于printf的实现。一般的调试器都提供两个版本的IO库,一个式标准的库,另外一个是支持semihosting的库。其实现有区别。下面以printf举例说明其原理:支持semihosting的printf的实现和标准的printf不同,支持semihosting的printf用SWI指令来通知仿真器。仿真器在地址0x8处设置断点,但SWI指令执行后,仿真器可以捕获到该SWI指令。根据SWI的number来判断这个SWI是不是SEMIHOSTING请求,如果是,再根据具体的semihosting number响应用户的semihosting请求,完成用户的semihosting请求后,返回到SWI的后面一条指令,继续执行。所以,对用户来说,这是透明的。

使用特权

评论回复
板凳
xinpian101|  楼主 | 2017-8-21 20:37 | 只看该作者
semihosting, 也就是我们平常说的半主机模式。
在嵌入式开发中,使用semihosting, 即使目标开发板没有外接输出串口,
我们也能很容易的利用调试工具的窗口,达到输入输出的效果。
这为我们调试产品带来了极大的便利。
最近有两家公司的Cortex M0芯片上市了。NXP和Nuvoton。
对比arm网站的描述,发现M0系列支持的调试功能真是有够简单。
所幸的是,Nuvotion的工具包支持所谓的semihosting的用法。
下面介绍如何在Nuvoton NUC100/NUC120...系列上使用semihosting功能。
笔者所用的开发工具是Keil uVision4,
Debugger ICE 需要用 Nuvoton的Nu-Link调试器,
用一块NUC120开发板. 过程如下:
1. 首先到nuvoton.com上下载一份NUC1XXBSP,
下载完后, 用Keil uVision4打开其中任何一个工程, 发现每个工程都差不多的组织形式,
工程中的这两个文件是我们接下来要处理的:
    CMSIS files\startup_NUC1xx.s
    Library files\retarget.c
2. 如果没有安装Nu-Link调试器驱动, 需要先安装一份.
   安装完后Keil的安装目录下有一个semihost的例子程序
      C:\Keil\ARM\BIN\Nu_Link\SemiHost
   用这个目录下的两个文件
     SH_startup_NUC1xx.s 和 SH_retarget.c
   替换原先工程中的 startup_NUC1xx.s 和 retarget.c
3. 重新编译原先的工程, 将编好的代码烧录到NUC120开发板上运行.
   烧录/运行的时候一定要用Keil+Nu-Link调试器. 运行起来后, 点击菜单
       "View -> Serial Window -> UART1" , 打开虚拟串口1
   如果程序中有printf, 您会看到printf的输出都输出到这个 "串口1" 来了.
   (不经Keil直接在flash中运行程序怎么样? 当然输出到真实串口了

使用特权

评论回复
地板
xinpian101|  楼主 | 2017-8-21 20:38 | 只看该作者
事实上,如果只是测验一下,
直接编译, 用Keil运行 Nu-Link自带的项目 C:\Keil\ARM\BIN\Nu_Link\SemiHost,
就可以看到semihost的输入/输出效果了.

使用特权

评论回复
5
xinpian101|  楼主 | 2017-8-21 20:41 | 只看该作者
结束之前, 同时写两个注意的地方:
1. 一定要用Nuvoton的Nu-Link搭配Keil IDE. 用Ulink2也不行, 貌似Ulink2碰到semihost指令就停下了.
2. 替换文件后重新编译, 如果使用了scatter file连接办法, 要检查下scatter file中的文件名是否要同样修改, 否则build时连接通不过.

使用特权

评论回复
6
天灵灵地灵灵| | 2017-8-21 21:22 | 只看该作者
原来是借助计算机调试单片机的一个方法啊。

使用特权

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

本版积分规则

95

主题

1409

帖子

1

粉丝