Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SAM3S - как лучше перейти на собственный код обновления прошивки?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
OlegHmt
В своё время писалась прошивка устройства с использованием FreeRTOS для AT91SAM7X. Сейчас перехожу на SAM3S и заканчиваю переносить код. Возникла описаная в заголовке проблема.
В предыдущем процесоре, я просто скопировал основной проект, выбросил всё лишнее оставив лишь взаимодействие по USB и несколько команд своего интерфейса чтобы принять новую прошивку и записать её. После этого компилировал код в SRAM, превращал в масив и вставлял в основную прошивку. Когда устройство получало команду изменить прошивку, этот масив банально копировался в ОЗУ и выполнялся переход на начало кода в SRAM, что автоматически запускало процесор в режиме загрузчика прошивки.

В новом процесоре возникает проблема с векторами прерываний - нужно изменить VTOR регистр, но это можно делать только в privileged режиме, куда можно попасть только вызвав обработчик exception, если я правильно понимаю. Сначала у меня была идея, после копирования кода в память, выполнять програмный reset и в resetHandler'е анализировать - если перезапуск вызван програмно, тогда изменять VTOR и переходить на код в ОЗУ опять вызывая reset. Но, похоже, это неправильный путь, так как во время перезапуска регистр смещения векторов обнуляется.
SVC использовать не хочу, так как, этот вектор уже задействован FreeRTOS и ставить в обработчик какие-то проверки и условные переходы не очень хочется.

Пока есть только идея использовать Usage Fault Handler - при старте основной прошивки разрешить его, а после копирования в память загрузчика прошивки, обратиться по невыравненному адресу (или вызвать деление на ноль). А в обработчике установить регистр смещения векторов и в асемблерной вставке выполнить команду перехода на ResetHandler в ОЗУ.

Правильны ли мои намерения? Может есть какой-то другой путь? Хочется сделать, с одной стороны, попроще, а с другой - красиво и "правильно". :-)

Ещё добавлю, что код для SAM3S пишу используя последнюю Аtmel Studio
_Артём_
Цитата(OlegHmt @ Jul 5 2012, 08:20) *
В новом процесоре возникает проблема с векторами прерываний - нужно изменить VTOR регистр, но это можно делать только в privileged режиме, куда можно попасть только вызвав обработчик exception, если я правильно понимаю. Сначала у меня была идея, после копирования кода в память, выполнять програмный reset и в resetHandler'е анализировать - если перезапуск вызван програмно, тогда изменять VTOR и переходить на код в ОЗУ опять вызывая reset. Но, похоже, это неправильный путь, так как во время перезапуска регистр смещения векторов обнуляется.

Как-то странно всё это, может у SAM-ов так по особенному, но они же вроде Cortex-M3.

Цитата(OlegHmt @ Jul 5 2012, 08:20) *
нужно изменить VTOR регистр, но это можно делать только в privileged режиме

Можно в него не входить вообще. Насколько он нужен?

Насколько я понял обычно VTOR меняется в загрузчике на выходе (старт основной программы) и по ходу работы (если нужно).
Можно поменять VTOR после startup основной программы (если в boot-е нет перехода в privileged mode).
Если нужно попасть из основной программы в загрузчик, то можно сделать сброс по запросу (если поддержан и не требует привелегий) или зависанием с ожиданием сброса по WDT.

P.S. Может возможен вариант такой перехода:
Код
uint32_t pc, sp;

sp = *((uint32_t *) 0;
pc = *((uint32_t *) 0x04;

StartResetHandler(sp, pc); // загрузка sp и pc
OlegHmt
Упс. Что-то от жары наверное, я соображать стал плохо. :-)
Всё правильно: скопировал в память, сделал перезапуск, проверил в обработчике был ли перезапуск, если был - установил смещение, перешёл на вектор.

Спасибо
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.