Goodvin26 0 26 октября, 2009 Опубликовано 26 октября, 2009 (изменено) · Жалоба Доброго времени суток!!! "Ну, почему же - не получится... Просто переход по прерыванию". Вообщето тоже думал об этом. В обработчике прерываний проверять что сейчас работает (bootloader или прикладная программа) и в зависимости от этого прыгать на определенный адрес. Вы это имели ввиду? По поводу работы bootloader'а "по готовности" еще не размышлял вплотную (все таки кажется правильнее с прерываниями). Загвоздки в другом (даже скорее и не загвоздка; просто не думал пока об этом, т.к. привожу в порядок полученную информацию): при загрузке с нулевого адреса будем уходить на bootloader, но тогда этот нулевой адрес (там у нас адрес начала прикладной программы) нужно сохранять в заранее известное место. Стартапы смотрел. В принципе все понятно, но было бы круто, если б кто нибудь закоментил стартап какого либо своего проекта... Изменено 26 октября, 2009 пользователем Goodvin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
barabek 0 27 октября, 2009 Опубликовано 27 октября, 2009 · Жалоба Доброго времени суток!!! Вообщето тоже думал об этом. В обработчике прерываний проверять что сейчас работает (bootloader или прикладная программа) и в зависимости от этого прыгать на определенный адрес. Вы это имели ввиду? По поводу работы bootloader'а "по готовности" еще не размышлял вплотную (все таки кажется правильнее с прерываниями). Загвоздки в другом (даже скорее и не загвоздка; просто не думал пока об этом, т.к. привожу в порядок полученную информацию): при загрузке с нулевого адреса будем уходить на bootloader, но тогда этот нулевой адрес (там у нас адрес начала прикладной программы) нужно сохранять в заранее известное место. Стартапы смотрел. В принципе все понятно, но было бы круто, если б кто нибудь закоментил стартап какого либо своего проекта... посмотрите,пожалуйста, еще раз внимательно мой первый ответ. Там я как раз и дал стартапы (вернее изменяемые их строки) для бута и основной проги. Работайте в бутлоадере без прерываний, чистыми полингами. Вам об этом и Палыч говорит. Прога для бутлоадера довольно проста, по сути прерывание нужно только от UART. Если боитесь не успеть принимать - выбирайте небольшую скорость обмена. Сам алгоритм сделайте таким, чтобы комп слал только тогда, когда это ему позволяет бутлоадер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 27 октября, 2009 Опубликовано 27 октября, 2009 · Жалоба В обработчике прерываний проверять что сейчас работает (bootloader или прикладная программа) и в зависимости от этого прыгать на определенный адрес. Вы это имели ввиду?Да - это. Недостаток такой организации прерываний прикладной программы очевиден: задержка в переходе на процедуру обработки прерывания (для прикладной программы это может оказаться критичным). Еще одно маленькое неудобство - флаг работы бутлоадера/программы нужно где-то хранить, при этом необходимо обеспечить, чтобы этот флаг не разрушался прикладной программой. Т.е. необходимо выделить байт или бит, который бы использовался бутлоадером, но не использовался бы прикладной программой. Наверное, для этих целей можно использовать бит F0 регистра PSW (я не замечал, чтобы Keil этот бит использовал, а выделять для этого место в ОЗУ крайне не желательно - имхо, тяжело будет разделять его между бутлоадером и программой). Мне все-таки кажется более предпочтительным бутлоадер, размещаемый в конце памяти. Место для адреса начала прикладной программы много не нужно - всего три байта (команда LJMP), которые можно отвести в начале бутлоадера. Бутлоадер, скорее всего, получится несколько больше по объёму за счет сохранения неизменным нулевого вектора на бутлоадер и сохранения (формирования команды перехода) адреса начала прикладной программы. Но при этом прикладная программа не будет тормозиться лишними проверками и переходами, что гораздо ценнее, да и прикладная программа не будет "искорёжена" сдвигом на длину бутлоадера. P.S. Кстати, работу по сохранению вектора 0 и адреса начала прикладной программы можно частично (а, может быть - полностью) перенести на программу, которая будет работать "извне" (на ПЭВМ, с которой "заливается" прикладная программа) и взаимодействовать с бутлоадером. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 27 октября, 2009 Опубликовано 27 октября, 2009 · Жалоба Еще вариант расположить bootloader в последних адресах. Тогда прикладная программа при прерываниях не будет скакать по адресам, но там другие загвоздки есть. Я правильно уловил логику "колдования" со стартапом? Загвоздки могут быть. Например при работе с SiLabs. При блокировке области кода от чтения и записи доступ к младшим страницам из старших запрещен (возвращаемый результат неопределен), что вызывает сложности с подсчетом контрольной суммы приложения расположенного ниже чем загрузчик. Лично не проверял, но описанию склонен верить. Пример изменений стартапа для ознакомления прилагаю. EXTRN CODE (?C_START) PUBLIC ?C_STARTUP // основные изменения сделаны здесь CSEG AT 0 ?C_STARTUP: LJMP STARTUP1 // ORG 3H Offset SET 800H // адрес основного приложения ISR_JMP 0 // int 0 ISR_JMP 1 // Timer 0 //ISR_JMP 2 // int 1 ISR_JMP 3 // Timer 1 ISR_JMP 4 // uart 0 ISR_JMP 5 // Timer 2 ISR_JMP 6 // spi0 ISR_JMP 7 // SMBus ISR_JMP 8 // ADC 0 ISR_JMP 9 // PCA ISR_JMP 10 // Comarator 0 ISR_JMP 11 // Comarator 0 ISR_JMP 12 // Comarator 1 ISR_JMP 13 // Comarator 1 ISR_JMP 14 // Timer 3 ISR_JMP 15 // ADC 0 ISR_JMP 16 // Timer4 ISR_JMP 17 // ADC2 ISR_JMP 18 // ADC2 ISR_JMP 19 // Reserved ISR_JMP 20 // UART1 CSEG AT 0100h EXTRN CODE(LoadCode) // фиксируем адрес для вызова из основной программы MOV SP,#?STACK-1 // установить стек загрузчика LJMP LoadCode // перейти к выполнению функции RSEG ?C_C51STARTUP STARTUP1: .... // штатные действия ?My_Exit_Func SEGMENT CODE RSEG ?My_Exit_Func PUBLIC exit exit: // вызывается из загрузчика для передачи управления основному приложению MOV SP,#7 // значение стека как при сбросе контроллера LJMP Offset END Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
62256 0 6 ноября, 2009 Опубликовано 6 ноября, 2009 · Жалоба Загвоздки могут быть. Например при работе с SiLabs. При блокировке области кода от чтения и записи доступ к младшим страницам из старших запрещен (возвращаемый результат неопределен), что вызывает сложности с подсчетом контрольной суммы приложения расположенного ниже чем загрузчик. Лично не проверял, но описанию склонен верить. в Силабсе из последней страницы есть доступ ко всем: она лочится автоматически при закрытии даже одной нижней. И ещё: эта страница нестираема из кода. Поэтому бутлоадер лучше располагать в ней, и не использовать в нем процедур из остальной флеши (в том числе прерывания). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться