|
Cамопрограммирование flash, ( Запись flash ), bootload, переход из RWW в NRWW, чтение констант из flash |
|
|
|
Nov 24 2008, 13:19
|

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

|
Цитата(Jhohn @ Nov 24 2008, 13:21)  ////////////////////////////////////////////////////////////////////////////////////////////////////// .........usb_in_ram[val] = USBBuffer[5]; И что только люди не делают, только бы не использовать специально заточенные тэги оформления кода (кнопка '#' на форме ввода сообщения). Подключите UART контроллера к СОМ-порту компьютера и вместо библиотечный функций записи подставьте свои, которые вместо записи будут сливать информацию в UART в текстовом виде. Информации можно послать достаточно для поиска проблемы. Можно печатать адреса, данные, содержимое памяти, все, что угодно. Цитата(Jhohn @ Nov 24 2008, 13:21)  Код if (val < PAGE_SIZE - 1) Не видя остального кода предполагать трудно, но вы уверены, что тут должно быть PAGE_SIZE - 1?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 25 2008, 10:05
|
Участник

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

|
Цитата(Сергей Борщ @ Nov 24 2008, 16:19)  Не видя остального кода предполагать трудно, но вы уверены, что тут должно быть PAGE_SIZE - 1? Да точно. Последний 127 байт пишется в else и там же пишется в память. Разобрался, при записи мы не успеваем ответить на out-пакет от USB и он его повторяет в следующем байте который мы ловим. Код Спасибо, буду знать :)
Сообщение отредактировал Jhohn - Nov 25 2008, 10:12
|
|
|
|
|
Nov 26 2008, 10:22
|
Участник

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

|
Не могу войти в область загрузчика (bootload section) при старте.
Использовал
1)BOOTLOADER_SECTION void main ()
2) устанавливал флаг BOOTRST = 0
Может что-то нужно еще?
|
|
|
|
|
Nov 26 2008, 10:41
|
Участник

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

|
Такой дурацкий вопрос: как? вы имеете в виду meikfile ? Цитата(Сергей Борщ @ Nov 26 2008, 13:41)  Все остальное (включая вектора) что имеется в виду? Могу я загрузится в boot потом сделать проверку и идти в application_1 или application_2 ?
Сообщение отредактировал Jhohn - Nov 26 2008, 10:47
|
|
|
|
|
Nov 26 2008, 11:25
|

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

|
Цитата(Jhohn @ Nov 26 2008, 12:41)  Такой дурацкий вопрос: как? вы имеете в виду meikfile ? Нет. Скрипт линкера. Если у вас в makefile скрипт явно не указан через LDFLAGS += -Wl,-T,имя_скрипта, то avr-ld берет подходящий для вашего кристалла из WinAVR/AVR/LIB/LDSCRIPTS. Самый простой способ определить, какой именно - переименуйте всю папку, линкер ругнется на конкретный файл, переименуйте папку обратно. Потом берите этот файл, копируйте в свой проект (можно переименовать, чтобы не путаться), добавляйте LDFLAGS += -Wl,-T,имя_скрипта в нужное место makefile или -Wl,-T,имя_скрипта на вкладку опций линкера в AVRStudio, идите в WinAVR/DOC/binutils/ld, читайте о формате скрипт-файла и правьте его как вам надо. Результаты хорошо видны в файле дизассемблера. У меня он генерится примерно так (отрывки makefile): Код ## Build all: create_dirs $(PROJECT).elf $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss size
%.lss: $(PROJECT).elf $(OBJDUMP) -hdSC $< > $@ Цитата(Jhohn @ Nov 26 2008, 12:41)  Могу я загрузится в boot потом сделать проверку и идти в application_1 или application_2 ? Конечно.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 27 2008, 17:28
|
Участник

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

