Димон Безпарольный 3 May 27 Posted May 27 · Report post Написал бутлоадер. Основной прошивке требуется хранение данных в необнуляемой области ОЗУ. Прописал эту область в Скаттере. Без бутлоадера все чудно работало. Сброс не портил данные. Но при применении бутлоадера данные терлись при перезагрузки прошивки. Изменил бутлоадер - прописал в скаттере такую же область и заработало. Память больше не портится при перезагрузки прошивки. Хотел бы узнать - какие тут подводные ками? Так вообще можно делать? Quote Share this post Link to post Share on other sites More sharing options...
AlanDrakes 0 May 28 Posted May 28 · Report post 1. Посмотрите в сторону блока памяти в RTC. Он не обнуляется (и не меняется) штатно без ведома процессора (и в частности, без сброса бита "Отключить защиту бэкап-области". 2. Если хотите хранить данные в отдельной области памяти - укажите в линкер-скрипте её как запрещённую. Скажем, если в чипе 128кБ RAM - измените Linker-скрипт так, чтобы и загрузчик и "приложение" не могли разместить данные в этой области, ограничиваясь, скажем, 120кБ. В этом случае компилятор и линкер не будут устанавливать указатель стэка на последние 8кБ памяти, соответственно, начальная инициализация тоже не тронет эти адреса. (Хотя это не ваш случай, в этом чипе память разделена на сегменты в разных адресах). 3. STM32L47x умеет защиту страниц SRAM2 (0x10000000~0x10007FFF) страницами по 1кБ. RM0351 2.4.2 SRAM1 (0x20000000~0x2001FFFF) при этом доступна на чтение и запись. Quote Share this post Link to post Share on other sites More sharing options...
Димон Безпарольный 3 May 28 Posted May 28 · Report post 1. Backup регистры уже использую, но объем маловат. 2. можно ли (и надо ли?) совместить пункты 2 и 3? Спасибо за ответы они уже помогли мне. Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 5 May 28 Posted May 28 · Report post 13 часов назад, Димон Безпарольный сказал: Так вообще можно делать? Нужно. Quote Share this post Link to post Share on other sites More sharing options...
Димон Безпарольный 3 May 28 Posted May 28 (edited) · Report post 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, но пока не хочу. Edited May 28 by Димон Безпарольный Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 5 May 28 Posted May 28 · Report post 1) отрезать по адресам; 2) не размещать в регионе никаких секций (тем более +RW +ZI). Quote Share this post Link to post Share on other sites More sharing options...
Димон Безпарольный 3 May 28 Posted May 28 (edited) · Report post 2 minutes ago, Arlleex said: отрезать по адресам; Так вроде выше привел скаттер - там адреса явно указаны. Имеется ввиду секция RW_IRAM2 Edited May 28 by Димон Безпарольный Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 5 May 28 Posted May 28 · Report post Ну все, ничего туда компилятор сам не поместит. Quote Share this post Link to post Share on other sites More sharing options...
Димон Безпарольный 3 May 28 Posted May 28 · Report post 30 minutes ago, Arlleex said: Ну все, ничего туда компилятор сам не поместит. Спасибо огромное. Quote Share this post Link to post Share on other sites More sharing options...
AlanDrakes 0 May 29 Posted May 29 · Report post 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 могут пересоздавать файлы конфигурации в процессе сборки. Quote Share this post Link to post Share on other sites More sharing options...