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

STM32F4 + Atollic от чего зависит расположение переменных в памяти?

Выделил под переменные определенную секцию в памяти: 

Spoiler

 

Файл *.Ld:

SECTIONS
{
  .mySegment 0x0800C000 : {KEEP(*(.mySection))}
}

 

Соответственно переменные кладу в этот сегмент:

Spoiler


const uint8_t conf_key __attribute__((section(".mySection"))) = 'U';

const uint8_t conf_key0[10] __attribute__((section(".mySection"))) = {'A',};

const uint8_t conf_key1 __attribute__((section(".mySection"))) = 'T';
const uint8_t conf_key2 __attribute__((section(".mySection"))) = 'E';
const uint8_t conf_key3 __attribute__((section(".mySection"))) = 'S';
const uint8_t conf_key4 __attribute__((section(".mySection"))) = 'T';

 

И наивно полагаю, что в такой последовательности они у меня и лягут в секцию, но нет...

Spoiler

                0x0800c5e6                conf_key
                0x0800c5fe                conf_key4
                0x0800c5ff                conf_key3
                0x0800c600                conf_key2
                0x0800c601                conf_key1
                0x0800c602                conf_key0

Там совершенно не очевидный порядок, я конечно понимаю что никто не мешает мне обращаться к ним по имени, но все же, как сделать их расположение в памяти более предсказуемым, друг за другом?

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


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

кажется, что линкер должен иметь возможность раскладывать переменные внутри секции так как он хочет - ну например, для выравнивания, для того, чтобы убрать дырки и не тратить лишнюю память и т.д.

в стародавние времена вроде бы существовал только один способ - это создавать для каждой переменной отдельную секцию и эти секции уже привязывать к адресам

по хорошему потребности в доступе к переменным, ну типа такого *key++ или key[25] - чтобы "доставать" их в каком-то цикле и т.п., не должно быть

 

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


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

54 минуты назад, zWitCh сказал:

Там совершенно не очевидный порядок, я конечно понимаю что никто не мешает мне обращаться к ним по имени, но все же, как сделать их расположение в памяти более предсказуемым, друг за другом?

Можно отсортировать по алфавиту:

{
  KEEP(SORT(*)(.mySection))
}

А вообще, если нужно гарантировать строгий порядок, то поместите переменные в структуру.

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


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

11 hours ago, yes said:

в стародавние времена

Да, так и делаю. Отдельная секция. А куда деваться?

INT2 (rx)     : ORIGIN = 0x08003C14, LENGTH = 4
INT3 (rx)	  : ORIGIN = 0x08003C18, LENGTH = 4
INT4 (rx)	  : ORIGIN = 0x08003C1C, LENGTH = 4

И так же далее раскладываю персонально. Других гарантий прогнозируемого размещения пока не вижу.

 

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


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

4 часа назад, Vlad_G сказал:

Других гарантий прогнозируемого размещения пока не вижу.

Читайте по губам:

15 часов назад, AHTOXA сказал:

если нужно гарантировать строгий порядок, то поместите переменные в структуру.

 

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


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

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

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

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

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

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

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

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

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

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