Перейти к содержанию
    

ПО для перепрошивки 8051

Доброго времени суток!!!

 

"Ну, почему же - не получится... Просто переход по прерыванию".

Вообщето тоже думал об этом. В обработчике прерываний проверять что сейчас работает (bootloader или прикладная программа) и в зависимости от этого прыгать на определенный адрес. Вы это имели ввиду?

 

По поводу работы bootloader'а "по готовности" еще не размышлял вплотную (все таки кажется правильнее с прерываниями). Загвоздки в другом (даже скорее и не загвоздка; просто не думал пока об этом, т.к. привожу в порядок полученную информацию): при загрузке с нулевого адреса будем уходить на bootloader, но тогда этот нулевой адрес (там у нас адрес начала прикладной программы) нужно сохранять в заранее известное место.

 

Стартапы смотрел. В принципе все понятно, но было бы круто, если б кто нибудь закоментил стартап какого либо своего проекта...

Изменено пользователем Goodvin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго времени суток!!!

 

 

Вообщето тоже думал об этом. В обработчике прерываний проверять что сейчас работает (bootloader или прикладная программа) и в зависимости от этого прыгать на определенный адрес. Вы это имели ввиду?

 

По поводу работы bootloader'а "по готовности" еще не размышлял вплотную (все таки кажется правильнее с прерываниями). Загвоздки в другом (даже скорее и не загвоздка; просто не думал пока об этом, т.к. привожу в порядок полученную информацию): при загрузке с нулевого адреса будем уходить на bootloader, но тогда этот нулевой адрес (там у нас адрес начала прикладной программы) нужно сохранять в заранее известное место.

 

Стартапы смотрел. В принципе все понятно, но было бы круто, если б кто нибудь закоментил стартап какого либо своего проекта...

посмотрите,пожалуйста, еще раз внимательно мой первый ответ. Там я как раз и дал стартапы (вернее изменяемые их строки) для бута и основной проги.

 

Работайте в бутлоадере без прерываний, чистыми полингами. Вам об этом и Палыч говорит. Прога для бутлоадера довольно проста, по сути прерывание нужно только от UART. Если боитесь не успеть принимать - выбирайте небольшую скорость обмена. Сам алгоритм сделайте таким, чтобы комп слал только тогда, когда это ему позволяет бутлоадер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В обработчике прерываний проверять что сейчас работает (bootloader или прикладная программа) и в зависимости от этого прыгать на определенный адрес. Вы это имели ввиду?
Да - это. Недостаток такой организации прерываний прикладной программы очевиден: задержка в переходе на процедуру обработки прерывания (для прикладной программы это может оказаться критичным). Еще одно маленькое неудобство - флаг работы бутлоадера/программы нужно где-то хранить, при этом необходимо обеспечить, чтобы этот флаг не разрушался прикладной программой. Т.е. необходимо выделить байт или бит, который бы использовался бутлоадером, но не использовался бы прикладной программой. Наверное, для этих целей можно использовать бит F0 регистра PSW (я не замечал, чтобы Keil этот бит использовал, а выделять для этого место в ОЗУ крайне не желательно - имхо, тяжело будет разделять его между бутлоадером и программой).

Мне все-таки кажется более предпочтительным бутлоадер, размещаемый в конце памяти. Место для адреса начала прикладной программы много не нужно - всего три байта (команда LJMP), которые можно отвести в начале бутлоадера. Бутлоадер, скорее всего, получится несколько больше по объёму за счет сохранения неизменным нулевого вектора на бутлоадер и сохранения (формирования команды перехода) адреса начала прикладной программы. Но при этом прикладная программа не будет тормозиться лишними проверками и переходами, что гораздо ценнее, да и прикладная программа не будет "искорёжена" сдвигом на длину бутлоадера.

 

P.S. Кстати, работу по сохранению вектора 0 и адреса начала прикладной программы можно частично (а, может быть - полностью) перенести на программу, которая будет работать "извне" (на ПЭВМ, с которой "заливается" прикладная программа) и взаимодействовать с бутлоадером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще вариант расположить 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Загвоздки могут быть. Например при работе с SiLabs.

При блокировке области кода от чтения и записи доступ к младшим страницам из старших запрещен (возвращаемый результат неопределен), что вызывает сложности с подсчетом контрольной суммы приложения расположенного ниже чем загрузчик. Лично не проверял, но описанию склонен верить.

в Силабсе из последней страницы есть доступ ко всем: она лочится автоматически при закрытии даже одной нижней.

И ещё: эта страница нестираема из кода. Поэтому бутлоадер лучше располагать в ней, и не использовать в нем процедур из остальной флеши (в том числе прерывания).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...