5232|2

227

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

IAR小课堂 | 如何将一组函数或变量放在特定段内 [复制链接]

本文描述了在不使用多个#pragma location指令的情况下,在指定的段中放置多个函数或变量的两种方法。

讨论

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

#pragma location = “MY_FUNC”

void f (void );

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

下面将描述这些方法:

  • 使用单个pragma伪指令放置多个函数/变量。

  • 使用链接器放置指令从目标文件放置多个函数。

 

使用单个pragma指令放置多个函数/变量

有两个pragma伪指令可以用于设置函数/变量的声明和定义的默认位置和属性:

•   #pragma default_variable_attributes

•   #pragma default_function_attributes

这两个pragma指令可以对多个声明和定义使用一个pragma指令,而不是使用多个pragma位置指令。

使用这些pragma指令的示例

在源代码中,将一些函数放在MY_FUNC段内:

---------------------------------------------------------

#pragma default_function_attributes = @ "MY_FUNC"

int fun1(int x)

{

    return x + 1;

}

int fun2(int x)

{

    return x - 1;

}

/* 停止函数安放在MY_FUNC段中 */

#pragma default_function_attributes =

 

int fun3(int x)

{

    return x + x;

}

----------------------------------------------------------------

/* 在MY_DATA 段中安放下列数据 */

#pragma default_variable_attributes = @ "MY_DATA"

 

int data1;

int data2;

 

/* 停止在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

 0x20000000to 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 location更方便的方法是将这些函数放在单独的源文件中,并让链接器使用place in指令从object文件中选择所有函数。

步骤如下:

1、在一个(或多个)源文件中收集函数。

2、删除之前使用过的任何#pragma location指令。

3、编辑 .icf文件,并在包含关键字object的指令中,添加一个place in,如下所示。

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

define region UTILITIES_region = mem:[ from 0x71000 to 0x71FFF ];

place in UTILITIES_region { readonly object Utilities.o };

结论

不需要使用多个#pragma location指令将数据/代码放在指定的内存地址范围内。根据需要您可以使用上面提供的方法。



此内容由EEWORLD论坛网友MamoYU原创,如需转载或用于商业用途需征得作者同意并注明出处

此帖出自ARM技术论坛

最新回复

不同编译器,方法也不一样吧  详情 回复 发表于 2020-4-23 14:13
点赞 关注
个人签名

欢迎关注“麦克泰技术”

 

回复
举报

295

帖子

1

TA的资源

版主

沙发
 
不同编译器,方法也不一样吧
此帖出自ARM技术论坛
 
 
 

回复

227

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
hotsauce1861 发表于 2020-4-23 14:13 不同编译器,方法也不一样吧

是的,我这里用的是IAR

此帖出自ARM技术论坛
 
个人签名

欢迎关注“麦克泰技术”

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表