Требуется ваша помощь. Пишу Mmc/Sd bootloader для микроконтроллера PIC18F47J53 c 128 Кб flash памяти. Разработка ведется на microPascal. На данный момент есть загрузчик, который записывает во flash контроллера основную программу с указанного адреса, расположенную на SD карте. Загрузчик расположил в конце памяти по адресу 0x1BFF8, сам загрузчик занимает 16384 байта памяти. Не могу понять с какого адреса мне записывать основную программу и как на нее перейти? Что делать с прерываниями, ведь их использует и загрузчик и основная программа?
Вы не имеете права модифицировать область нулевой страницы стирания флеша (первые 512 инструкций). То есть весь загружаемый код должен быть ниже этой страницы, а обработчики прерываний обязаны ремаппироваться к фиксированному адресу функцию реального обработчика в загружаемом коде. Проще говоря, в нулевой странице, которая никогда не изменяется, находятся функции обоих векторов прерываний. Эти функции адресуют исполнение в тела реальных обработчиков, которые (тела) и нужно фиксировать по адресу флеша. В бутлоадере это происходит автоматически, поскольку он неизменен, а в загружаемой программе функция обработчика собственно и должна быть прибита гвоздями к фиксированному адресу. Абсолютно тоже самое должно быть с main(). Тело main() должно вызывать единственную функцию в загружаемом коде, которая и фиксируется по адресу флеша.
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 файл, но вот почему то ничего не работает. Основная программа не запускается.
Написана какая то ерунда. На каком основании у Вас два тела обработчика? Вы понимаете как устроена система прерываний у PIC18? Есть ДВА вектора - 8 и 18. По этим векторам должны находиться либо переходы на тела обработчиков (goto или bra), либо их вызовы (call). Само тело обработчика может быть ТОЛЬКО ОДНО на каждый вектор. Поскольку код бутлоадера неизменен, а код приложения может модифицироваться, то ОСНОВНОЕ тело обработчика обязано быть в нестираемой области. И оттуда по условию (бут или приложение) выходить либо в фиксированный адрес бута, либо в фиксированный адрес приложения. ЗЫ. Кстати, забыл один нюанс. Кроме самого исходного кода, компилятор вставляет инициализацию переменных. И место размещения этой инициализации определяет линкер. Линкеру нужно указать, чтобы инициализация попала в нестираемую область, иначе при модификации кода развалится привязка адресов - из фиксированной области будет вызываться изменяемый адрес инициализации. При попытке перешить прежним кодом все будет ОК, а при изменениях все развалится. ЗЗЫ. Еще можно отказаться от прерываний в буте. Это упростит задачу размещения обработчика. Но из-за нулевого ресет вектора при сбое и рестарте контроллера во время перепрошивки, программа станет нерабочей.
Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России.
На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.
Загрузчик расположил в конце памяти по адресу 0x1BFF8
Загрузчик нужно располагать в самом начале, а основную программу после него. И никак иначе. Такое расположение обусловливается фиксированными векторами прерываний, находящимися в самом начале области флеши. А распределять куда посылать обработчик (в бутлодырь или в основное ПО) должен код загрузчика. Ну а в основном ПО просто смещаете все адреса (делается с помощью линкера).
Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO
подробнее>>
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения