Jump to content

    
Sign in to follow this  
zWitCh

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

Recommended Posts

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

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this