194688299_1_20200706075441646

编者悟语:减少产生心理落差的可能,你的内心就会越平静,进而会越纯净。

我们有时为了程序效率或达到取用某特定地址上资源等目的,会将常量、变量、函数存放到指定的存储空间内,这时我们就会涉及一个如何达到这个目的的问题。不同IDE实现方式可能是不同的,但是是类似的,可以参考借鉴,下面我以IAR为环境背景介绍一下相关的内容。

1 指定常量的存放地址

1)将常量存放到指定的绝对地址上

将常量YourConstVar放到0x80000000地址处,常量值为0x66888866

const int YourConstVar @ 0x80000000 =

0x66888866;

2)将常量存放到指定段

将常量YourConstVar放到段.yourconstvarname上,常量值为0x66888866

const int YourConstVar @”.yourconstvarname” = 0x66888866;

等价方式:

#pragma location = “.yourconstvarname”

const int YourConstVar = 0x66888866;

place … {section .yourconstvarname};

3)将多个常量集中在一个源文件中并编译生成.o目标文件或.a库文件

place … {section .rodata object

YourFileName.o};

place … {section .rodata object

YourLibName.a};

2 指定变量的存放地址

1)将变量存在在绝对地址上

将变量YourVar1放到0x60021000上,变量值为0x66888866

将变量YourVar1放到0x60022000上,未赋初值

实现如下:

int YourVar1 @ 0x60021000 = 0x66888866;

int YourVar2 @ 0x60022000;

2)将变量存放到绝对地址上

int YourVar1 @ “.yourdata” = 0x66888866;

等价方式:

#pragma location = “.yourdata”

int YourVar1 = 0x66888866;

place … {section .yourdata};

3)将多个变量放到一个源文件中并编译生成.o目标文件或者.a库文件

place … {section .data objectYourFileName.o};

place … {section .bss objectYourLibName.a};

3 指定函数的存放地址

1)将单个函数存放到指定段

在C源文件中将函数存放在事先定义的段内

void YourFunc(void) @ “.yourfunccode”

{

}

等价方式:

#pragma location = “.yourfunccode”

void YourFuncName(void)

{

}

在ICF文件中设置这个段的地址:

place … {section .youfuncode};

2)将多个函数存放到一个源文件中并编译生成.o目标文件或.a库文件

将.o或.a文件存入.text段:

place … {section .text object YourFileName.o};

place … {section .text object YourLibName.a};

4 将函数运行在RAM

1)使用__ramfunc关键词

__ramfunc void YourRamFunc(void) {…}

.textrw_init(Flash) ->.textrw(RAM)

上面第二句并非实际代码,只是一种存储内容的搬移过程。

2)将单个函数存放在指定段

void MyRamFunc(void) @”yourramcode” {…}

等价方式:

#pragma location = “.yourramcode”

void YourRamFunc(void)

{

}

initialize by copy {readwrite,

section.yourramcode}; //拷备到RAM中

place … {section .yourramcode};   //放在RAM中

3)将多个函数存放到一个源文件中并编译生成.o目标文件或.a库文件

//拷备到RAM中

initialize by copy {readwrite,section.textobjectYourFileName.o};

//放在RAM中

place … {section .text

object YourFileName.o};说明:图中…在函数中为函数代码,在place后面为如下形式:

place at {address memory[:expr] |

startof region_expr |

end ofregion_expr}{extended-selectors};

place in region-expr{ extended-selectors };

at是放在特定地址,in是放在某个存储块中,上面两条指令参量的分析请看我“/RT1052/分散加载/IAR中的icf分散加载文件分析”中的内容。

5 总结

每种编程环境下这些量和函数的存放方式在指令使用上会存在一些差异,但是是类似的,存放的地址可能是段或特定的区块,这要根据自己的需要来决定。此篇与“IAR中的icf分散加载文件分析”是姊妹篇可以一起看。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