C编译器将存储器当作一个由代码子模块和数据子模块组成的线性模块。每个由C程序生成的代码子模块或数据子模块被放到各自的连续存储空间中。编译器认为目标存储器的全部24位地址都有效。
编译器支持两种存储器模型:小存储模式和大存储器模式。两种存储模式的数据在存储器中的放置和访问不同。
1.小存储器模式(默认模式)
使用小存储器模式将得到比使用大存储模式时更少的代码和数据。但是,程序必须满足一定的大小和存储放置限制。
在小存储器模式中,在单页(64KB)存储器内的以下段必须都分配合适:
.bss和.data段(所有静态和全局数据)。
.stack和sysstack段(第一和第二系统堆栈)。
.sysmem段(动态存储空间)。
.const段。
而对.text段(代码)、.switch段(switch语句)和.cinit段(变量初始化)的大小和位置没有限制。
小模式下编译器使用16位数据指针来访问数据。XARn寄存器的高7位用来设置指向包含.bss段的存储页。在程序执行过程中它们仍指向原来那些值。
2.大存储器模式
大存储器模式支持不严格的数据放置。用-ml shell选项就可以应用该模式。
在大存储器模式下,数据指针为23位,在存储器中占2字空间。.stack和.sysstack段必须在同一页上。
在大存储器模式下编译代码时,必须和rts55x.lib运行时间库链接。应用程序中的所有文件都必须使用相同的存储器模式。
链接器不允许同时存在大存储器模式和小存储器模式。