Перейти к содержанию
    

Я думал, что если начало прошивки сконфигурировано с адреса 0x2000, то и вектора там же. А как же она работает в обычном режиме? Там же сидит загрузчик как отдельное приложение. Получается для ремапа, мне нужно в начало рамы копирнуть область векторов с 0 флеши и задать ремап?

Да, этого достаточно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как же она работает в обычном режиме? Там же сидит загрузчик как отдельное приложение.

В векторах программ чаще всего используется IRQ. Если по адресу 0x18 в нулевом секторе (загрузчике) стоит команда LDR PC,[PC,#-0xFF0], то этого достаточно чтобы IRQ прикладной программы нормально действовали. Для FIQ тоже можно сделать похожим образом. Ну а остальные вестора исключительных ситуаций обычно не возникают и для большинства программ не имеют значения. Обычно там вообще стоят заглушки типа зависона.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на форуме нет внятного описания как работать с IAP, нет рабочего кода, только какие-то танцы с бубном :)

пробовал код с форума - то пишет, то не пишет... непонятно почему

в самой документации на lpc2148 - только пару строк

хотя я все делал как требуется:

выключал прерывания

вызывал функцию подготовки флеша

потом писал туда массив байт из RAM'а

выложи свой рабочий код, который пишет и читает внутреннюю FLASH через IAP :)

Может вы не ту доку читали? Я пользовался LPC2478, в доке все внятно прописано более менее. Не пара строк. За пару часов запись удалось осуществить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос к etoja по поводу записи, точнее верификации.

Пишу себе спокойно по IAP, проверяю двумя способами: в лоб по рекомендации KRS и IAPовским сравнением. И нет такого момента, чтобы без ошибок обошлось на 32 кб записи 2-3 ошибки в среднем. Ну это ещё полбеды. Смотрю где ошибка - записанно всё что требуется (покрайней мере в том месте куда указывают функции сравнения). Ладно, думаю, по не опытности накосячил где-нить с указателями и не то сравниваю, однако, прошивка не запускается. Но стоит повторить целиком запись прошивки "поверх" старой, и - о чудо - всё работает и ошибок проверки не возникает. Чем это может быть обоснованно? Как всё таки достоверно сравнивать данные из ОЗУ и флеш?

 

P.S. Записывал массив одинаковых символов, смотрел глазками что вышло, всё в идеале, хотя ошибки всё равно лезут.

Прерывания естественно все отключены, даже пробовал модуль акселератора памяти отключать (МАМ), думалось может при обращении к флеш не-то читается - не помогло в общем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос к etoja по поводу записи, точнее верификации.

Пишу себе спокойно по IAP, проверяю двумя способами: в лоб по рекомендации KRS и IAPовским сравнением. И нет такого момента, чтобы без ошибок обошлось на 32 кб записи 2-3 ошибки в среднем. Ну это ещё полбеды. Смотрю где ошибка - записанно всё что требуется (покрайней мере в том месте

Не ту частоту передаете параметром в IAP. Flash не успевает прописаться надежно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а вы правы, ar__systems. частота стояла из старого проекта в 4 раза меньше требуемой.

Для надёжного прописывания флеш сколько времени требуется - то есть после записи, требуется провести проверку, что же там написанно. Паузы не требуется между записью блока и проверкой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а вы правы, ar__systems. частота стояла из старого проекта в 4 раза меньше требуемой.

Для надёжного прописывания флеш сколько времени требуется - то есть после записи, требуется провести проверку, что же там написанно. Паузы не требуется между записью блока и проверкой?

Паузы не требуется. Я вообще проверяю целиком всю записанную информацию - считаю CRC. Ни разу не было проблем с записью (только при пропадании питания мусор естественно).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Паузы не требуется между записью блока и проверкой?

Не требуются, из IAP возвращается после того как запись полностью произойдет и флешь полностью можно исплоьзовать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите всё ли правильно делаю,чтобы зашить в 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,тогда всё нормально проходит,но тогда как проконтролировать не залезет ли прога в область,где предполагается перезапись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В векторах программ чаще всего используется IRQ. Если по адресу 0x18 в нулевом секторе (загрузчике) стоит команда LDR PC,[PC,#-0xFF0], то этого достаточно чтобы IRQ прикладной программы нормально действовали. Для FIQ тоже можно сделать похожим образом. Ну а остальные вестора исключительных ситуаций обычно не возникают и для большинства программ не имеют значения. Обычно там вообще стоят заглушки типа зависона.

 

Это отличное решение для IRQ (главное не забыть запрограммировать VICDefVectAddr, иначе при spurious interrupt поимеем переход на нулевой адрес). Но я не уверен что для FIQ такой номер прокатит. Если мне не изменяет память, то инструкция LDR PC,[PC,#-0xFF0] загружает в PC значение, считанное по адресу PC,#-0xFF0, то есть VICVectAddr, и это хорошо подходит для векторных прерываний. FIQ к ним не относится. Могу ошибаться, поправьте, если я не прав (сам не пробовал). Но вряд ли FIQ понадобятся самому бутлоадеру, можно сделать обычный переход в нужную страницу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...