Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Таблица прерываний у SAM7
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Twen
Добрый день. Вот появилось несколько вопросов, буду благодарен если кто-то ответит.
Как я понимаю у SAM7 есть 32 источника прерываний и 8 уровней. Прерывание происходит таким образом, мы настраиваем регистры AIC_SVR1 to AIC_SVR31 - вписываем адреса обработчиков туда, потом, когда наступит прерывание ядро читает регистр AIC_IVR в котором находится адрес текущего прерывания, проц загружает адрес у регистр команд и выполняет прогру...с этом понятно. Не понятно о системных прервываниях, они вроде всегда подк. с источнику 1 из 32, а конкретнее по поводу reset. Его не нужно инициализировать, вроде? Я думал что адрес для reset обработчика забит постоянно у первом адресе пространства программы, например я компилю программу с картой памяти у которой указан начальный адрес 0x0020 2000 , то reset должен быть по адресу 0x0020 2000, по умолчанию, я думал, так как reset это точка входа в программу? Но я откомпилил и посмотрел карту памяти но нет, reset по другому адресу...Что будет находится в первых адресах, а именно в 0x0020 2000, если говорить о ОЗУ?

Вот кусок из карты памяти:
Обработчик по адресу 0x002025f4, а сам resetVector по 0x00202000, что-то я запутался в что такое resetVector - это выходит регистр, в котором записан адрес 0x002025f4 ?

resetHandler 0x002025f4 Code Gb board_cstartup_iar.o [1]
resetVector 0x00202000 Code Gb board_cstartup_iar.o [1]
aaarrr
Нужно разделить две вещи:
1. Вектора собственно ядра ARM7TDMI. На них процессор сваливается по событиям reset, swi, abort, irq, fiq. Они всегда начинаются с нулевого адреса.
2. Вектора AIC. Для ядра это не более чем внешняя надстройка. Т.е. AIC дергает линию IRQ или FIQ, ядро попадает на соответствующий свой вектор, а
затем уже при помощи инструкции, расположенной по нужному вектору, может загрузить в PC значение из AIC_IVR.
Twen
Смотрите , вот начало моего сsturtup-а:


/*
Exception vectors
*/
SECTION .vectors:CODE:NOROOT(2)

PUBLIC resetVector
PUBLIC irqHandler

EXTERN Undefined_Handler
EXTERN SWI_Handler
EXTERN Prefetch_Handler
EXTERN Abort_Handler
EXTERN FIQ_Handler



ARM


//------------------------------------------------------------------------
// Здесь я так понял мы указываем, что размещение будет по
//первому адресу карты памяти
//------------------------------------------------------------------------
__iar_init$$done: ; The interrupt vector is not needed
; until after copy initialization is done

//--------------------------------------------------------------------------------
// Вот здесь не понятно, здесь нету ветвления типо свича,
//начнется первая команда, например мы попадем у
//обработчик по ресету, а потом в случае
//прерыванию системному по неизвестной команде, как мы попадем
// у LDR pc, Undefined_Addr , нету же ветвления, всмыле
// нету такого, типа:
// switch (event) {
//case (reset): LDR pc, =resetHandler ;
//case (undef_adrr): LDR pc, Undefined_Addr ; Undefined instructions
//case (swi): LDR pc, SWI_Addr ; Software interrupt (SWI/SYS)
//}
//----------------------------------------------------------------------------------
resetVector:
; All default exception handlers (except reset) are
; defined as weak symbol definitions.
; If a handler is defined by the application it will take precedence.
LDR pc, =resetHandler ; Reset
LDR pc, Undefined_Addr ; Undefined instructions
LDR pc, SWI_Addr ; Software interrupt (SWI/SYS)
LDR pc, Prefetch_Addr ; Prefetch abort
LDR pc, Abort_Addr ; Data abort
B . ; RESERVED
LDR pc, =irqHandler ; IRQ
LDR pc, FIQ_Addr ; FIQ


//--------------------------------------------------------------------------------------
// Вот здесь я так понял идет объявление адресов векторов самого проц.
//по этой метке хранится адрес обработчика
//Команда DCD загружает в память адрес обработчика
//---------------------------------------------------------------------------------------
Undefined_Addr: DCD Undefined_Handler
SWI_Addr: DCD SWI_Handler
Prefetch_Addr: DCD Prefetch_Handler
Abort_Addr: DCD Abort_Handler
FIQ_Addr: DCD FIQ_Handler
aaarrr
У ядра не один вектор, а 8 (используется 7). Поэтому никакого ветвления и не нужно, по reset процессор попадет на "LDR pc, =resetHandler", по undef на "LDR pc, Undefined_Addr" и т.д.
Почитайте technical reference manual на ARM7TDMI.
Twen
Спасибо, сейчас почитаю, ну уже стало светлее )
Alexey K
Есть такой вопрос по прерываниям. У меня 2-а прерывания от АЦП и прием UART, возможно еще одно прерывание (мк AT91SAM7S256).
Вложенность прерываний не нужна. Вопрос такой когда я захожу в прерывание я должен запретить все прерывания существующие в системе или достаточно только текущее.
Lotor
Цитата(Alexey K @ Apr 10 2012, 10:09) *
Вопрос такой когда я захожу в прерывание я должен запретить все прерывания существующие в системе или достаточно только текущее.

У arm7 аппаратно нет вложенных прерываний, так что мне не совсем понятно, что вы хотите добиться этими запретами.
Alexey K
То есть если процессор отрабатывает одно прерывание то пришедшее следом не сработает пока не выйдет из прерывания?
aaarrr
Если вложенные прерывания не нужны, то никаких телодвижений в обработчике делать не нужно. Только записать AIC_EOICR перед выходом.
Alexey K
Спасибо за помощь. Проверил на железе - работает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.