Перейти к содержанию
    

Порядок размещение в секции.

Добрый день, понадобилось некоторые перемеренные перенести в начальный адрес ОЗУ, сделал секцию:

place at address mem:__ICFEDIT_region_RAM_start__    { readwrite section .StartingRam};

Разместил примеренные в секции (Блочно можно указать? Что бы не к каждой переменной модификатор добавлять.)

uint16_t CopyMaxLen@".StartingRam";
//--------------------------------------------
Dump32_t AddrCopyHead@".StartingRam";
Dump16_t AddrCopyLen@".StartingRam";
Dump32_t AddrCopyBuff@".StartingRam";
//--------------------------------------------
static Dump8_t  VarSaveDump8@".StartingRam";
static Dump16_t VarSaveDump16@".StartingRam";
static Dump32_t VarSaveDump32@".StartingRam";

Смотрю map файл:

"A3":                                       0xb8
  .StartingRam       zero     0x20000000    0x2c  debuger.o [1]
  .StartingRam       zero     0x2000002c    0x18  debuger.o [1]
  .StartingRam       zero     0x20000044    0x2c  debuger.o [1]
  .StartingRam       zero     0x20000070    0x18  debuger.o [1]
  .StartingRam       zero     0x20000088    0x2c  debuger.o [1]
  .StartingRam       zero     0x200000b4     0x2  debuger.o [1]
                            - 0x200000b6    0xb6

Вижу что  переменная  CopyMaxLen разместилась в самом конце, это почему так? Я ожидал что они разместиться как я их объявил, в том же порядке. Хотя остальные разместились в порядке объявления.   

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, pokk сказал:

Вижу что  переменная  CopyMaxLen разместилась в самом конце, это почему так? Я ожидал что они разместиться как я их объявил, в том же порядке.

С чего бы это? :wacko2:

Компоновщик должен размещать объекты в выходной секции наиболее оптимально. Т.е. - так чтобы минимизировать дырки между ними, например. Поэтому, как правило, объекты с меньшим выравниванием оказываются в конце выходной секции линковки, с бОльшим - в её начале. И нет никакой гарантии о порядке размещения входных секций внутри выходной секции - это на усмотрение компоновщика (если не указано явно иное для данной вых.секции).

Если нужен строгий порядок каких-то переменных - заключите их в struct.

И использовать place at address mem - тоже, имхо, плохой стиль. Лучше задать этой структуре отдельную секцию и в выходной секции указать, что эта секция находится в её начале.

В исходнике:

__no_init struct {
  char buf1[xxx];
  char buf2[xxx];
} static buf @ ".first_in_ram";

В .icf-файле:

place in __ICFEDIT_region_RAM_start__ {rw, section .first_in_ram, ...};

Другой способ:

Не размещать все переменные в одной структуре, а указать каждой переменной отдельную свою секцию и уже в .icf-файле создать из них блок, в котором расположить их в желаемом порядке:

static __no_init u8 buf1[xxx] @ ".raw1";
static __no_init u8 buf2[xxx] @ ".raw2";

в .icf-файле:

define block MEM_FIRST with fixed order {section .raw1, section .raw2};
place in __ICFEDIT_region_RAM_start__ {rw, block MEM_FIRST, ...};

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...