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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> ПО для перепрошивки 8051, Дайте мудрый совет
Goodvin
сообщение Oct 26 2009, 18:49
Сообщение #16





Группа: Участник
Сообщений: 12
Регистрация: 8-10-09
Из: СПб
Пользователь №: 52 817



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

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

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

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

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

Сообщение отредактировал Goodvin - Oct 26 2009, 18:53
Go to the top of the page
 
+Quote Post
barabek
сообщение Oct 27 2009, 03:38
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(Goodvin @ Oct 27 2009, 05:49) *
Доброго времени суток!!!


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

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

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

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

Работайте в бутлоадере без прерываний, чистыми полингами. Вам об этом и Палыч говорит. Прога для бутлоадера довольно проста, по сути прерывание нужно только от UART. Если боитесь не успеть принимать - выбирайте небольшую скорость обмена. Сам алгоритм сделайте таким, чтобы комп слал только тогда, когда это ему позволяет бутлоадер.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 27 2009, 06:37
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Goodvin @ Oct 26 2009, 21:49) *
В обработчике прерываний проверять что сейчас работает (bootloader или прикладная программа) и в зависимости от этого прыгать на определенный адрес. Вы это имели ввиду?
Да - это. Недостаток такой организации прерываний прикладной программы очевиден: задержка в переходе на процедуру обработки прерывания (для прикладной программы это может оказаться критичным). Еще одно маленькое неудобство - флаг работы бутлоадера/программы нужно где-то хранить, при этом необходимо обеспечить, чтобы этот флаг не разрушался прикладной программой. Т.е. необходимо выделить байт или бит, который бы использовался бутлоадером, но не использовался бы прикладной программой. Наверное, для этих целей можно использовать бит F0 регистра PSW (я не замечал, чтобы Keil этот бит использовал, а выделять для этого место в ОЗУ крайне не желательно - имхо, тяжело будет разделять его между бутлоадером и программой).
Мне все-таки кажется более предпочтительным бутлоадер, размещаемый в конце памяти. Место для адреса начала прикладной программы много не нужно - всего три байта (команда LJMP), которые можно отвести в начале бутлоадера. Бутлоадер, скорее всего, получится несколько больше по объёму за счет сохранения неизменным нулевого вектора на бутлоадер и сохранения (формирования команды перехода) адреса начала прикладной программы. Но при этом прикладная программа не будет тормозиться лишними проверками и переходами, что гораздо ценнее, да и прикладная программа не будет "искорёжена" сдвигом на длину бутлоадера.

P.S. Кстати, работу по сохранению вектора 0 и адреса начала прикладной программы можно частично (а, может быть - полностью) перенести на программу, которая будет работать "извне" (на ПЭВМ, с которой "заливается" прикладная программа) и взаимодействовать с бутлоадером.
Go to the top of the page
 
+Quote Post
редактор
сообщение Oct 27 2009, 07:09
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



Цитата(Goodvin @ Oct 26 2009, 19:24) *
Еще вариант расположить 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


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
62256
сообщение Nov 6 2009, 19:15
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 1-05-06
Из: Одесса
Пользователь №: 16 644



Цитата(редактор @ Oct 27 2009, 09:09) *
Загвоздки могут быть. Например при работе с SiLabs.
При блокировке области кода от чтения и записи доступ к младшим страницам из старших запрещен (возвращаемый результат неопределен), что вызывает сложности с подсчетом контрольной суммы приложения расположенного ниже чем загрузчик. Лично не проверял, но описанию склонен верить.

в Силабсе из последней страницы есть доступ ко всем: она лочится автоматически при закрытии даже одной нижней.
И ещё: эта страница нестираема из кода. Поэтому бутлоадер лучше располагать в ней, и не использовать в нем процедур из остальной флеши (в том числе прерывания).
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 00:38
Рейтинг@Mail.ru


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