dimka76 60 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба On 11/23/2023 at 8:36 PM, jcxz said: Ну вот - почти повторяет мой пример: Секция ".noinit", но почему-то имеет инициализатор. Но не может быть инициализирована startup-кодом при старте программы. Из-за этого видимо ей был присвоен атрибут RO, и она была помечена как "должна присутствовать в образе прошивки". И добавлена туда. Но вот интересно, что в 10-ой версии GCC сборка идет иначе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MKdemiurg 1 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба Just now, jcxz said: Значит ещё чего-то не хватает. В IAR нужно было бы добавить префикс __no_init. Но в GCC - не знаю. А что скрывается за __attribute__? это спецификатор GCC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 60 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба On 11/23/2023 at 8:39 PM, jcxz said: Значит ещё чего-то не хватает. В IAR нужно было бы добавить префикс __no_init. Но в GCC - не знаю. А что скрывается за __attribute__? __attribute__((section(".noinit"))) uint8_t test; Говорит, чтобы эту переменную поместить в указанную секцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MKdemiurg 1 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба 2 minutes ago, dimka76 said: Но вот интересно, что в 10-ой версии GCC сборка идет иначе. В 10.3.1 В 10.2.1 тоже самое только что проверил Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба 1 минуту назад, MKdemiurg сказал: это спецификатор GCC А если написать как в IAR? с __no_init Должен быть какой-то атрибут, типа __no_init IAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 60 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба On 11/23/2023 at 8:42 PM, jcxz said: А если написать как в IAR? с __no_init GCC таких словей не знает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба Да пофиг на атрибуты секции rwx. Надо линкеру в скрипте сказать, что эту секцию не загружать. В случае с .bss это автоматом, видимо, происходит - компилятор и линкер знают про неё. Для .noinit кроме названия (линкеру пофиг на него должно быть) ничего не говорит, что её надо игнорить. 4 минуты назад, jcxz сказал: А если написать как в IAR? с __no_init Это расширение IAR и только IAR. Для совмесиимости лучше наоборот в iar писать __attribute__. 4 минуты назад, jcxz сказал: Должен быть какой-то атрибут, типа __no_init IAR. В коде нет, в скрипте линкера всё. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 60 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба On 11/23/2023 at 8:41 PM, MKdemiurg said: В 10.3.1 В 10.2.1 тоже самое только что проверил Попробуйте .noinit : { /* place all symbols in input sections that start with .noinit */ KEEP(*(*.noinit*)) } > NOINIT заменить на .noinit (NOLOAD): { /* place all symbols in input sections that start with .noinit */ KEEP(*(*.noinit*)) } > NOINIT Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба 4 минуты назад, VladislavS сказал: Да пофиг на атрибуты. Я выше пример приводил, где видно что изменение только одних атрибутов секции приводит к перемещению секции из региона FLASH в регион RAM. Ни командный файл компоновщика ничего другое не менялись. Так что - не пофиг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MKdemiurg 1 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба Бред какой то 2 minutes ago, VladislavS said: Да пофиг на атрибуты. Надо линкеру в скрипте сказать, что эту секцию не загружать. В случае с .bss это автоматом, видимо, происходит - компилятор и линкер знают про неё. Для .noinit кроме названия (линкеру пофиг на него должно быть) ничего не говорит, что её надо игнорить. Это расширение IAR и только IAR. Для совмесиимости лучше наоборот в iar писать __attribute__. В коде нет, в скрипте линкера всё. не работает ( NO LOAD) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба 1 минуту назад, MKdemiurg сказал: не работает ( NO LOAD) В исходнике ведь наверное есть и другие переменные ".noinit"? Посмотрите как они описаны. И куда попадают по .map. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба Перемещение и выкидывание это разные вещи. Компилятор может rom->ram по разным критериям перекидывать. Ради скорости, например. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 60 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба On 11/23/2023 at 8:49 PM, jcxz said: Я выше пример приводил, где видно что изменение только одних атрибутов секции приводит к перемещению секции из региона FLASH в регион RAM. Ни командный файл компоновщика ничего другое не менялись. Так что - не пофиг. Вы приводили пример для другого компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MKdemiurg 1 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба Извиняюсь (NO LOAD) работает Не ту конфигурацию билдил. Всем большое спасибо. Вообще странно, что это компиляторо зависимое поведение. Получается, что с 10.3 версии в тулчейне прописано, что такое NO INIT Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба 10 минут назад, dimka76 сказал: Вы приводили пример для другого компилятора Дело даже не в компиляторе. На уровне языка можно только предполагать где что будет размещено. А дальше можно чем-то управлять ключами, чем-то скриптом линкера. Всё implementation dependent, так вроде в стандарте языка сказано. 6 минут назад, MKdemiurg сказал: Вообще странно, что это компиляторо зависимое поведение Ничего странного. Стандарт языка не определяет как оно под капотом должно работать. Что-то в gcc поменяли в очередной версии. Бывает. Более того, то что .noinit ведёт себя как обычная непривилегированная секция, в отличии от .bss, очень даже правильно. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться