реклама на сайте
подробности

 
 
> Таблица прерываний у SAM7
Twen
сообщение Feb 21 2012, 08:02
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
aaarrr
сообщение Feb 21 2012, 08:25
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Нужно разделить две вещи:
1. Вектора собственно ядра ARM7TDMI. На них процессор сваливается по событиям reset, swi, abort, irq, fiq. Они всегда начинаются с нулевого адреса.
2. Вектора AIC. Для ядра это не более чем внешняя надстройка. Т.е. AIC дергает линию IRQ или FIQ, ядро попадает на соответствующий свой вектор, а
затем уже при помощи инструкции, расположенной по нужному вектору, может загрузить в PC значение из AIC_IVR.
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 21 2012, 08:53
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 21 2012, 09:00
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



У ядра не один вектор, а 8 (используется 7). Поэтому никакого ветвления и не нужно, по reset процессор попадет на "LDR pc, =resetHandler", по undef на "LDR pc, Undefined_Addr" и т.д.
Почитайте technical reference manual на ARM7TDMI.
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 21 2012, 09:06
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Спасибо, сейчас почитаю, ну уже стало светлее )
Go to the top of the page
 
+Quote Post
Alexey K
сообщение Apr 10 2012, 06:09
Сообщение #6


Участник
*

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



Есть такой вопрос по прерываниям. У меня 2-а прерывания от АЦП и прием UART, возможно еще одно прерывание (мк AT91SAM7S256).
Вложенность прерываний не нужна. Вопрос такой когда я захожу в прерывание я должен запретить все прерывания существующие в системе или достаточно только текущее.
Go to the top of the page
 
+Quote Post
Lotor
сообщение Apr 10 2012, 06:17
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



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

У arm7 аппаратно нет вложенных прерываний, так что мне не совсем понятно, что вы хотите добиться этими запретами.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
Alexey K
сообщение Apr 10 2012, 06:32
Сообщение #8


Участник
*

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



То есть если процессор отрабатывает одно прерывание то пришедшее следом не сработает пока не выйдет из прерывания?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 10 2012, 06:42
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Если вложенные прерывания не нужны, то никаких телодвижений в обработчике делать не нужно. Только записать AIC_EOICR перед выходом.
Go to the top of the page
 
+Quote Post
Alexey K
сообщение Apr 10 2012, 08:41
Сообщение #10


Участник
*

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



Спасибо за помощь. Проверил на железе - работает.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016