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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Cамопрограммирование flash, ( Запись flash ), bootload, переход из RWW в NRWW, чтение констант из flash
Сергей Борщ
сообщение Nov 24 2008, 13:19
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Nov 25 2008, 10:05
Сообщение #17


Участник
*

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



Цитата(Сергей Борщ @ Nov 24 2008, 16:19) *
Не видя остального кода предполагать трудно, но вы уверены, что тут должно быть PAGE_SIZE - 1?


Да точно. Последний 127 байт пишется в else и там же пишется в память.


Разобрался, при записи мы не успеваем ответить на out-пакет от USB и он его повторяет в следующем байте который мы ловим.

Код
Спасибо, буду знать  :)


Сообщение отредактировал Jhohn - Nov 25 2008, 10:12
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Nov 25 2008, 10:29
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Кстати идея Defunct весьма интересна. Можно её даже развивать.
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Nov 26 2008, 10:22
Сообщение #19


Участник
*

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



Не могу войти в область загрузчика (bootload section) при старте.

Использовал

1)BOOTLOADER_SECTION void main ()


2) устанавливал флаг BOOTRST = 0


Может что-то нужно еще?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 26 2008, 10:28
Сообщение #20


Гуру
******

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



Цитата(Jhohn @ Nov 26 2008, 12:22) *
1)BOOTLOADER_SECTION void main ()
Все остальное (включая вектора) тоже надо разместить в области загрузчика. Правьте скрипт линкера.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Nov 26 2008, 10:41
Сообщение #21


Участник
*

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



Такой дурацкий вопрос: как? вы имеете в виду meikfile ?

Цитата(Сергей Борщ @ Nov 26 2008, 13:41) *
Все остальное (включая вектора)

что имеется в виду?
Могу я загрузится в boot потом сделать проверку и идти в application_1 или application_2 ?

Сообщение отредактировал Jhohn - Nov 26 2008, 10:47
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 26 2008, 11:25
Сообщение #22


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 27 2008, 13:45
Сообщение #23


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(SasaVitebsk @ Nov 25 2008, 12:29) *
Кстати идея defunct весьма интересна. Можно её даже развивать.

Эта идея возникла после того как однажды слетел флеш на одном из устройств, установленном на объекте в "степях мухосранска". После этого случая комплектую внешней EEPROM'кой с копией прошивки. В рабочем состоянии eeprom'ка защищена от записи (WP).

При обновлении - одной перемычкой разрешается бутлоадеру "шить" и снимается WP с eeprom'а.
При установленной перемычке дальше бутлоадера ничего не идет (основная программа не запускается),. В критической ситуации (сбой CRC основного кода) бутлоадер заливает код из eeprom'a автоматически.
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Nov 27 2008, 17:28
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 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
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 27 2008, 22:42
Сообщение #25


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Nov 28 2008, 14:32
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 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 видно, что не добавляет. Теперь все работает, программы меняются a14.gif Спасибо.

Цитата(Сергей Борщ @ Nov 28 2008, 01:42) *
Чтобы не оставалось ненужных копий, почитайте эту ветку. А чтобы компилятор не встраивал функцию goto_application() в main() размещайте их в разных единицах компиляции или примените к ней __attribute__((__noinline__)).


А что копия и вставка сода из одной функции в другую это разные вещи?
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Mar 10 2009, 20:59
Сообщение #27


Участник
*

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



Начну с хорошего все работает и прошивается на atmga 168. Перенес тот же код на atmega 64, и нифига.
Подробно: 128 байт пишет по заданному адресу, если же прошивается более (128 + 16) то пишется в Flash только 16 ! c правильным адресом (start + 128). В чем проблема не пойму, в итоге получается вид: 128 байт (FF), 128 байт (кода), 128 байт (FF)...
Подскажите в какую сторону капать. 1111493779.gif
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 10 2009, 21:15
Сообщение #28


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Jhohn @ Mar 10 2009, 23:59) *
Подскажите в какую сторону капать. 1111493779.gif

Вероятно, в сторону размера страницы, которая у mega64 вдвое больше (256 байтов).
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Mar 11 2009, 04:37
Сообщение #29


Участник
*

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



1111493779.gif блин, так и есть, вылетело из головы cranky.gif
Go to the top of the page
 
+Quote Post

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

 


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


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