Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с записью вектора прерывания
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Bulat
Я пытаюсь проинициализировать обработчик прерывания
Код
#pragma vector = 0x0000018
__irq __arm void IRQ_Switch() {
(void (*)(void))(regAIC->AIC_IVR);
AT91C_BASE_AIC->AIC_EOICR = 0;
}

AT91C_BASE_AIC->AIC_IECR[AT91C_ID_UDP] = 1;
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_UDP] = irq_USB();//Запись адреса обработчика прерывания


Основной вопрос по последней строчки кода.
Строку "AT91C_BASE_AIC->AIC_SVR[AT91C_ID_UDP] = irq_USB();" компилятор воспринимает как присвоение регистру AIC_SVR[AT91C_ID_UDP] значение, возвращаемое функцией irq_USB()! А ведь в AIC_SVR[AT91C_ID_UDP] должен записываться адрес функции irq_USB()! Или я что-то неправильно делаю?
И второй вопрос. Он касается предпоследней строки кода "AT91C_BASE_AIC->AIC_IECR[AT91C_ID_UDP] = 1;" Это я пытаюсь разрешить прерывание от UDP. Правильно?
Заранее благодарен!
Сергей Борщ
Правильно будет (void (*)(void))(regAIC->AIC_IVR)(); т.е. приведение числа к типу "указатель на функцию" и вызов функции по этому указателю
и AT91C_BASE_AIC->AIC_SVR[AT91C_ID_UDP] = (unsigned int)irq_USB; т.е. приведение указателя на функцию к типу unsigned int
Bulat
Когда я написал как вы сказали - (void (*)(void))(AT91C_BASE_AIC->AIC_IVR)();
Т.е. добавил пустые скобки, компилятор, ссылаясь на строку "(void (*)(void))(AT91C_BASE_AIC->AIC_IVR)();" выдал ошибку:
Error[Pe109]: expression must have (pointer-to-) function type

Еще компилятор ругается на строку "AT91C_BASE_AIC->AIC_IECR[AT91C_ID_UDP] = 1;"
Выдает ошибку, ссылаясь на эту строку:
Error[Pe142]: expression must have pointer-to-object type
Сергей Борщ
Цитата(Bulat @ Nov 15 2007, 14:47) *
выдал ошибку:
Error[Pe109]: expression must have (pointer-to-) function type
Угу, я в скобках запутался: ( (void(*)()) AT91C_BASE_AIC->AIC_IVR )();
Цитата(Bulat @ Nov 15 2007, 14:47) *
Выдает ошибку, ссылаясь на эту строку:
Error[Pe142]: expression must have pointer-to-object type
Угу. IECR это один регистр, а не масив. Эту плюху в вашем коде я тоже пропустил: AT91C_BASE_AIC->AIC_IECR |= (1<<AT91C_ID_UDP);
Bulat
Спасибо большое! Все заработало)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.