嵌入式软件开发之:编译器的缺省行为
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的支持函数,使字符串被写入到控制台。
13.2.3 默认存储器映射
对于没有描述存储器映射的映像(Image),RVCT根据默认存储器映射放置代码和数据。默认的存储器映射如图13.3所示。
图13.3 默认存储器映射
结合图13.3,可以看出默认的存储器映射使用以下规则:
· 链接映像,在地址0x8000加载并运行。首先放置所有的RO(只读)段,其次是RW(读写)段,然后是ZI(零初始化)段。
· 堆(Heap)直接从ZI段的顶端地址算起,因此,其准确位置在链接时决定。
· 栈(Stack)的起始地址在应用程序启动过程时由Semihosting操作提供。具体Semihosting操作设置的值由调试系统的不同而不同。
① RealViewARMulator ISS(RVISS)设置为配置文件peripherals.ami中设定的值。默认值是0x08000000。
② Multi-ICE将该地址设置为调试器内部变量top_of_memory的值。默认值是0x00080000。
评论