|
Таблица прерываний у SAM7 |
|
|
|
Feb 21 2012, 08:02
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543

|
Добрый день. Вот появилось несколько вопросов, буду благодарен если кто-то ответит. Как я понимаю у 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]
Сообщение отредактировал Twen - Feb 21 2012, 08:10
|
|
|
|
|
 |
Ответов
(1 - 9)
|
Feb 21 2012, 08:53
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543

|
Смотрите , вот начало моего с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
|
|
|
|
|
Apr 10 2012, 06:09
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 14-07-11
Пользователь №: 66 220

|
Есть такой вопрос по прерываниям. У меня 2-а прерывания от АЦП и прием UART, возможно еще одно прерывание (мк AT91SAM7S256). Вложенность прерываний не нужна. Вопрос такой когда я захожу в прерывание я должен запретить все прерывания существующие в системе или достаточно только текущее.
|
|
|
|
|
Apr 10 2012, 06:17
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(Alexey K @ Apr 10 2012, 10:09)  Вопрос такой когда я захожу в прерывание я должен запретить все прерывания существующие в системе или достаточно только текущее. У arm7 аппаратно нет вложенных прерываний, так что мне не совсем понятно, что вы хотите добиться этими запретами.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Apr 10 2012, 06:32
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 14-07-11
Пользователь №: 66 220

|
То есть если процессор отрабатывает одно прерывание то пришедшее следом не сработает пока не выйдет из прерывания?
|
|
|
|
|
Apr 10 2012, 08:41
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 14-07-11
Пользователь №: 66 220

|
Спасибо за помощь. Проверил на железе - работает.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|