реклама на сайте
подробности

 
 
> SAM3S - как лучше перейти на собственный код обновления прошивки?
OlegHmt
сообщение Jul 5 2012, 05:20
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 70
Регистрация: 5-12-06
Пользователь №: 23 146



В своё время писалась прошивка устройства с использованием 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, 05:21
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
_Артём_
сообщение Jul 5 2012, 05:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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
Go to the top of the page
 
+Quote Post
OlegHmt
сообщение Jul 5 2012, 10:33
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 70
Регистрация: 5-12-06
Пользователь №: 23 146



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

Спасибо
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 20:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01366 секунд с 7
ELECTRONIX ©2004-2016