Перейти к содержанию
bbh_blocked_dnftl

Dx Portal Vtor Регистр И Перемещение Таблицы В Озу


Рекомендуемые сообщения

Знаю, что тема уже достаточно избитая, но всё равно своим умом не получается решить пробллему с помощью форума, гугла и 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

 

Читать дальше

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...