Как разместить переменные в компиляторе IAR в указанном порядке c? - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь поместить некоторые переменные в указанную c связку ПЗУ.

В файле конфигурации компоновщика:

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]

1 Ответ

0 голосов
/ 16 апреля 2020

Есть ли способ указать компоновщику не изменять порядок переменных, чтобы они отображались в файле карты в том же порядке, в котором они объявлены в исходном файле?

Мне не известна опция , которая заставляет компоновщик соблюдать порядок переменных в исходном файле.
Но есть способ достичь вашей цели с помощью директивы block в файле конфигурации компоновщика ,

В руководстве по развитию IAR C / C ++ указано для директивы place in:

Директива place in размещает разделы и блоки в спецификациях c область. Секции и блоки будут размещены в регионе в произвольном порядке. Чтобы указать конкретный порядок c, используйте директиву block.

Таким образом, в исходном файле каждая из переменных должна go выделиться в отдельный раздел:

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 };

...