×

嵌入式软件开发之编译器的缺省行为详细分析

消耗积分:1 | 格式:rar | 大小:0.6 MB | 2017-10-19

分享资料个

 13.2 编译器的缺省行为
  多数嵌入式应用程序最初都是在原型环境下开发的。无论什么样的原型仿真环境与最终产品环境都是有差异的。因此,考虑如何将嵌入式应用程序从其所依赖的开发工具或调试环境中移植到在目标硬件上独立运行是非常重要的。
  开始编写嵌入式应用程序时,开发者可能并不清楚目标硬件的具体规格。如,目标系统使用了什么样的外围设备、存储器映射情况甚至不能确定处理器的型号。
  为在了解这些详细信息前能够继续软件的开发,RVCT工具提供了很多默认的操作,使用户能编译和调试与目标系统无关的应用程序代码。下面详细介绍这些编译选项,只有深入了解这些编译选项设置,才能使开发更顺利的进行。
  13.2.1 Semihosting
  1.Semihosting简介
  在RVCT C库中,对某些ISO C功能的支持由主机调试环境提供。提供该功能的机制被称为Semihostin[1]。大多数的ARM调试系统都支持Semihosting机制,如ReslView Debugger AXD等。
  调试系统提供这种机制是非常有用的,因为用于开发使用的硬件系统经常没有最终系统的所有输入和输出设备。在这种情况下,Semihosting可让主机代替目标系统提供这些设备的功能。举例来说,此机制可以用于启用C库中的函数(例如,printf()和scanf())使用主机的屏幕和键盘,而不使用目标系统的屏幕和键盘。
  半主机由一组已定义的SWI操作来实现。应用程序调用相应的SWI,然后由调试代理程序(Debug Agent)处理SWI异常。调试代理程序完成系统与主机之间的通信。
  图13.1显示了Semihosting机制的处理过程。
  嵌入式软件开发之编译器的缺省行为详细分析
  图13.1 Semihosting机制的处理过程
  在很多情况下,Semihosting SWI由库函数内的代码调用。应用程序也可以直接调用。支持ARM C库中Semihosting的详细信息,请参阅ARM相关文档。
  2.Semihosting软件接口
  ARM和Thumb SWI指令包含一个软中断号,该中断号可以被应用程序使用。此编号可以由系统中的SWI处理程序进行解码。有关SWI处理程序的详细信息,请参阅本书中ARM异常处理一节。
  Semihosting使用固定的中断号调用相应的处理程序。用于Semihosting的SWI是:
  · 0x123456(在ARM状态下);
  · 0xAB(在Thumb状态下)。
  注意用户在编写自己的中断处理程序时,避免使用Semihosting已经使用的中断向量号。
  调试代理通过SWI的中断向量号识别该软中断是目标系统提出的Semihosting请求。具体是何种Semihosting请求(键盘输入请求或屏幕显示请求),通过向寄存器r0传递不同的参数进行区分。所有其他参数通过一个数据块进行传递。该数据块的地址通过寄存器r1传递给中断处理程序。软中断的处理结果放在r0中返回,也可以通过显式的返回值或传递数据块的指针带回程序的处理结果。即使未返回结果,也假定r0是被使用的。
  用r0传递的可用Semihosting操作编号分配如下:
  · 0x00-0x31 这些编号由ARM公司使用;
  · 0x32-0xFF 这些编号由ARM公司保留,以备将来使用;
  · 0x100-0x1FF 这些编号保留给用户应用程序。
  注意虽然这些编号ARM公司不使用,用户可以使用这些编号编写自己的SWI操作,但建议使用其他 SWI 编号,而不要使用Semihosting SWI 编号和这些Semihosting的预留操作类型编号。
  · 0x200-0xFFFFFFFF这些编号未定义。当前未使用并且不推荐使用这些编号。
  在以下部分中,操作名称之后的括号中的编号是调用Semihosting操作时放入r0的值。例如,SYS_OPEN(0x01)。
  如果从汇编语言代码中调用SWI,最好使用semihost.h中定义的操作名称。可以用 EQU 伪操作定义操作名称。例如:
  SYS_OPEN EQU 0x01
  SYS_CLOSE EQU 0x02
  3.Semihosting需求函数
  Semihosting需要的函数列表如表13.1所示。如果使用默认的Semihosting功能,用户不需要编写任何其他代码。也可以重新实现部分的输入/输出函数,使这些函数和标准Semihosting混合使用。
  表13.1 Semihosting函数列表
  函 数 名 称描 述
  SYS_OPEN (0x01)打开文件
  SYS_CLOSE(0x02)关闭使用SYS_OPEN打开的文件
  SYS_WRITEC (0x03)向控制台输出字符
  SYS_WRITE0 (0x04)将空终止的字符串写入控制台
  SYS_WRITE (0x05)写入主机上的文件
  续表
  函 数 名 称描 述
  SYS_READ (0x06)将文件内容读取到缓存器
  SYS_READC (0x07)从控制台读取字节
  SYS_ISERROR (0x08)确定返回代码是否错误
  SYS_ISTTY (0x09)检查文件是否连接到交互设备
  SYS_SEEK (0x0A)搜索到文件中的某个位置
  SYS_FLEN (0x0C)返回文件的长度
  SYS_TMPNAM (0x0D)返回文件的临时名称
  SYS_REMOVE (0x0E)删除主机上的文件
  SYS_RENAME (0x0F)重命名主机上的文件
  SYS_CLOCK (0x10)执行开始后的厘秒数
  SYS_TIME (0x11)1970 年 1 月 1 日到现在的秒数
  SYS_SYSTEM (0x12)将命令传递给主机命令行解释程序
  SYS_ERRNO (0x13)获得 C 库 errno 变量的值
  SYS_GET_CMDLINE (0x15)获得用于调用可执行程序的命令行
  SYS_HEAPINFO (0x16)获得系统堆参数
  SYS_ELAPSED (0x30)获得自执行开始的目标滴答声数目
  SYS_TICKFREQ (0x31)确定滴答声的频率
  13.2.2 C 库结构
  从概念上来讲,C库函数可被化分成两类,一类为ISO C语言的规范部分,该部分的主要功能是向用户提供一个调用接口;另一类为ISO C语言规范提供支持。图13.2显示了这两类函数在C库中的结构。
  嵌入式软件开发之编译器的缺省行为详细分析
  图13.2 C库的函数结构
  对部分ISO C功能的支持是由主机调试环境在支持函数的设备驱动程序级别提供的。
  例如,RVCT C库通过写入调试器控制台窗口来实现ISO C printf()系列函数。通过调用__sys_write()来提供该功能。这是一个执行半主机SWI的支持函数,使字符串被写入到控制台。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !