如何在代码中获取段的地址

浏览:3344来源:本站时间:2020-06-15

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");



京ICP备:京ICP备05011254号-1 版权归北京麦克泰软件技术有限公司所有
北京麦克泰软件技术有限公司