0

我正在尝试将一些变量放入特定的 ROM lication 中。

在链接器配置文件中:

define symbol __ICFEDIT_region_APP_ROM_start__  = 0x08070000 ;
define symbol __ICFEDIT_region_APP_ROM_end__    = 0x0807FFFF;

define region APP_ROM_region   = mem:[from __ICFEDIT_region_APP_ROM_start__   to __ICFEDIT_region_APP_ROM_end__];

place in APP_ROM_region { readonly section test_data};

在源文件中:

#pragma default_variable_attributes = @ "test_data"

const U8 testVar8 = 0;
const U8 testArray512[512];
const uint32_t testVar32 = 0x1234ABCD;
const U8 testArray500[500];

#pragma default_variable_attributes =

生成的 .map 文件:

test_data           const    0x08070000   0x200  source_file.o [1]
test_data           const    0x08070200   0x1f4  source_file.o [1]
test_data           const    0x080703f4     0x4  source_file.o [1]
test_data           const    0x080703f8     0x1  source_file.o [1]
testArray512            0x08070000   0x200  Data  Gb  source_file.o [1]
testArray500            0x08070200   0x1f4  Data  Gb  source_file.o [1]
testVar32               0x080703f4     0x4  Data  Gb  source_file.o [1]
testVar8                0x080703f8     0x1  Data  Gb  source_file.o [1]

无论如何它都有效 - 变量位于正确的部分。

但是由于变量的大小,链接器已将其整理好。

有没有办法告诉链接器不要更改变量的顺序,所以它们会以与源文件中声明的顺序相同的顺序出现在映射文件中?

目标是:

testArray8              0x08070000     0x1  Data  Gb  source_file.o [1]
testArray512            0x08070001   0x200  Data  Gb  source_file.o [1]
testVar32               0x08070201     0x4  Data  Gb  source_file.o [1]
testVar500              0x08070205   0x1f4  Data  Gb  source_file.o [1]
4

1 回答 1

0

有没有办法告诉链接器不要更改变量的顺序,所以它们会以与源文件中声明的顺序相同的顺序出现在映射文件中?

我不知道有一个选项会强制链接器尊重源文件中的变量顺序。
但是有一种方法可以使用block链接器配置文件中的指令来达到您的目标。

该指令的IAR C/C++ 开发指南声明place in

place in指令将部分和块放置在特定区域中。部分和块将以任意顺序放置在该区域中。要指定特定顺序,请使用该block指令。

因此,在源文件中,每个变量都需要进入一个单独的部分:

const U8       testVar8          @ test_data_1 = 0;
const U8       testArray512[512] @ test_data_2;
const uint32_t testVar32         @ test_data_3 = 0x1234ABCD;
const U8       testArray500[500] @ test_data_4;

在链接器配置文件中,我们以所需的顺序添加一个block包含各个部分的定义,test_data_*并将其放在目标区域的开头:

define symbol __ICFEDIT_region_APP_ROM_start__  = 0x08070000 ;
define symbol __ICFEDIT_region_APP_ROM_end__    = 0x0807FFFF;

define region APP_ROM_region   = mem:[from __ICFEDIT_region_APP_ROM_start__   to __ICFEDIT_region_APP_ROM_end__];

define block TEST_DATA with fixed order { 
  readonly section test_data_1,
  readonly section test_data_2,
  readonly section test_data_3,
  readonly section test_data_4
};

place at start of APP_ROM_region { block TEST_DATA };

于 2020-04-16T08:06:26.280 回答