Budek 0 5 октября, 2019 Опубликовано 5 октября, 2019 · Жалоба Здравствуйте! Возникла проблема. Мой проект (STM32L) на сегодняшний день имеет 3 способа обновлять свою прошивку в процессе работы. Сначала обновленная версия помещается во внешнюю M25P, а затем входим непосредственно в процедуру самопрограммирования: запускается мой собственный "программатор" (находящийся в конце flash микроконтроллера по жестко заданному адресу). И вот именно в этот момент может произойти ошибка. Например, стерли очередную страницу flash, а записать (без ошибок) не получается. В конечном счете, пишем как уж получилось (выбора то уже нет) и надеемся, что приложение уж хоть как то будет функционировать. Можно, конечно, в eeprom писать флаг фатальной ошибки, но это не выход из положения (много об этом думал). Остается один вариант - уметь самим приложение посчитать crc "самого себя". Но для этого необходимо знать последний адрес текущей прошивки. И необходимо узнать его именно самим работающим приложением. Вариант "до конца" flash не подходит - все, что выше полезного для приложения адреса может быть рандомно заполнено (остатки чего то предыдущего). Так вот вопрос: как бы узнать приложению, какой у него последний адрес. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 5 октября, 2019 Опубликовано 5 октября, 2019 · Жалоба 2 hours ago, Budek said: все, что выше полезного для приложения адреса может быть рандомно заполнено (остатки чего то предыдущего). Я не знаю какой инструментарий вы используете, но линковщик IAR позволяет заполнить неиспользуемое пространство FLASH заранее заданным значением. Думаю, что подобная фишечка есть и в других инструментах. И поглядите этот документ, снова IAR. Но я им пользуюсь. Думаю, аналогию можно провести и на другие инструменты. Ну, и вообще, всё, что связано с адресами, секциями и их размерами, надо смотреть доку на линковщик. Я думаю, что-то оттуда можно вытянуть. Ну или найти обходным способы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 5 октября, 2019 Опубликовано 5 октября, 2019 · Жалоба 3 часа назад, Budek сказал: Так вот вопрос: как бы узнать приложению, какой у него последний адрес. Почитать мануал на используемый компоновщик -> узнать как в нём задавать компоновку секций программы в регионы памяти - > расположить все секции с кодом и RO-данными программы в один регион -> в конец этого региона поместить некую сигнальную секцию, до которой и будем считать CRC (от начала региона). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 5 октября, 2019 Опубликовано 5 октября, 2019 · Жалоба 3 часа назад, Budek сказал: а затем входим непосредственно в процедуру самопрограммирования: запускается мой собственный "программатор" (находящийся в конце flash микроконтроллера по жестко заданному адресу). Вы поставили лошадь позади телеги. Ваш программатор должен находиться в самом начале, получать управление сразу после включения питания, считать контрольную сумму приложения и решать - можно запускать это приложение или нет. И если нет - проводить какие-то дополнительные действия, чтобы ваше устройство не превратилось в кирпич. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 октября, 2019 Опубликовано 5 октября, 2019 · Жалоба Я написал на C# консольное приложение, которое делает с бинарным файлом прошивки всё необходимое, в том числе дополняет его размером и CRC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 5 октября, 2019 Опубликовано 5 октября, 2019 · Жалоба 47 минут назад, Сергей Борщ сказал: Вы поставили лошадь позади телеги. Согласен на все 100. При старте управление должен получать загрузчик, считать контрольные суммы, обновлять, шифровать, предоставлять экспортируемые функции - тоже его задача. В конце он должен передать управление приложению. Размер приложения лучше сделать фиксированным, а в самом конце держать CRC32. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 2 9 октября, 2019 Опубликовано 9 октября, 2019 · Жалоба Вот здесь я сделал 2 "раздела" во флеш-памяти для хранения всякой всячины. Решается элементарным добавлением своих секций после .data: .myvars : { . = ALIGN(1024); __varsstart = ABSOLUTE(.); KEEP(*(.myvars)); . = . + 2000; . = ALIGN(1024); __varsend = ABSOLUTE(.); } > rom .logs : { . = ALIGN(1024); __logsstart = ABSOLUTE(.); KEEP(*(.logs)) } > rom _ldata = LOADADDR(.data); // кто-нибудь знает, как здесь по-человечески ответ можно писать, без идиотских "кнопочек" и интерактива? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Budek 0 10 октября, 2019 Опубликовано 10 октября, 2019 · Жалоба Спасибо откликнувшимся. Стартовать со своего загрузчика не представляется возможным. Он тогда должен будет размером с само приложение (скачать прошивку с ftp-сервера gsm-модулем - далеко не килобайт кода). Конечно, в этом случае полезные функции загрузчика (например, работа с gsm-модулем) можно использовать и в самом приложении (для экономии flash микроконтроллера). Но тогда они должны быть железно работоспособными. А это нереально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 10 октября, 2019 Опубликовано 10 октября, 2019 · Жалоба 2 часа назад, Budek сказал: Он тогда должен будет размером с само приложение не факт. 2 часа назад, Budek сказал: (скачать прошивку с ftp-сервера gsm-модулем - далеко не килобайт кода). Скачивайте рабочим приложением, а загрузчиком только прошивайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
johnshadow 1 10 октября, 2019 Опубликовано 10 октября, 2019 (изменено) · Жалоба 4 часа назад, jcxz сказал: Скачивайте рабочим приложением, а загрузчиком только прошивайте. Согласен. Я когда-то на gps трекерах автомобильных так и делал - в рабочем приложении скачивалась прошивка на внешнюю spi-flash, а затем перезагрузка. Дальше бутлоадер проверяет наличие прошивки и ее корректность на внешней флешке. Если все в порядке - расшифровывает и заливает в основную флеш. И еще - реализация скачивания\докачки по http оказалась проще (реализовывал и ftp, и http). Изменено 10 октября, 2019 пользователем johnshadow Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться