|
|
  |
Вызов функций из bootloader, IAR AVR |
|
|
|
Feb 16 2017, 06:03
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(sevstels @ Feb 16 2017, 08:20)  Вопрос такой. Если boot-сектор залочен от чтения и записи, выполняются ли из него вызовы из приложения? Что делаю не так? Memory programming / Lock bits Код 1 1 1 No restrictions for SPM or (E)LPM accessing the Boot Loader section. 2 1 0 SPM is not allowed to write to the Boot Loader section. 3 0 0 SPM is not allowed to write to the Boot Loader section, and (E)LPM executing from the Application section is not allowed to read from the Boot Loader section. If interrupt vectors are placed in the Application section, interrupts are disabled while executing from the Boot Loader section. 4 0 1 (E)LPM executing from the Application section is not allowed to read from the Boot Loader section. If interrupt vectors are placed in the Application section, interrupts are disabled while executing from the Boot Loader section. Memory Lock Bits Protection Type Можно предложить обходной путь - выделяется область памяти в ОЗУ под команду загрузчику. Туда пишется команда, ее аргументы и crc, затем процессор перезагружается (скажем по вотчдогу). Загрузчик при старте проверяет, есть ли в этой области команда и выполняет ее
|
|
|
|
|
Feb 16 2017, 07:50
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(sevstels @ Feb 16 2017, 07:20)  2. Создаю в основной программе указатель: void (*flash_page_write)(unsigned short) = (void (*)(unsigned short))0x1F72E; Проверьте адресацию в map-файле. Вполне вероятно, что она байтовая и тогда Вы вызываете функцию по случайному адресу вместо (0x1F72E>>1); Цитата(sevstels @ Feb 16 2017, 08:35)  Но IAR указатель __farflash отказывается принять... как правильно написать не соображу. __far
|
|
|
|
|
Mar 18 2017, 18:00
|

Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716

|
Любая подпрограмма из закрытой области BOOT вызывается без проблем, так и наоборот из обрасти BOOT можно выполнить любую операцию (если она не завязана на прерывания и перенастройку периферии). Векторы прерываний надо переключать, после перехода из BOOT -> MAIN и наоборот. Это ведь для нас код как бы скрыт, для проца данные всегда в читабельном виде. Просто встроенный в процессор загрузчик в зависимости от состояния локбитов выдает нам одно либо другое.
Немного из моей практики. К примеру есть у Вас протокол, по которому Вы обновляете ПО, это будет UART, CAN, или свой какой-то 1-wire, о котором никто никогда и не догадается. Для обновления прошивки не обязательно дергать ресетами, зажимать кнопки, итд. В MAIN пишем обработчик "секретной" посылки, (он же обязан быть и в секции BOOT)! Перешли в бут и работаем с бутом. Аналогично схожей командой и вышли от туда.
Кстати, сам не пользуюсь загрузчиками от ATMEL, пишу свои. Стояла задача работать с областями Flash, EEprom, External i2c. Лень было каждую 24схх в программаторе писать.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|