|
Как всегда о неудачах: Цитата(Сергей Борщ @ Nov 26 2008, 14:25)  Нет. Скрипт линкера. Если у вас в makefile скрипт явно не указан через LDFLAGS += -Wl,-T,имя_скрипта, то avr-ld берет подходящий для вашего кристалла из WinAVR/AVR/LIB/LDSCRIPTS. Самый простой способ определить, какой именно - переименуйте всю папку, линкер ругнется на конкретный файл, переименуйте папку обратно. Потом берите этот файл, копируйте в свой проект (можно переименовать, чтобы не путаться), добавляйте LDFLAGS += -Wl,-T,имя_скрипта в нужное место makefile или -Wl,-T,имя_скрипта на вкладку опций линкера в AVRStudio, идите в WinAVR/DOC/binutils/ld, читайте о формате скрипт-файла и правьте его как вам надо. Нашел файл "avr5.x" почитал указанные скрипты но так и не разобрался с указанным файлом, при разборе много вынес полезного. Я подумал хорошенько и решил не Рестартиться в boot, а загрузаться в usb_application, соответстенно, проверку того какая программа выполняется делаю в main() ( usb_application ) Код [code]USB_SECTION // 0x2800 void main (void) {
if(CHECKBIT(PINC,2)) // usb_section -> + 5 V { // инициализация for(;;) {
} } else // application_section -> 0 V { // инициализация for(;;) { goto_application(); } } } Необходимо загрузится по адресу application_section ( 0x0200), после самопрограммирования, но не получается. Я создал функцию goto_application(); которая начинается с адреса = 0x0200, а пишу я в flash по этому же адресу. Возможно одна из причин следующая: Код APPLICATION_SECTION //0x0200 void goto_application(void) { LED_ON; LED_ON; // Три LED_ON LED_ON; } Если в теле фукцнии goto_application() написалть 3-и оператора, то получаем память программ вида Код ... :1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :10020000[b]5E9A5E9A5E9A[/b]0895FFFFFFFFFFFFFFFF71 :10021000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE ... :1034200090915B01982F882790935B0180935A01BC :1034300020915A0130915B0180916F0190E0822BC5 :10344000932B90935B0180935A0120916A018091A4 :103450005A0190915B01F999FECF92BD81BD20BDCB :10346000FA9AF99A74CADF91CF911F910895CF9378 :10347000DF93329B16C023E02093690081E08DBB6F :1034800080E48AB980E58AB980E18BB98CE691E065 :10349000D92FC82F86E2809333012093340178948A :10[b]34A0[/b]00FFCF80E48AB9[b]5E9A5E9A5E9A[/b]FCCFFFFFF6 :1034B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C ... main() 0x0000346e то есть код повторяетсяЕсли в теле фукцнии goto_application() написалть 5-ть операторов, то получаем память программ с пятью повторяющимися содами в двух секцияхЕсли в теле фукцнии goto_application() написалть 20-ть операторов, то получаем память программ видаКод ... :1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :10020000[b]5E9A5E9A5E9A5E9A5E9A5E9A5E9A5E9A2E :100210005E9A5E9A5E9A5E9A5E9A5E9A5E9A5E9A1E :100220005E9A5E9A5E9A5E9A[/b]0895FFFFFFFFFFFF57 :10023000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE ... :10344000932B90935B0180935A0120916A018091A4 :103450005A0190915B01F999FECF92BD81BD20BDCB :10346000FA9AF99A74CADF91CF911F910895CF9378 :10347000DF93329B16C023E02093690081E08DBB6F :1034800080E48AB980E58AB980E18BB98CE691E065 :10349000D92FC82F86E2809333012093340178948A :10[b]34A0[/b]00FFCF80E48AB90E940001FDCFFFFFFFFF3C :1034B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :1034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C ... повторяющихся 5E9A не видноНЕ ПОЙМУ почем функция main() изменяется так странно то добавляет, код код другой секции, то нет... Может я что-то я что-то делаю не так? память соответственно 3 оператора, 5 и 20 в файлах
Прикрепленные файлы
3_led.txt ( 45.01 килобайт )
Кол-во скачиваний: 50
5_led.txt ( 45.01 килобайт )
Кол-во скачиваний: 42
20_led.txt ( 45.01 килобайт )
Кол-во скачиваний: 44
|
|
|
|
|
Nov 27 2008, 22:42
|

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

|
Цитата(Jhohn @ Nov 27 2008, 19:28)  Я подумал хорошенько и решил не Рестартиться в boot, а загрузаться в usb_application, соответстенно, проверку того какая программа выполняется делаю в main() ( usb_application ) Можно и так, но что произойдет, если приложения нет или обновление оборвалось на середине? Обычно в задачу загрузчика входит проверка контрольной суммы приложения и передача ему управления лишь в том случае, если контрольная сумма совпала, т.е. приложение работоспособно. Цитата(Jhohn @ Nov 27 2008, 19:28)  НЕ ПОЙМУ почем функция main() изменяется так странно то добавляет, код код другой секции, то нет... Может я что-то я что-то делаю не так? поробуйте сделать так: avr-objdump -hdSC file.elf > listing.lss file.elf - .elf-файл вашей программы. В listing.lss увидите дизассемблированный текст. По этому тексту видно, что "то добавляет" - это компилятор встроил тело вашей функции в точку вызова. Ну и оставил еще одну копию на случай, если вы захотите вызвать ее из другого файла. "То нет"- это когда тело вашей функции такого размера, что вызвать функцию уже выгоднее по размеру, чем встроить ее. Чтобы не оставалось ненужных копий, почитайте эту ветку. А чтобы компилятор не встраивал функцию goto_application() в main() размещайте их в разных единицах компиляции или примените к ней __attribute__((__noinline__)). Последнее более правильно, ибо компиляторы начали поддерживать многофайловую оптимизацию и начиная с какой-то версии научатся встраивать функции и из других единиц компиляции.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 28 2008, 14:32
|
Участник

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

|
Цитата(Сергей Борщ @ Nov 28 2008, 01:42)  поробуйте сделать так: avr-objdump -hdSC file.elf > listing.lss file.elf - .elf-файл вашей программы. В listing.lss увидите дизассемблированный текст. Да при добавлении Код __attribute__((__noinline__)) goto_application(void) по файлу *.lss видно, что не добавляет. Теперь все работает, программы меняются  Спасибо. Цитата(Сергей Борщ @ Nov 28 2008, 01:42)  Чтобы не оставалось ненужных копий, почитайте эту ветку. А чтобы компилятор не встраивал функцию goto_application() в main() размещайте их в разных единицах компиляции или примените к ней __attribute__((__noinline__)). А что копия и вставка сода из одной функции в другую это разные вещи?
|
|
|
|
|
Mar 10 2009, 20:59
|
Участник

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

|
Начну с хорошего все работает и прошивается на atmga 168. Перенес тот же код на atmega 64, и нифига. Подробно: 128 байт пишет по заданному адресу, если же прошивается более (128 + 16) то пишется в Flash только 16 ! c правильным адресом (start + 128). В чем проблема не пойму, в итоге получается вид: 128 байт (FF), 128 байт (кода), 128 байт (FF)... Подскажите в какую сторону капать.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|