IAR的编译器支持通过内建的section专用运算符来获取段(section)或块(block)的起始地址、结束地址和大小。这些运算符可以使用链接器配置文件中定义的段和块,例如,可用于在代码中获取堆栈的地址和大小,因为堆栈是一个块。
__section_begin 返回指定的段或块的起始地址;
__section_end 返回指定的段或块的结束地址;
__section_size 返回指定的段或块的大小,以字节为单位。
使用方法
Section运算操作不是标准的C语言特性,如果使用section运算操作,需要在IAR的编译器设置里面,设置语言一致性为“Standard with IAR
extensions”。
图 1 语言一致性设置
Section运算符操作的对象是在源码中通过#pragma location预处理指令直接放置函数或变量到自定义的section,或在链接器配置文件中定义的block。这些运算符的声明语法如下所示:
void * __section_begin(char const
* section)
void * __section_end(char const * section)
size_t __section_size(char const * section)
指定的section部分必须是字符串,且在前面使用#pragma section指令声明过。这些操作符是按照具有专用名称的符号实现的,并将出现在这些名称下的链接器映射文件中:
运算符 |
符号 |
__section_begin(sec) |
sec$$Base |
__section_end(sec) |
sec$$Limit |
__section_size(sec) |
sec$$Length |
表格 1 section运算符与其符号
注意:当不使用这些操作符时,链接器不一定连续地放置具有相同名称的段或块。如果使用了section运算符或者等效符号,将会使得链接器会连续的放置这些段或块,以便运算符能够分配有效的值。如果这与链接器配置文件中指定的段或块位置相冲突,链接器将发出一个错误。
示例
#pragma section="MYSECTION"
...
section_start_address =__section_begin("MYSECTION");
#pragma section="MYBLOCK"
...
block_start_address =__section_size("MYBLOCK");