ZHCADC5A June 2013 – June 2020
一些 MSP 系列器件支持多种数据和代码存储器模型。这些模型因允许的对象和指针大小而异。编译器使用不同的指令和重定位来实现这些模型。节 1.9概述了 MSP 系列支持的代码和数据模型。要了解指针如何因存储器模型而异,请参阅节 2.4。
MSP 系列不区分“near”地址和“far”地址
除了影响指针大小的模型之外,数据模型还会影响 size_t 和 ptrdiff_t 的类型,因而决定允许的最大对象大小。
对于具有小型数据模型的 MSP430 和 MSP430X,所有存储器位置均可通过 16 位地址进行访问。
对于具有受限数据模型和大型数据模型的 MSP430X,大多数地址仍然可以通过 16 位地址访问,并且第 16 位以上的所有位均为零。有些指令(例如 CALL)仅处理 16 位指针,因此这些指令只能在较低的 64KB 存储器空间中使用;它们会忽略 20 位指针的高 4 位。其他指令(例如 CALLA)使用完整的 20 位地址;这些指令可以到达整个存储器空间。
MSP430X 器件没有任何超过 64KB 边界的可写存储器。对于这些器件,即使使用受限数据模型或大型数据模型,也只会将常量数据放置在 64KB 以上。编译器可以利用这一知识生成更高效的代码。这由 --near_data 编译器选项控制。如果指定 --near_data=globals,此选项告诉编译器所有全局读取/写入数据必须位于存储器的前 64K 中。这是默认行为。如果指定了 --near_data=none,编译器不能依赖这个假设来生成更高效的代码。
如果指定依赖于工具链特定方面(如命令行选项或语言扩展),程序员有责任在声明变量的地方始终使用这些构造,但需要由链接器来捕获错误。
ABI 建立了变量到段的传统赋值。变量的赋值是初始化类别的函数,由以下列表中的第一个匹配条件确定。
表 4-2 列出了传统的段赋值:
初始化类别 | |||
---|---|---|---|
未初始化 | 已初始化 | 常量 | |
.bss | .data | .const |
传统赋值可以通过特定于工具链的方式被覆盖。例如,变量可以分配给用户定义的段。