реклама на сайте
подробности

 
 
> ПО для перепрошивки 8051, Дайте мудрый совет
Jevys
сообщение Sep 23 2009, 10:40
Сообщение #1





Группа: Участник
Сообщений: 6
Регистрация: 26-04-06
Пользователь №: 16 503



Встала задача по созданию программного обеспечения для обновления ПО 8051. Особенностью создаваемого устройства является то, что в процессе эксплуатации может потребоваться неоднократное обновление программного обеспечение. В связи с этим хочу спросить две вещи:
1. Можно ли вообще написать модуль ПО перепрошивки на Си? В проекте стоит опция максимальной оптимизации по размеру кода, при которой Кеil по идее может сам находить похожие куски кода и выделять их в подпрограммы. И тогда код, расположенный в ПО перепрошивки, будет вызывать код, который лежит за пределами области памяти программ перепрошивщика, что недопустимо. Остается только ассемблер?
2. Если все же писать на Си, то как жестко разместить программу перепрошивки с заданного адреса? Например 0xF800. И как это сделать в варианте на ассемблере.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
barabek
сообщение Sep 23 2009, 23:59
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(Jevys @ Sep 23 2009, 20:40) *
Встала задача по созданию программного обеспечения для обновления ПО 8051. Особенностью создаваемого устройства является то, что в процессе эксплуатации может потребоваться неоднократное обновление программного обеспечение. В связи с этим хочу спросить две вещи:
1. Можно ли вообще написать модуль ПО перепрошивки на Си? В проекте стоит опция максимальной оптимизации по размеру кода, при которой Кеil по идее может сам находить похожие куски кода и выделять их в подпрограммы. И тогда код, расположенный в ПО перепрошивки, будет вызывать код, который лежит за пределами области памяти программ перепрошивщика, что недопустимо. Остается только ассемблер?
2. Если все же писать на Си, то как жестко разместить программу перепрошивки с заданного адреса? Например 0xF800. И как это сделать в варианте на ассемблере.

1. Можно, какая разница на чем писать.
2. В кейле project->options for target->bl51 locate. В asm это делается с помощью например ORG или смотрите далее. Найдите ее описание.

Но в общем Вы ничего не написали о том как хотите обновлять прошивку. Если предположить, что Вы хотите по UART присылать новую прошиву и полностью переписывать содержимое внутренней flash-памяти программ, относящейся к основной программе. Следует прочитать "AN-112 UART IN-APPLICATION CODE LOADING EXAMPLES" у silabs. Я делал следующим образом. Создал 2 проекта - основной и bootloader. Основная прога ложится в память начиная, например, с адреса 0x100 (задается установками линкера). Естественно, вектора прерывания находятся по своим местам ниже этой точки. В проекте бутлоадера делаем установки линкера размещать код с выбранного Вами адреса 0xf800. Далее, в оба проекта явно добавляем копии стандартного startup.a51. Далее немного модифицируем эти копии. Для основного проекта:
Код
        PUBLIC    ?C_STARTUP

        CSEG    AT    100h      <-измененный адрес!
?C_STARTUP:    LJMP    STARTUP1

        RSEG    ?C_C51STARTUP

для бутлоадера:
Код
        CSEG    AT    0;делаем переход на нужный адрес 0xf800
      LJMP    0f800h
        CSEG    AT    0f800h; теперь прога начинается с этой позиции
?C_STARTUP:    LJMP    STARTUP1

