Димон Безпарольный 2 27 мая, 2022 Опубликовано 27 мая, 2022 · Жалоба Написал бутлоадер. Основной прошивке требуется хранение данных в необнуляемой области ОЗУ. Прописал эту область в Скаттере. Без бутлоадера все чудно работало. Сброс не портил данные. Но при применении бутлоадера данные терлись при перезагрузки прошивки. Изменил бутлоадер - прописал в скаттере такую же область и заработало. Память больше не портится при перезагрузки прошивки. Хотел бы узнать - какие тут подводные ками? Так вообще можно делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlanDrakes 1 28 мая, 2022 Опубликовано 28 мая, 2022 · Жалоба 1. Посмотрите в сторону блока памяти в RTC. Он не обнуляется (и не меняется) штатно без ведома процессора (и в частности, без сброса бита "Отключить защиту бэкап-области". 2. Если хотите хранить данные в отдельной области памяти - укажите в линкер-скрипте её как запрещённую. Скажем, если в чипе 128кБ RAM - измените Linker-скрипт так, чтобы и загрузчик и "приложение" не могли разместить данные в этой области, ограничиваясь, скажем, 120кБ. В этом случае компилятор и линкер не будут устанавливать указатель стэка на последние 8кБ памяти, соответственно, начальная инициализация тоже не тронет эти адреса. (Хотя это не ваш случай, в этом чипе память разделена на сегменты в разных адресах). 3. STM32L47x умеет защиту страниц SRAM2 (0x10000000~0x10007FFF) страницами по 1кБ. RM0351 2.4.2 SRAM1 (0x20000000~0x2001FFFF) при этом доступна на чтение и запись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 28 мая, 2022 Опубликовано 28 мая, 2022 · Жалоба 1. Backup регистры уже использую, но объем маловат. 2. можно ли (и надо ли?) совместить пункты 2 и 3? Спасибо за ответы они уже помогли мне. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 28 мая, 2022 Опубликовано 28 мая, 2022 · Жалоба 13 часов назад, Димон Безпарольный сказал: Так вообще можно делать? Нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 28 мая, 2022 Опубликовано 28 мая, 2022 (изменено) · Жалоба 4 hours ago, AlanDrakes said: Если хотите хранить данные в отдельной области памяти - укажите в линкер-скрипте её как запрещённую. В итоге вот что получилось: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00100000 { ; load region size_region ER_IROM1 0x08000000 0x00100000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00018000 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x10000000 UNINIT 0x0000400 { ;no init section *(.noinit )} RW_IRAM3 0x10000400 0x00008000 - 0x3FF { .ANY (+RW +ZI) } } Но ключа для линкера чтобы пометить область как неиспользуемую пока не нашел. Судя по MAP файлу, линкер отдает предпочтение области IRAM1 располагая там переменные. Область IRAM3 не используется линкером. Могу прописать явно модули в IRAM3, но пока не хочу. Изменено 28 мая, 2022 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 28 мая, 2022 Опубликовано 28 мая, 2022 · Жалоба 1) отрезать по адресам; 2) не размещать в регионе никаких секций (тем более +RW +ZI). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 28 мая, 2022 Опубликовано 28 мая, 2022 (изменено) · Жалоба 2 minutes ago, Arlleex said: отрезать по адресам; Так вроде выше привел скаттер - там адреса явно указаны. Имеется ввиду секция RW_IRAM2 Изменено 28 мая, 2022 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 28 мая, 2022 Опубликовано 28 мая, 2022 · Жалоба Ну все, ничего туда компилятор сам не поместит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 28 мая, 2022 Опубликовано 28 мая, 2022 · Жалоба 30 minutes ago, Arlleex said: Ну все, ничего туда компилятор сам не поместит. Спасибо огромное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlanDrakes 1 29 мая, 2022 Опубликовано 29 мая, 2022 · Жалоба 19 часов назад, Димон Безпарольный сказал: В итоге вот что получилось: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00100000 { ; load region size_region ER_IROM1 0x08000000 0x00100000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00018000 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x10000000 UNINIT 0x0000400 { ;no init section *(.noinit )} RW_IRAM3 0x10000400 0x00008000 - 0x3FF { .ANY (+RW +ZI) } } Но ключа для линкера чтобы пометить область как неиспользуемую пока не нашел Удалите из этого файла секции RW_IRAM2, RW_IRAM3 и линкер просто не будет знать о их существовании. Во всяком случае, так работает с arm-none-eabi-ld (кросс-компилятор для STM32* из-под линуха). Некоторые IDE могут пересоздавать файлы конфигурации в процессе сборки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться