Доброго времени суток, котофаны!
Требуется ваша помощь. Пишу Mmc/Sd bootloader для микроконтроллера PIC18F47J53 c 128 Кб flash памяти. Разработка ведется на microPascal. На данный момент есть загрузчик, который записывает во flash контроллера основную программу с указанного адреса, расположенную на SD карте. Загрузчик расположил в конце памяти по адресу 0x1BFF8, сам загрузчик занимает 16384 байта памяти.
Не могу понять с какого адреса мне записывать основную программу и как на нее перейти?
Что делать с прерываниями, ведь их использует и загрузчик и основная программа?
Буду рад любой помощи.
Mmc/Sd botloader PIC18F47J53
- Реклама
- КРАМ
- Друг Кота
- Сообщения: 25295
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Mmc/Sd botloader PIC18F47J53
[uquote="DarkWolf",url="/forum/viewtopic.php?p=3564648#p3564648"]Что делать с прерываниями[/uquote]
Вы не имеете права модифицировать область нулевой страницы стирания флеша (первые 512 инструкций). То есть весь загружаемый код должен быть ниже этой страницы, а обработчики прерываний обязаны ремаппироваться к фиксированному адресу функцию реального обработчика в загружаемом коде.
Проще говоря, в нулевой странице, которая никогда не изменяется, находятся функции обоих векторов прерываний. Эти функции адресуют исполнение в тела реальных обработчиков, которые (тела) и нужно фиксировать по адресу флеша. В бутлоадере это происходит автоматически, поскольку он неизменен, а в загружаемой программе функция обработчика собственно и должна быть прибита гвоздями к фиксированному адресу. Абсолютно тоже самое должно быть с main(). Тело main() должно вызывать единственную функцию в загружаемом коде, которая и фиксируется по адресу флеша.
Вы не имеете права модифицировать область нулевой страницы стирания флеша (первые 512 инструкций). То есть весь загружаемый код должен быть ниже этой страницы, а обработчики прерываний обязаны ремаппироваться к фиксированному адресу функцию реального обработчика в загружаемом коде.
Проще говоря, в нулевой странице, которая никогда не изменяется, находятся функции обоих векторов прерываний. Эти функции адресуют исполнение в тела реальных обработчиков, которые (тела) и нужно фиксировать по адресу флеша. В бутлоадере это происходит автоматически, поскольку он неизменен, а в загружаемой программе функция обработчика собственно и должна быть прибита гвоздями к фиксированному адресу. Абсолютно тоже самое должно быть с main(). Тело main() должно вызывать единственную функцию в загружаемом коде, которая и фиксируется по адресу флеша.
Re: Mmc/Sd botloader PIC18F47J53
Попробывал как вы сказали:
Загрузчик:
и основная программа:
//и в загрузчике и в основной программе прописал конкретные адреса в памяти для обработчика прерываний. В flash данные зашиваются с нужного адреса, проверял считыванием прошивки и анализировал hex файл, но вот почему то ничего не работает. Основная программа не запускается.
Загрузчик:
Код: Выделить всё
program FL2Pascal;
procedure interrupt(); org 0x43A0;
begin
end;
procedure interrupt_low(); org 0x43D0;
begin
end;
procedure StartGo();
begin
end;
procedure ProgrammGo(); org 0x04400;
begin
end;
if CheckUpdate <> 1 then
begin
StartGo();
end
else
ProgrammGo();
end.Код: Выделить всё
program FL2Pascal;
procedure interrupt(); org 0x43A0;
begin
end;
procedure interrupt_low();org 0x43D0;
begin
end;
procedure Programm();
Label Menu,Menu2,Menu3,Menu4,Main,NastrMSHU,NastrBP,NastrChastota,QuickMenu_Sett,QuickMenu1,QuickMenu,st_bluetooth;
begin
InitMain();
while (1) do
begin
end;
end;
begin org 0x4400; // main
orgall(0x43A0);
Programm();
end.- КРАМ
- Друг Кота
- Сообщения: 25295
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Mmc/Sd botloader PIC18F47J53
Написана какая то ерунда.
На каком основании у Вас два тела обработчика? Вы понимаете как устроена система прерываний у PIC18?
Есть ДВА вектора - 8 и 18. По этим векторам должны находиться либо переходы на тела обработчиков (goto или bra), либо их вызовы (call). Само тело обработчика может быть ТОЛЬКО ОДНО на каждый вектор. Поскольку код бутлоадера неизменен, а код приложения может модифицироваться, то ОСНОВНОЕ тело обработчика обязано быть в нестираемой области. И оттуда по условию (бут или приложение) выходить либо в фиксированный адрес бута, либо в фиксированный адрес приложения.
ЗЫ. Кстати, забыл один нюанс. Кроме самого исходного кода, компилятор вставляет инициализацию переменных. И место размещения этой инициализации определяет линкер. Линкеру нужно указать, чтобы инициализация попала в нестираемую область, иначе при модификации кода развалится привязка адресов - из фиксированной области будет вызываться изменяемый адрес инициализации. При попытке перешить прежним кодом все будет ОК, а при изменениях все развалится.
ЗЗЫ. Еще можно отказаться от прерываний в буте. Это упростит задачу размещения обработчика. Но из-за нулевого ресет вектора при сбое и рестарте контроллера во время перепрошивки, программа станет нерабочей.
На каком основании у Вас два тела обработчика? Вы понимаете как устроена система прерываний у PIC18?
Есть ДВА вектора - 8 и 18. По этим векторам должны находиться либо переходы на тела обработчиков (goto или bra), либо их вызовы (call). Само тело обработчика может быть ТОЛЬКО ОДНО на каждый вектор. Поскольку код бутлоадера неизменен, а код приложения может модифицироваться, то ОСНОВНОЕ тело обработчика обязано быть в нестираемой области. И оттуда по условию (бут или приложение) выходить либо в фиксированный адрес бута, либо в фиксированный адрес приложения.
ЗЫ. Кстати, забыл один нюанс. Кроме самого исходного кода, компилятор вставляет инициализацию переменных. И место размещения этой инициализации определяет линкер. Линкеру нужно указать, чтобы инициализация попала в нестираемую область, иначе при модификации кода развалится привязка адресов - из фиксированной области будет вызываться изменяемый адрес инициализации. При попытке перешить прежним кодом все будет ОК, а при изменениях все развалится.
ЗЗЫ. Еще можно отказаться от прерываний в буте. Это упростит задачу размещения обработчика. Но из-за нулевого ресет вектора при сбое и рестарте контроллера во время перепрошивки, программа станет нерабочей.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Mmc/Sd botloader PIC18F47J53
[uquote="DarkWolf",url="/forum/viewtopic.php?p=3564648#p3564648"]Загрузчик расположил в конце памяти по адресу 0x1BFF8[/uquote]
Загрузчик нужно располагать в самом начале, а основную программу после него. И никак иначе.
Такое расположение обусловливается фиксированными векторами прерываний, находящимися в самом начале области флеши. А распределять куда посылать обработчик (в бутлодырь или в основное ПО) должен код загрузчика. Ну а в основном ПО просто смещаете все адреса (делается с помощью линкера).
Загрузчик нужно располагать в самом начале, а основную программу после него. И никак иначе.
Такое расположение обусловливается фиксированными векторами прерываний, находящимися в самом начале области флеши. А распределять куда посылать обработчик (в бутлодырь или в основное ПО) должен код загрузчика. Ну а в основном ПО просто смещаете все адреса (делается с помощью линкера).
- Реклама
Re: Mmc/Sd botloader PIC18F47J53
Спасибо за помощь, все получилось!


