在 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;
}