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

 
 
> Обработка прерывания от SPI, at91sam7s256
Bulat
сообщение Mar 30 2007, 09:53
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



1. Какому источнику прерывания в регистре AIC_IECR (PID2, 3, 4,...) соответствует прерывание от SPI?
2. Вектор прерывания ARM находится по адресу 0х18. Можно по этому адресу записать команду, типа goto "метка", а метку уже поставить рядом с функцией обработки прерывания, ну и таким образом вызвать функцию обработки прерывания? Ну даже если делать как написано в документации, т.е. производить чтение AIC_IVR, то как именно по адресу 0х18 записать нужную команду. Я понимаю так:

adr[int()]=0x18; //задаем адрес ф-ии int()
void int()
{
goto 1;
}
1: void irq() //функция обрабоки прерывания
{
...
}

Только оператор adr[] IAR не воспринимает.
3. Как по другому задать адрес функции?
Если можно то напишите свой вариант кода на С.
Заранее благодарен!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Mar 30 2007, 12:39
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Bulat @ Mar 30 2007, 08:53) *
Если можно то напишите свой вариант кода на С.
Вот тут посмотрите. Как раз описывал несколько возможных вариантов.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Bulat
сообщение Apr 6 2007, 07:47
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Цитата(Сергей Борщ @ Mar 30 2007, 14:39) *
Вот тут посмотрите. Как раз описывал несколько возможных вариантов.

Спасибо за ссылку!
Посмотрев подход №2 у меня возникло несколько вопросов.

Цитата
2) Делается одна функция-обработчик в которой делается сохранение/восстановление регистров и из этой функции вызываются обработчики, которые представляют из себя обычные функции. Функция-обработчик "подвешивается" на вектор исключения стандартными средствами компилятора:
#pragma vector = 0x0000018
__irq __arm void IRQ_Switch() {
(void (*)(void))(AT91C_BASE_AIC->AT91C_AIC_IVR)();
AT91C_BASE_AIC->AIC_EOICR = 0;
}


void Handler1() {
...........
}
void Handler2() {
...........
}


1)
Цитата
(void (*)(void))(AT91C_BASE_AIC->AT91C_AIC_IVR)();

Что означает (void (*)void))? У меня и компилятор ошибку выдает: expected a field name.
Можно подробнее описать этот момент.
2) Получается в конце функции
Цитата
void Handler1() { ...........}
не надо обнулять
AIC_EOICR?
Заранее благодарен!
3) Функция Handler1() соответствует источнику прерывания PID1?

Сообщение отредактировал Bulat - Apr 6 2007, 08:17
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Apr 6 2007, 09:34
Сообщение #4


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Цитата(Bulat @ Apr 6 2007, 08:47) *
1)
Что означает (void (*)void))? У меня и компилятор ошибку выдает: expected a field name.
Можно подробнее описать этот момент.


приведение к типу "указатель на функцию получающую void и возвращающую void" А ругается может потому что скобочку пропустили (void (*)( void))

Цитата(Bulat @ Apr 6 2007, 08:47) *
2) Получается в конце функции не надо обнулять
AIC_EOICR?


Если обработчик прерывания общий то не стоит.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post



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

 


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


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