将一组函数或变量放在特定内存中

将一组函数或变量放在特定部分中

本技术说明介绍了在指定节中放置多个函数或变量的两种方法,而无需使用多个#pragma位置指令。

讨论

可以使用#pragma位置将一个函数(或变量)放置在命名节中,例如:

#pragma location="MY_FUNC"
void f(void);

但是,当要放置许多函数(或变量)时,使用#pragma位置变得不切实际。

将介绍这些方法:

• 使用单个杂注指令放置多个函数/变量。
• 使用链接器放置指令放置对象文件中的多个函数。

使用单个编译指示放置多个函数/变量

有两个可用的编译指示,用于设置函数/变量的声明和定义的默认位置和属性:


#pragma default_variable_attributes#pragma default_function_attributes

这两个编译指示使得对多个声明和定义使用单个指令成为可能,而不是使用多个#pragma位置指令。#pragma

如何使用这些杂注指令的示例

在源代码中,将一些函数放在 部分。MY_FUNC

pragma default_function_attributes = @ "MY_FUNC"

int fun1(int x)
{
    return x + 1;
}

int fun2(int x)
{
    return x - 1;
}

/* Stop placing functions in section MY_FUNC */
#pragma default_function_attributes =

int fun3(int x)
{
    return x + x;
}

/* Place following data in section MY_DATA */
#pragma default_variable_attributes = @ "MY_DATA"

int data1;
int data2;

/* Stop placing data in section MY_DATA */
#pragma default_variable_attributes =

int data3;

int main()
{
    data1 = fun1(5);
    data2 = fun2(5);
    data3 = fun3(5);

    return data1 + data2 + data3;
}

将以下行添加到链接器配置文件 (.icf) 中,以将指定内存地址范围内的所有数据放在 以下部分中:MY_DATA

define region DATA_region = mem:[from 0x20000000 to 0x20001FFF ];
place in DATA_region { readwrite section MY_DATA };

将以下行添加到链接器配置文件中,以将所有代码放在 指定的内存地址范围的 节中:MY_FUNC

define region FUNC_region = mem:[ from 0x70000 to 0x70FFF ];
place in FUNC_region { readonly section MY_FUNC };

使用链接器放置指令放置对象文件中的多个函数

与使用多个#pragma位置相比,更方便的方法是将函数放在单独的源文件中,并让链接器使用指令中的位置从对象文件中选择所有函数。

请按照下列步骤操作:

  1. 收集一个(或多个)源文件中的函数。
  2. 删除之前使用的任何#pragma位置指令。
  3. 编辑文件,并在指令中添加一个包含关键字对象的位置,如下所示。.icf

将以下行添加到链接器配置文件中,以将源文件中的所有代码放在指定的内存地址范围内:Utilities.c

define region UTILITIES_region = mem:[ from 0x71000 to 0x71FFF ];
place in UTILITIES_region { readonly object Utilities.o };

结论

不需要使用多个#pragma位置指令将数据/代码放在指定的内存地址范围内。相反,您可以使用上述方法。

有关链接器放置指令的详细信息,请参阅 IAR C/C++开发指南中的标题节选择器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值