Теперь при старте начинает выполняться бутлоадер. Если для него работы нет, то он передает управление основной программе вызовом application(); имеющей только прототип void (*application)(void)=(void code *)0x0100;
Основная программа при выполнении получает новую прошиву, размещает ее во внешней памяти, выставляет какой нибудь флаг. После этого сбрасывает контроллер или переходит на выполнение строки по 0-му адресу, бутлоадер видит флаг и начинается ...
Можно и самим бутлоадером получать прошиву. Зависит от Ваших требований. Описывайте подробнее желаемое. Можно и основную прогу начинать по 0-му адресу, а из нее вызывать бутлоадер. Но в моем варианте критическим является переписывание только 0-го сектора. Даже если в процессе перезаписи произошел сбой, пропадание питания или еще что-нибудь, бутлоадер начнет сначала.
Для обоих проектов создаем HEX-файлы и объеденяем их в один, не забывая удалить в одном из них строку окончания файла. Получившийся файл загружаем в камень при первой прошивке.
Ну и еще можно добавить в бутлоадер функции по расшифровке полученного перед записью во флэш и тогда можно прошивки передавать через третьих лиц smile.gif
Go to the top of the page
 
+Quote Post
62256
сообщение Oct 5 2009, 22:04
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 1-05-06
Из: Одесса
Пользователь №: 16 644



Цитата(barabek @ Sep 24 2009, 02:59) *
Можно и самим бутлоадером получать прошиву.

не можно, а даже нужно! Следует исходить из того, что основная часть прошивки может испортиться как угодно. Поэтому для живучести надо стартовать в бутлоадер (для силабсов - в последний сектор), там посчитать контрольную сумму и проверить спецножку контроллера. Если сумма испорчена или ножка зажата в ноль - аварийно ждать прошивку и шить. При нормальной сумме и свободной ноге - переходить на основную программу, оттуда тоже должна быть возможность перейти на перепрошивку - это штатный способ обновления FW.
Еще важный трюк: по адресу 0x0200 следует расположить еще один ljmp на бутлоадер. Для того, чтобы сброс контроллера при стертом первом секторе вывел на аварийную загрузку прошивки. А стереться первый сектор может как штатно (при неоконченной его перешивке), так и случайно по сбою.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jevys   ПО для перепрошивки 8051   Sep 23 2009, 10:40
|- - barabek   Цитата(62256 @ Oct 6 2009, 08:04) не можн...   Oct 15 2009, 12:39
- - Jevys   Обновление ПО представляю так: От компьютера по ст...   Sep 24 2009, 06:04
- - редактор   Я размещаю загрузчик с 0 адреса, тогда он гарантир...   Oct 15 2009, 05:49
- - Goodvin   Доброго времени суток!!! Столкнулся с...   Oct 21 2009, 16:33
|- - Палыч   Цитата(Goodvin @ Oct 21 2009, 19:33) Если...   Oct 22 2009, 09:55
- - Goodvin   Доброго времени суток!!! Вчера попроб...   Oct 22 2009, 20:44
|- - Палыч   Цитата(Goodvin @ Oct 22 2009, 23:44) Уваж...   Oct 23 2009, 05:39
- - редактор   Сместить вектора прерывания в программе не проблем...   Oct 23 2009, 04:49
- - Goodvin   Доброго времени суток!!! А может быть...   Oct 23 2009, 16:16
|- - barabek   Цитата(Goodvin @ Oct 24 2009, 03:16) Добр...   Oct 24 2009, 00:27
- - Goodvin   Доброго времени суток!!! Думаю поступ...   Oct 26 2009, 15:24
|- - Палыч   Цитата(Goodvin @ Oct 26 2009, 18:24) Но п...   Oct 26 2009, 16:20
|- - редактор   Цитата(Goodvin @ Oct 26 2009, 19:24) Еще ...   Oct 27 2009, 07:09
- - Goodvin   Доброго времени суток!!! Цитата...   Oct 26 2009, 18:49
|- - barabek   Цитата(Goodvin @ Oct 27 2009, 05:49) Добр...   Oct 27 2009, 03:38
|- - Палыч   Цитата(Goodvin @ Oct 26 2009, 21:49) В об...   Oct 27 2009, 06:37
- - 62256   Цитата(редактор @ Oct 27 2009, 09:09) Заг...   Nov 6 2009, 19:15


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 17:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01403 секунд с 7
ELECTRONIX ©2004-2016