Перейти к содержанию
    

STM32 узнать последний адрес приложения во flash из самого приложения

Здравствуйте! Возникла проблема.
Мой проект (STM32L) на сегодняшний день имеет 3 способа обновлять свою прошивку в процессе работы.
Сначала обновленная версия помещается во внешнюю M25P, а затем входим непосредственно в процедуру самопрограммирования:
запускается мой собственный "программатор" (находящийся в конце flash микроконтроллера по жестко заданному адресу).
И вот именно в этот момент может произойти ошибка. Например, стерли очередную страницу flash, а записать (без ошибок) не получается.
В конечном счете, пишем как уж получилось (выбора то уже нет) и надеемся, что приложение уж хоть как то будет функционировать.
Можно, конечно, в eeprom писать флаг фатальной ошибки, но это не выход из положения (много об этом думал).
Остается один вариант - уметь самим приложение посчитать crc "самого себя". Но для этого необходимо знать последний адрес текущей прошивки.
И необходимо узнать его именно самим работающим приложением. Вариант "до конца" flash не подходит - все, что выше полезного для приложения адреса может быть рандомно заполнено (остатки чего то предыдущего).
Так вот вопрос: как бы узнать приложению, какой у него последний адрес. 
Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Budek said:

все, что выше полезного для приложения адреса может быть рандомно заполнено (остатки чего то предыдущего).

Я не знаю какой инструментарий вы используете, но линковщик IAR позволяет заполнить неиспользуемое пространство FLASH заранее заданным значением. Думаю, что подобная фишечка есть и в других инструментах.

И поглядите этот документ, снова IAR. Но я им пользуюсь. Думаю, аналогию можно провести и на другие инструменты.

Ну, и вообще, всё, что связано с адресами, секциями и их размерами, надо смотреть доку на линковщик. Я думаю, что-то оттуда можно вытянуть. Ну или найти обходным способы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Budek сказал:

Так вот вопрос: как бы узнать приложению, какой у него последний адрес. 

Почитать мануал на используемый компоновщик -> узнать как в нём задавать компоновку секций программы в регионы памяти - > расположить все секции с кодом и RO-данными программы в один регион -> в конец этого региона поместить некую сигнальную секцию, до которой и будем считать CRC (от начала региона).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Budek сказал:

а затем входим непосредственно в процедуру самопрограммирования:
запускается мой собственный "программатор" (находящийся в конце flash микроконтроллера по жестко заданному адресу).

Вы поставили лошадь позади телеги. Ваш программатор должен находиться в самом начале, получать управление сразу после включения питания, считать контрольную сумму приложения и решать - можно запускать это приложение или нет. И если нет - проводить какие-то дополнительные действия, чтобы ваше устройство не превратилось в кирпич.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я написал на C# консольное приложение, которое делает с бинарным файлом прошивки всё необходимое, в том числе дополняет его размером и CRC. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

47 минут назад, Сергей Борщ сказал:

Вы поставили лошадь позади телеги.

Согласен на все 100.

При старте управление должен получать загрузчик, считать контрольные суммы, обновлять, шифровать, предоставлять экспортируемые функции - тоже его задача.

В конце он должен передать управление приложению. Размер приложения лучше сделать фиксированным, а в самом конце держать CRC32.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот здесь я сделал 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);

// кто-нибудь знает, как здесь по-человечески ответ можно писать, без идиотских "кнопочек" и интерактива?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо откликнувшимся.

Стартовать со своего загрузчика не представляется возможным. Он тогда должен будет размером с само приложение (скачать прошивку с ftp-сервера gsm-модулем - далеко не килобайт кода). 
Конечно, в этом случае полезные функции загрузчика (например, работа с gsm-модулем) можно использовать и в самом приложении (для экономии flash микроконтроллера).
Но тогда они должны быть железно работоспособными. А это нереально.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Budek сказал:

Он тогда должен будет размером с само приложение

не факт.

2 часа назад, Budek сказал:

(скачать прошивку с ftp-сервера gsm-модулем - далеко не килобайт кода). 

Скачивайте рабочим приложением, а загрузчиком только прошивайте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, jcxz сказал:

Скачивайте рабочим приложением, а загрузчиком только прошивайте. 

Согласен. Я когда-то на gps трекерах автомобильных так и делал - в рабочем приложении скачивалась прошивка на внешнюю spi-flash, а затем перезагрузка. Дальше бутлоадер проверяет наличие прошивки и ее корректность на внешней флешке. Если все в порядке - расшифровывает и заливает в основную флеш. И еще - реализация скачивания\докачки по http оказалась проще (реализовывал и ftp, и http).

Изменено пользователем johnshadow

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...