Миландр
https://forum.milandr.ru/

Перенос векторо прерываний
https://forum.milandr.ru/viewtopic.php?f=38&t=3779
Страница 1 из 1

Автор:  erik [ 2017-окт-24 13:08 ]
Заголовок сообщения:  Перенос векторо прерываний

В ВЕ3
в кортексе 3 есть VTOR
а в кортексе 1-м там reserved на этом месте
Возможно или нет?

Автор:  prostoRoman [ 2017-окт-24 15:17 ]
Заголовок сообщения:  Re: Перенос векторо прерываний

нет.
НО есть другие способы:
1. пристроить внешнюю ПЗУ/ОЗУ с векторами и переключаться на неё (отдельный вопрос корректного переключения "на ходу");
2. для каждого (используемого) прерывания сделать обработчик, который будет переходить по указателю на ф-цию, расположенному в ОЗУ (в виде таблицы или по произвольному адресу -- вопрос реализации).

Можно что-то в духе: всю таблицу векторов прерываний забить указателем на defaultHandler, а в нём переходить по указателям из таблицы в ОЗУ
void empty(void) {}
void (*handlers[64])() = { 
empty,
Reset_Handler,              ; Reset Handler
NMI_Handler,                ; NMI Handler
HardFault_Handler,          ; Hard Fault Handler
MemManage_Handler,          ; MPU Fault Handler
BusFault_Handler,           ; Bus Fault Handler
UsageFault_Handler,         ; Usage Fault Handler
empty,
empty,
empty,
empty,
SVC_Handler,                ; SVCall Handler
DebugMon_Handler,           ; Debug Monitor Handler
empty,
PendSV_Handler,             ; PendSV Handler
SysTick_Handler,            ; SysTick Handler
MIL-STD-1553B2_Handler, 
MIL-STD-1553B1_Handler, 
....
}
void defaultHandler(void)
{
(*handlers[__get_IPSR()])();
}
придётся только обойти нюанс с Reset_Handler'ом... Например
if(__get_IPSR() == 1) {
(*Reset_Handler)();
} else {
(*handlers[__get_IPSR()])();
}
возможны и другие подводные камни - надо пробовать...

Страница 1 из 1 Часовой пояс: UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/