|
|
  |
Проблема с Bootloader, не меняется flash память |
|
|
|
Nov 9 2008, 08:11
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 9-11-08
Пользователь №: 41 482

|
Написал в WINAVR bootloader для меги8. По усарту принимаю данные и пишу их в flash (это как должно быть). А в реальность flash не меняется как я не пытался ее изменить. Подскажите, пожалуйста, что я забыл сделать.
// flash заполняю так void BootFlashPage(uint32_t page, uint8_t *buf){ boot_page_erase(page); // стирание страницы boot_spm_busy_wait(); // ждать окончание стирания
for(uint8_t i = 0; i < BootPageSize; i += 2){ uint16_t Data =0;// *buf++; // формирование слова данных Data |=0;// (*buf++) << 8; // формирование слова данных boot_page_fill(page + i, Data); // записать в буфер bootloader-а }
boot_page_write(page); // запись страницы во FLASH boot_spm_busy_wait(); // ждать окончания записи }
после этого пишу boot_rww_enable();
считываю flash программатором и своими глазами вижу, что состояние памяти не изменилось
|
|
|
|
|
Nov 9 2008, 14:51
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 9-11-08
Пользователь №: 41 482

|
Цитата(SysRq @ Nov 9 2008, 14:18)  адрес начала секции загрузчика в datasheet'ах указан в словах, а не байтах Спасибо! Зашивал bootloader не по тому адресу. Исправил и заработало!
|
|
|
|
|
Nov 10 2008, 14:39
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 9-11-08
Пользователь №: 41 482

|
В общем, вопрос указан в теме. Как корректно перейти в секциию загрузки из основной программы (для winavr). Я пробовал 2 варианта: 1. void (*jump_to_boot)(void) = 0x1c00; jump_to_boot(); 2. ( *( void( ** )()) 0x1c00 )(); В первом случае компилятор пишет warning, и в обоих случаях в секцию загрузчика не переходит.
Сообщение отредактировал stapleman - Nov 10 2008, 14:41
|
|
|
|
|
Nov 10 2008, 16:37
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 9-11-08
Пользователь №: 41 482

|
Цитата(SysRq @ Nov 10 2008, 18:54)  Низковато что-то метите.. опять word'ами считаете?  А зачем вызов загрузчика из основной софтины? Обычно делают как раз наоборот, т.к. application вообще не должно знать про bootldr. ну во-первых: на сей раз считаю байтами (0xe00*2=0x1c00, размер загрузчика 512 байт) во-вторых: это нужно потому, модуль требующий прошивки новой программы связан с основным только шиной rs485, и резетить его нет возможности, а программу зашить надо - так как быть иначе? и наконец в-третьих: вы не ответили на мой "основной" вопрос
Сообщение отредактировал stapleman - Nov 10 2008, 16:39
|
|
|
|
|
Nov 10 2008, 17:28
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 9-11-08
Пользователь №: 41 482

|
Цитата(Сергей Борщ @ Nov 10 2008, 19:54)  LDFLAGS += -Wl,--defsym,Loader=0x1С00 Что-то не заработало  . В файле .lst Loader расположен в области UNDEFINED SYMBOLS.
|
|
|
|
|
Nov 10 2008, 18:34
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(stapleman @ Nov 10 2008, 20:28)  В файле .lst Loader расположен в области UNDEFINED SYMBOLS. А куда указывает call в точке вызова Loader? Выкусывайте все лишнее, выкладывайте проект из void main() { Loader(); } с листингами, будем смотреть.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 10 2008, 20:09
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 9-11-08
Пользователь №: 41 482

|
Спасибо, Сергей. Заработало. Как обычно виновата моя чертова невнимательность. В общем ошибка заключалась в следующем: передатчик 485 включается и выключается портом меги. В программе загрузчика я "естественно" забыл инициализировать этот порт и "благодаря" помехам передатчик был открыт. Программа загружалась в меги и начинала выполняться. В ней я порт инициализировал и передатчик закрывался (я что ему зря работать). А при переходе в загрузчик он там не открывался, ответные команды не шли и я думал, что в загрузчик вообще программа не заходит.
В итоге все три способа (включая Ваш) попадания в загрузчик я опробовал, все работают.
|
|
|
|
|
Jan 28 2010, 03:21
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 30-07-08
Пользователь №: 39 306

|
Цитата(stapleman @ Nov 11 2008, 00:09)  В итоге все три способа (включая Ваш) попадания в загрузчик я опробовал, все работают. А не могли бы исходник выложить? А то я тоже с bootloader'ом для меги8 мучаюсь.
Сообщение отредактировал rezident - Jan 28 2010, 13:08
Причина редактирования: Нарушение п.3.4 Правил форума.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|