В своё время писалась прошивка устройства с использованием FreeRTOS для AT91SAM7X. Сейчас перехожу на SAM3S и заканчиваю переносить код. Возникла описаная в заголовке проблема.
В предыдущем процесоре, я просто скопировал основной проект, выбросил всё лишнее оставив лишь взаимодействие по USB и несколько команд своего интерфейса чтобы принять новую прошивку и записать её. После этого компилировал код в SRAM, превращал в масив и вставлял в основную прошивку. Когда устройство получало команду изменить прошивку, этот масив банально копировался в ОЗУ и выполнялся переход на начало кода в SRAM, что автоматически запускало процесор в режиме загрузчика прошивки.
В новом процесоре возникает проблема с векторами прерываний - нужно изменить VTOR регистр, но это можно делать только в privileged режиме, куда можно попасть только вызвав обработчик exception, если я правильно понимаю. Сначала у меня была идея, после копирования кода в память, выполнять програмный reset и в resetHandler'е анализировать - если перезапуск вызван програмно, тогда изменять VTOR и переходить на код в ОЗУ опять вызывая reset. Но, похоже, это неправильный путь, так как во время перезапуска регистр смещения векторов обнуляется.
SVC использовать не хочу, так как, этот вектор уже задействован FreeRTOS и ставить в обработчик какие-то проверки и условные переходы не очень хочется.
Пока есть только идея использовать Usage Fault Handler - при старте основной прошивки разрешить его, а после копирования в память загрузчика прошивки, обратиться по невыравненному адресу (или вызвать деление на ноль). А в обработчике установить регистр смещения векторов и в асемблерной вставке выполнить команду перехода на ResetHandler в ОЗУ.
Правильны ли мои намерения? Может есть какой-то другой путь? Хочется сделать, с одной стороны, попроще, а с другой - красиво и "правильно". :-)
Ещё добавлю, что код для SAM3S пишу используя последнюю Аtmel Studio