Mmc/Sd botloader PIC18F47J53

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Mmc/Sd botloader PIC18F47J53

Сообщение DarkWolf »

Доброго времени суток, котофаны!

Требуется ваша помощь. Пишу Mmc/Sd bootloader для микроконтроллера PIC18F47J53 c 128 Кб flash памяти. Разработка ведется на microPascal. На данный момент есть загрузчик, который записывает во flash контроллера основную программу с указанного адреса, расположенную на SD карте. Загрузчик расположил в конце памяти по адресу 0x1BFF8, сам загрузчик занимает 16384 байта памяти.
Не могу понять с какого адреса мне записывать основную программу и как на нее перейти?
Что делать с прерываниями, ведь их использует и загрузчик и основная программа?


Буду рад любой помощи.
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25295
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Mmc/Sd botloader PIC18F47J53

Сообщение КРАМ »

[uquote="DarkWolf",url="/forum/viewtopic.php?p=3564648#p3564648"]Что делать с прерываниями[/uquote]
Вы не имеете права модифицировать область нулевой страницы стирания флеша (первые 512 инструкций). То есть весь загружаемый код должен быть ниже этой страницы, а обработчики прерываний обязаны ремаппироваться к фиксированному адресу функцию реального обработчика в загружаемом коде.
Проще говоря, в нулевой странице, которая никогда не изменяется, находятся функции обоих векторов прерываний. Эти функции адресуют исполнение в тела реальных обработчиков, которые (тела) и нужно фиксировать по адресу флеша. В бутлоадере это происходит автоматически, поскольку он неизменен, а в загружаемой программе функция обработчика собственно и должна быть прибита гвоздями к фиксированному адресу. Абсолютно тоже самое должно быть с main(). Тело main() должно вызывать единственную функцию в загружаемом коде, которая и фиксируется по адресу флеша.
Реклама
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: Mmc/Sd botloader PIC18F47J53

Сообщение DarkWolf »

Попробывал как вы сказали:
Загрузчик:

Код: Выделить всё

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.
//и в загрузчике и в основной программе прописал конкретные адреса в памяти для обработчика прерываний. В flash данные зашиваются с нужного адреса, проверял считыванием прошивки и анализировал hex файл, но вот почему то ничего не работает. Основная программа не запускается.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25295
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Mmc/Sd botloader PIC18F47J53

Сообщение КРАМ »

Написана какая то ерунда.
На каком основании у Вас два тела обработчика? Вы понимаете как устроена система прерываний у PIC18?
Есть ДВА вектора - 8 и 18. По этим векторам должны находиться либо переходы на тела обработчиков (goto или bra), либо их вызовы (call). Само тело обработчика может быть ТОЛЬКО ОДНО на каждый вектор. Поскольку код бутлоадера неизменен, а код приложения может модифицироваться, то ОСНОВНОЕ тело обработчика обязано быть в нестираемой области. И оттуда по условию (бут или приложение) выходить либо в фиксированный адрес бута, либо в фиксированный адрес приложения.
ЗЫ. Кстати, забыл один нюанс. Кроме самого исходного кода, компилятор вставляет инициализацию переменных. И место размещения этой инициализации определяет линкер. Линкеру нужно указать, чтобы инициализация попала в нестираемую область, иначе при модификации кода развалится привязка адресов - из фиксированной области будет вызываться изменяемый адрес инициализации. При попытке перешить прежним кодом все будет ОК, а при изменениях все развалится.
ЗЗЫ. Еще можно отказаться от прерываний в буте. Это упростит задачу размещения обработчика. Но из-за нулевого ресет вектора при сбое и рестарте контроллера во время перепрошивки, программа станет нерабочей.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Mmc/Sd botloader PIC18F47J53

Сообщение Аlex »

[uquote="DarkWolf",url="/forum/viewtopic.php?p=3564648#p3564648"]Загрузчик расположил в конце памяти по адресу 0x1BFF8[/uquote]
Загрузчик нужно располагать в самом начале, а основную программу после него. И никак иначе.
Такое расположение обусловливается фиксированными векторами прерываний, находящимися в самом начале области флеши. А распределять куда посылать обработчик (в бутлодырь или в основное ПО) должен код загрузчика. Ну а в основном ПО просто смещаете все адреса (делается с помощью линкера).
Реклама
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: Mmc/Sd botloader PIC18F47J53

Сообщение DarkWolf »

Спасибо за помощь, все получилось!
Реклама
Ответить

Вернуться в «PIC»