如何在 IAR 编译器的特定位置放置变量或函数?

Posted

技术标签:

【中文标题】如何在 IAR 编译器的特定位置放置变量或函数?【英文标题】:How to place a variable or function at specific location in IAR compiler? 【发布时间】:2017-06-24 11:52:25 【问题描述】:

我正在为 Renesas Syenrgy (ARM cortex M4) 7.40.5.9722 使用 IAR Embedded Workbench

代码闪存大小:1MB

考虑以下示例:

void function (void)

     unsigned char a;
     a = a+1;

我想把这个函数放在 flash 中的特定位置。 为此代码定义用户定义部分的方法是什么。

我已经阅读了 IAR 编译器用户指南并实现了如下所述的方法:

#pragma default_function_attributes = @ "MY_FUNC"
void function (void)

     unsigned char a;
     a = a + 1;

#pragma default_function_attributes =

在 .icf 文件中,我添加了如下部分:

define symbol region_VECT_start    = 0x00000000;
define symbol region_VECT_end      = 0x000003FF;
define symbol region_ROMREG_start  = 0x00000400;
define symbol region_ROMREG_end    = 0x000004FF;
define symbol region_FLASH_start   = 0x00000500;
define symbol region_FLASH_end     = 0x000BFFFF;  // Fklsh end address is modified from 0x000FFFFF to 0x000BFFFF
define symbol region_MY_FUNC_start = 0x000C0000;  // This statement is added
define symbol region_MY_FUNC_end   = 0x000FFFFF;  // This statement is added
define symbol region_RAM_start     = 0x20000000;
define symbol region_RAM_end       = 0x2002FFFF;
define symbol region_DF_start      = 0x40100000;
define symbol region_DF_end        = 0x40103FFF;
define symbol region_QSPI_start    = 0x60000000;
define symbol region_QSPI_end      = 0x63FFFFFF;

/* Stack and heap sizes are defined in bsp_cfg.h */

define memory mem with size     = 4G;
define region VECT_region       = mem:[from region_VECT_start   to region_VECT_end];
define region ROMREG_region     = mem:[from region_ROMREG_start to region_ROMREG_end];
define region FLASH_region      = mem:[from region_FLASH_start  to region_FLASH_end];
define region RAM_region        = mem:[from region_RAM_start    to region_RAM_end];
define region DF_region         = mem:[from region_DF_start     to region_DF_end];
define region QSPI_region       = mem:[from region_QSPI_start   to region_QSPI_end];
define region MY_FUNC           = mem:[from region_MY_FUNC_start to region_MY_FUNC_end];  // New section is added

通过这些更改,代码可以正确编译。 但是,“函数”没有放在所需的位置 0x000C0000

这是为什么?

【问题讨论】:

我认为您仍然可以在代码中 #pragma default_function_attribute 块内函数上方的行中使用 #pragma location=0x000C0000 【参考方案1】:

您应在 .icf 文件中将“MY_FUNC”的定义更改为“MY_FUNC_region”以避免混淆:

define region MY_FUNC_region     = mem:[from region_MY_FUNC_start to region_MY_FUNC_end];

然后添加以下行将“MY_FUNC”代码放在“MY_FUNC_region”内:

place in MY_FUNC_region    readonly section MY_FUNC ;  

(不完全确定“只读”关键字是否绝对需要但对我有用)

或者,或者:

place at address mem:region_MY_FUNC_start  readonly section MY_FUNC;

【讨论】:

【参考方案2】:

你可以把_Pragma("location=\"__your_section__\"")放在函数前面。

然后在链接器文件中(例如):

define block __your_section_block__ size = 0x100  section __your_section__ ;

并确保将行添加到链接器:

place in MY_FUNC    block __your_section_block__ ;

【讨论】:

以上是关于如何在 IAR 编译器的特定位置放置变量或函数?的主要内容,如果未能解决你的问题,请参考以下文章

stm32项目到IAR

IAR嵌入式工作台IDE _ (__no_init) 绝对定位

无法使用 IAR ARM 编译器将函数表强制到特定地址

keil编译没有显示未定义,但是iar显示

如何制作特定类的成员函数或变量的别名(如 STL 容器)

IAR for msp430 生成txt文件时开头@1100 和@E000