zWitCh 0 23 декабря, 2019 Опубликовано 23 декабря, 2019 · Жалоба Выделил под переменные определенную секцию в памяти: 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 Там совершенно не очевидный порядок, я конечно понимаю что никто не мешает мне обращаться к ним по имени, но все же, как сделать их расположение в памяти более предсказуемым, друг за другом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 5 23 декабря, 2019 Опубликовано 23 декабря, 2019 · Жалоба кажется, что линкер должен иметь возможность раскладывать переменные внутри секции так как он хочет - ну например, для выравнивания, для того, чтобы убрать дырки и не тратить лишнюю память и т.д. в стародавние времена вроде бы существовал только один способ - это создавать для каждой переменной отдельную секцию и эти секции уже привязывать к адресам по хорошему потребности в доступе к переменным, ну типа такого *key++ или key[25] - чтобы "доставать" их в каком-то цикле и т.п., не должно быть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 23 декабря, 2019 Опубликовано 23 декабря, 2019 · Жалоба 54 минуты назад, zWitCh сказал: Там совершенно не очевидный порядок, я конечно понимаю что никто не мешает мне обращаться к ним по имени, но все же, как сделать их расположение в памяти более предсказуемым, друг за другом? Можно отсортировать по алфавиту: { KEEP(SORT(*)(.mySection)) } А вообще, если нужно гарантировать строгий порядок, то поместите переменные в структуру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad_G 6 24 декабря, 2019 Опубликовано 24 декабря, 2019 · Жалоба 11 hours ago, yes said: в стародавние времена Да, так и делаю. Отдельная секция. А куда деваться? INT2 (rx) : ORIGIN = 0x08003C14, LENGTH = 4 INT3 (rx) : ORIGIN = 0x08003C18, LENGTH = 4 INT4 (rx) : ORIGIN = 0x08003C1C, LENGTH = 4 И так же далее раскладываю персонально. Других гарантий прогнозируемого размещения пока не вижу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 24 декабря, 2019 Опубликовано 24 декабря, 2019 · Жалоба 4 часа назад, Vlad_G сказал: Других гарантий прогнозируемого размещения пока не вижу. Читайте по губам: 15 часов назад, AHTOXA сказал: если нужно гарантировать строгий порядок, то поместите переменные в структуру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zWitCh 0 24 декабря, 2019 Опубликовано 24 декабря, 2019 · Жалоба коллеги, всем огромное спасибо за подсказки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться