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

 
 
> Нужен пример прерывания
_Pavel
сообщение Nov 21 2009, 14:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 17-11-09
Из: Иркутск
Пользователь №: 53 690



В апнотах посмотрел, но осталось много вопросов (голого примера прерывания не нашел). Еще хотел бы еще разобраться с программируемым контроллером клоков.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
_Pavel
сообщение Nov 21 2009, 15:59
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 17-11-09
Из: Иркутск
Пользователь №: 53 690



Забыл камень указать - AT91SAM7X
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 21 2009, 22:56
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



На нашем форуме неоднократно этот вопрос самым подробным образом рассматривался. Что вам не понятно? Какой конкретный пример вы желаете видеть? Чем не устраивают примеры, приведенные Atmel'ом в своих многочисленных примерах? Конкретизируйте!
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 21 2009, 23:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Сообщение модератора.
Корневое сообщение топика нарушает п.2.1в Правил форума и больше походит на флуд. _Pavel, конкретизируйте и сформулируйте Ваши вопросы более тщательно. Когда сформулируете конкретные вопросы, тогда и пишите сюда.
Ну и пользуйтесь поиском по форуму. Примеров тут "вагон и маленькая тележка".
Go to the top of the page
 
+Quote Post
_Pavel
сообщение Nov 22 2009, 04:42
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 17-11-09
Из: Иркутск
Пользователь №: 53 690



Извиняюсь, что совсем абстрактно написал, просто лет 8 не занимался контроллерами. Тогда использовал PIC и 8051, они очень понятные, а сейчас взял АРМ. В поиске посмотрел по ключевому слову "прерывание", но там рассматриваются уже тонкие вопросы.
Пример хотел найти типа - подал на ножку единицу, вызвалось прерывание и зажгло на секунду светодиод.
Глупые вопросы задавать не хотелось бы, с простым примером и с хелпом сам бы разобрался.
Взял пример VirtualCOM, там вроде как есть прерывания. Как я понял вся конфигурация и вектора прерываний задаются в .S файле и по нему возникли вопросы:
CODE

Vectors LDR PC,Reset_Addr
LDR PC,Undef_Addr
LDR PC,SWI_Addr
LDR PC,PAbt_Addr
LDR PC,DAbt_Addr
NOP ; Reserved Vector
; LDR PC,IRQ_Addr
LDR PC,[PC,#-0xF20] ; Vector From AIC_IVR - Так вот непонятно где в программе этот адрес?
; LDR PC,FIQ_Addr
LDR PC,[PC,#-0xF20] ; Vector From AIC_FVR
.........................
Reset_Addr DCD Reset_Handler
Undef_Addr DCD Undef_Handler
SWI_Addr DCD SWI_Handler ;вот эта директива непонятно, что делает?
...........................
Undef_Handler B Undef_Handler
;SWI_Handler B SWI_Handler
PAbt_Handler B PAbt_Handler ;и вот такие бесконечные цыклы непонятно зачем нужны?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 22 2009, 12:12
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



У ARM RISC-система команд, т.е. команда всегда помещается в 32 бита (про Thumb режим пока опустим). Таким образом, если надо в качества операнда указать полный 32-разрядный адрес, приходится использовать обходные решения. В вашем коде вы и имеете такой пример.

Про бесконечный цикл. Можно ведь на прерывания никак не реагировать. Программа просто куда-то улетит при возникновении прерывания с непредсказуемым результатом (может и флеш порушится). А так у вас пример реализации предсказуемой реакции на прерывание по Abort'у (вваливание в бесконечный цикл). Радости (пользы программисту) от такой реализации почти никакой, но хоть ничего плохого не произойдет.
Go to the top of the page
 
+Quote Post
_Pavel
сообщение Nov 22 2009, 13:37
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 17-11-09
Из: Иркутск
Пользователь №: 53 690



Можно еще один глупый вопрос - как связать метку как в этих командах
LDR PC,SWI_Addr
LDR PC,PAbt_Addr
LDR PC,DAbt_Addr
с процедурой в программе? В примере есть чето типа: static __irq void ser_irq_0 (void) { , это то?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 22 2009, 15:33
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(_Pavel @ Nov 22 2009, 16:37) *
Можно еще один глупый вопрос - как связать метку как в этих командах
LDR PC,SWI_Addr
LDR PC,PAbt_Addr
LDR PC,DAbt_Addr
с процедурой в программе? В примере есть чето типа: static __irq void ser_irq_0 (void) { , это то?


Обычно обработка прерываний от устройств производится совместно с контроллером прерываний. Вот ему и надо сообщить адрес вашей процедуры ser_irq_0 (посмотрите примеры на эту тему). А поддержка собственно контроллера прерываний уже у вас обеспечена в таблице прерываний командой LDR PC,[PC,#-0xF20].
Go to the top of the page
 
+Quote Post
_Pavel
сообщение Nov 22 2009, 16:01
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 17-11-09
Из: Иркутск
Пользователь №: 53 690



Спасибо, немного понял, буду с настройкой AIC разбираться
Go to the top of the page
 
+Quote Post
Shaienn
сообщение Nov 25 2009, 12:38
Сообщение #10


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

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



Вот простой пример рабочего прерывания.

Код
#include <AT91SAM7S256.H>                       /* AT91SAMT7S64 definitions  */
#include <lib_AT91SAM7S256.h>
/*
* Main Program
*/
int i;

__irq void isrSYS(void)
{
         unsigned int status = AT91C_BASE_SYS->PITC_PIVR;
         if (i)
         {
             AT91C_BASE_PIOA->PIO_SODR = 1;
             i = 0;
         }
         else
         {
             AT91C_BASE_PIOA->PIO_CODR = 1;
             i = 1;
         }
         AT91C_BASE_AIC->AIC_EOICR = status;
}

int main (void) {
  // Enable the Clock of the PIO
    AT91C_BASE_PIOA->PIO_PER = (1 << AT91C_PIO_PA0);
    AT91C_BASE_PIOA->PIO_OER = 0x00000001;
    AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_PIOA);
    AT91C_BASE_PITC->PITC_PIMR = AT91C_PITC_PITEN|AT91C_PITC_PITIEN|0x0ffff7;
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int)isrSYS;
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] =  6;
    AT91C_BASE_AIC->AIC_IECR = (1UL << AT91C_ID_SYS);
  // Loop forever
  for (;;)

  {
  }
}
Go to the top of the page
 
+Quote Post

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

 


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


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