通过连接器,把一个函数放在指定存储器期望的位置,大体有两种方法。第一种:可以指定函数放到绝对物理地址位置。使用__at放置符号,不用分散加载文件。第二种,指定函数在某一个范围,使用name section,配合分散加载文件使用。我这里就归纳为总共2种方法吧。
name section是啥? 我也不知道准确的翻译,大概意识就是定义一个段section,给这个段取一个name,合起来就是name section。
注意:下面都是针对ARM编译器5(AC5)描述,AC6可能有区别。
1)方法一:使用放置符号__at把函数放在指定存储器位置,无需修改分散加载文件。
①在main.c中增加如下代码:
int sqr_formula(int n1) __attribute__((section(".ARM.__at_0x08006000")));
int sqr_formula(int n1)
{
return n1*n1;
}
②我们在map文件中可以看到:
2)方法二:使用name section把函数放在指定存储器位置,配合分散加载文件。
这种方式可以指定函数在一个执行域的地址范围内,而不是指定在绝对物理地址。
①在main.c中增加代码:
int sqr_formula(int n1) __attribute__((section("foo_name_section")));
int sqr_formula(int n1)
{
return n1*n1;
}
②在分散加载文件中增加内容:
③查看map文件: