Jump to content

    

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

Share this post


Link to post
Share on other sites
54 минуты назад, zWitCh сказал:

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

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

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

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

Share this post


Link to post
Share on other sites
11 hours ago, yes said:

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

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

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

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

 

Share this post


Link to post
Share on other sites
4 часа назад, Vlad_G сказал:

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

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

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

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

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now