在ADS的C语言函数库中,某些ANSIC的功能是由主机的调试环境来提供的,这套机制有一个专门术语叫Semihosting。Semihosting通过一组软件中断(SWI)指令来实现。当一个Semihosting软中断被执行时,调试系统先识别这个SWI请求,然后挂起正在运行的程序,调用Semihosting的服务,完成后再恢复原来的程序执行。因此,主机执行的任务对于程序来说是透明的
从概念上来讲,C语言库函数可以被分成两部分,一是ANSIC语言规范本身的一部分,一是只受某一特定ANSIC层次支持的函数,如图2所示。其中一些ANSIC的功能是由主机调试环境调用驱动程序级的函数完成的。例如,ADS的库函数printf()把输出信息输出到调试器的控制台窗口,这个功能通过调用__sys_write()实现,__sys_write()执行了一个把字符串输出到主机控制台的Semihosting软中断服务程序
如果用户在程序编译时没有提供指定映象的存储器分布,ADS将为生成的目标代码和数据分配一个缺省的存储器映射图。
目标映象被连接到0x8000处,存储和执行区域都位于该地址空间。从前至后,依次为RO(只读)、RW(读写)和ZI(零初始化)部分。在ZI部分之上为HEAP,故HEAP的确切地址在连接时才能确定。但是STACK的基地址是在运用程序启动时由Semihosting操作提供。ARMulator返回配置文件peripherals.ami中的设置值,缺省为0x08000000。Multi-ICE返回的是调试器内部变量top_of_memory的值,缺省为0x00080000。
连接器布局规则
int fputc( int ch,FILE * f)
{
/*e.g.write a character to an UART*/
char tempch = ch;
sendchar( & tempch);
return ch;
}