HARMHARM 0 15 марта, 2009 Опубликовано 15 марта, 2009 · Жалоба Я думал, что если начало прошивки сконфигурировано с адреса 0x2000, то и вектора там же. А как же она работает в обычном режиме? Там же сидит загрузчик как отдельное приложение. Получается для ремапа, мне нужно в начало рамы копирнуть область векторов с 0 флеши и задать ремап? Да, этого достаточно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 15 марта, 2009 Опубликовано 15 марта, 2009 · Жалоба А как же она работает в обычном режиме? Там же сидит загрузчик как отдельное приложение. В векторах программ чаще всего используется IRQ. Если по адресу 0x18 в нулевом секторе (загрузчике) стоит команда LDR PC,[PC,#-0xFF0], то этого достаточно чтобы IRQ прикладной программы нормально действовали. Для FIQ тоже можно сделать похожим образом. Ну а остальные вестора исключительных ситуаций обычно не возникают и для большинства программ не имеют значения. Обычно там вообще стоят заглушки типа зависона. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vesago 0 15 марта, 2009 Опубликовано 15 марта, 2009 · Жалоба Спасибо, все понятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 16 марта, 2009 Опубликовано 16 марта, 2009 · Жалоба на форуме нет внятного описания как работать с IAP, нет рабочего кода, только какие-то танцы с бубном :) пробовал код с форума - то пишет, то не пишет... непонятно почему в самой документации на lpc2148 - только пару строк хотя я все делал как требуется: выключал прерывания вызывал функцию подготовки флеша потом писал туда массив байт из RAM'а выложи свой рабочий код, который пишет и читает внутреннюю FLASH через IAP :) Может вы не ту доку читали? Я пользовался LPC2478, в доке все внятно прописано более менее. Не пара строк. За пару часов запись удалось осуществить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TanT 0 17 марта, 2009 Опубликовано 17 марта, 2009 · Жалоба Вопрос к etoja по поводу записи, точнее верификации. Пишу себе спокойно по IAP, проверяю двумя способами: в лоб по рекомендации KRS и IAPовским сравнением. И нет такого момента, чтобы без ошибок обошлось на 32 кб записи 2-3 ошибки в среднем. Ну это ещё полбеды. Смотрю где ошибка - записанно всё что требуется (покрайней мере в том месте куда указывают функции сравнения). Ладно, думаю, по не опытности накосячил где-нить с указателями и не то сравниваю, однако, прошивка не запускается. Но стоит повторить целиком запись прошивки "поверх" старой, и - о чудо - всё работает и ошибок проверки не возникает. Чем это может быть обоснованно? Как всё таки достоверно сравнивать данные из ОЗУ и флеш? P.S. Записывал массив одинаковых символов, смотрел глазками что вышло, всё в идеале, хотя ошибки всё равно лезут. Прерывания естественно все отключены, даже пробовал модуль акселератора памяти отключать (МАМ), думалось может при обращении к флеш не-то читается - не помогло в общем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 17 марта, 2009 Опубликовано 17 марта, 2009 · Жалоба Вопрос к etoja по поводу записи, точнее верификации. Пишу себе спокойно по IAP, проверяю двумя способами: в лоб по рекомендации KRS и IAPовским сравнением. И нет такого момента, чтобы без ошибок обошлось на 32 кб записи 2-3 ошибки в среднем. Ну это ещё полбеды. Смотрю где ошибка - записанно всё что требуется (покрайней мере в том месте Не ту частоту передаете параметром в IAP. Flash не успевает прописаться надежно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TanT 0 17 марта, 2009 Опубликовано 17 марта, 2009 · Жалоба а вы правы, ar__systems. частота стояла из старого проекта в 4 раза меньше требуемой. Для надёжного прописывания флеш сколько времени требуется - то есть после записи, требуется провести проверку, что же там написанно. Паузы не требуется между записью блока и проверкой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HARMHARM 0 17 марта, 2009 Опубликовано 17 марта, 2009 · Жалоба а вы правы, ar__systems. частота стояла из старого проекта в 4 раза меньше требуемой. Для надёжного прописывания флеш сколько времени требуется - то есть после записи, требуется провести проверку, что же там написанно. Паузы не требуется между записью блока и проверкой? Паузы не требуется. Я вообще проверяю целиком всю записанную информацию - считаю CRC. Ни разу не было проблем с записью (только при пропадании питания мусор естественно). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 17 марта, 2009 Опубликовано 17 марта, 2009 · Жалоба Паузы не требуется между записью блока и проверкой? Не требуются, из IAP возвращается после того как запись полностью произойдет и флешь полностью можно исплоьзовать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Wano 0 3 августа, 2009 Опубликовано 3 августа, 2009 · Жалоба Подскажите всё ли правильно делаю,чтобы зашить в LPC2134 число: 1) в кейле Options for Target задаю два раздела IROM1 от 0х0 до 0x17FFF IROM2 от 0х18000 до 0x20000, тоесть планирую писать в последний сектор,для этого создаю раздел IROM2. 2) в прогу определяю переменную как const unsigned int i __attribute__((at(0x18000))); 3) следующей функцией стираю последний сектор и записываю туда какой-то массив, в первом элементе которого хранится будущее значение i typedef void (*IAP)(unsigned int *in, unsigned int *result); #define iap_entry ((IAP) 0x7FFFFFF1) unsigned int program (unsigned int * data) { unsigned int command[5]; unsigned int result[5]; unsigned int save_VicInt; save_VicInt = VICIntEnable; VICIntEnClr = 0xFFFFFFFF; //запрет прерываний command[0] = 50;//подготовка command[1] = 10; command[2] = 10; iap_entry (command, result); if (result[0])goto exit; command[0] = 52;//стирание command[1] = 10; // начало command[2] = 10;// конец command[3] = 60000;// частота проца iap_entry (command, result); if (result[0])goto exit; command[0] = 50;//подготовка command[1] = 10; command[2] = 10; iap_entry (command, result); if (result[0])goto exit; command[0] = 51;//запись command[1] = (unsigned int) 0x0018000; // куда пишется command[2] = (unsigned int) data;//что пишется command[3] = 256;// число байт command[4] = 60000; iap_entry (command, result); if (result[0])goto exit; exit: VICIntEnable = save_VicInt; return (result[0]); } Проблема состоит в том, что в таком случае на команде стирания проц вылетает в PAbt_Handler. Если не объявлять раздел IROM2,тогда всё нормально проходит,но тогда как проконтролировать не залезет ли прога в область,где предполагается перезапись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorMarx 0 27 августа, 2009 Опубликовано 27 августа, 2009 · Жалоба В векторах программ чаще всего используется IRQ. Если по адресу 0x18 в нулевом секторе (загрузчике) стоит команда LDR PC,[PC,#-0xFF0], то этого достаточно чтобы IRQ прикладной программы нормально действовали. Для FIQ тоже можно сделать похожим образом. Ну а остальные вестора исключительных ситуаций обычно не возникают и для большинства программ не имеют значения. Обычно там вообще стоят заглушки типа зависона. Это отличное решение для IRQ (главное не забыть запрограммировать VICDefVectAddr, иначе при spurious interrupt поимеем переход на нулевой адрес). Но я не уверен что для FIQ такой номер прокатит. Если мне не изменяет память, то инструкция LDR PC,[PC,#-0xFF0] загружает в PC значение, считанное по адресу PC,#-0xFF0, то есть VICVectAddr, и это хорошо подходит для векторных прерываний. FIQ к ним не относится. Могу ошибаться, поправьте, если я не прав (сам не пробовал). Но вряд ли FIQ понадобятся самому бутлоадеру, можно сделать обычный переход в нужную страницу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться