Jump to content

    
Sign in to follow this  
Budek

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

Recommended Posts

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

Share this post


Link to post
Share on other sites
2 hours ago, Budek said:

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

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

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

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

Share this post


Link to post
Share on other sites
3 часа назад, Budek сказал:

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

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

Share this post


Link to post
Share on other sites
3 часа назад, Budek сказал:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
47 минут назад, Сергей Борщ сказал:

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
2 часа назад, Budek сказал:

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

не факт.

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

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

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

Share this post


Link to post
Share on other sites
4 часа назад, jcxz сказал:

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

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

Edited by johnshadow

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this