NewSistems Опубликовано 28 декабря, 2015 Жалоба Поделиться Опубликовано 28 декабря, 2015 Знаю, что тема уже достаточно избитая, но всё равно своим умом не получается решить пробллему с помощью форума, гугла и Cortex-M3 Programming Manual STM32F103C8 Программа пишется для компилятора gcc 4.9 и задача в данном случае разместить таблицу векторов прерываний в массиве, для динамического изменения обработчиков realtime. согласно мануала массив необходимо размещать по четному адресу и с выравниванием до ближайшей степени двойки. Для теста решил просто положить массив в ОЗУ по фиксированному адресу 0x20001000, доработав соответственно скрипт линковщика. Создал новую секцию внутри RAM .vectorsSection 0x20001000 : { KEEP(*(.vectorsSection)) } >RAM Объявил переменную как extern в заголовочном файле и... volatile word __attribute__((section (".vectorsSection"))) _vectors_[64] = {0}; Убедился после сборки что всё лежит где и планировали Цитата arm-none-eabi-nm program.elf | grep _vectors_ 20001000 d _ZL9_vectors_ Теперь собственно копируем таблицу в наш массив void (*new_code_entry)(void); ....... static void remap_vector_table (void) { //VTOR is 0 on startup, so we change VTOR only once if(SCB->VTOR) return; new_code_entry = (void (*)(void))((word)&_vectors_ + sizeof(word) + 1);//Skip SP and jump to Reset memcpy((void*)_vectors_, (void*)SCB->VTOR, sizeof _vectors_); SCB->VTOR = 0x1FFFFF80ul & (word)(&_vectors_); //Set VTOR offset __DSB(); //Complete all memory requests new_code_entry(); //Jump to new code } Из startup файла я создал энумератор с названиями обработчиков для удобства доступа. Убедился под дебаггером, что в массиве все адреса на месте и в том же порядке, что и были (ну мало ли, вдруг рождественское чудо). VTOR содержит после последнего джампа как и положено 4096. Но когда доходит до __enable_irq(); __ISB(); мы зависаем, вот callstack Цитата 5 0x697b617a 4 () 0xfffffff9 3 0x200011f8 2 remap_vector_table() main.cc:31 0x08000cd4 1 main() main.cc:46 0x08000d32 Цитата 200011f4: tickcounter+0 movs r0, r0 200011f6: tickcounter+2 movs r0, r0 200011f8: ; instruction: 0xf0d3e321 tickcounter инкрементируется в SysTick_Handler и он наверняка сработал первым Никак не пойму, что я не доделал. Я не трогал указатель стека - может проблема в этом? Ведь последний адрес возврата так и остался на стеке. Заранее спасибо за помощь Раздел: STM32 Читать дальше Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.