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

 
 
> Таймер и прерывания, Хочу понять принцип работы
whiteTigr
сообщение Aug 15 2011, 12:21
Сообщение #1


Участник
*

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



Среда разработки: Keil.
Микроконтроллер: lpc2367.

Есть таймер, генерирующий прерывания. Таймер работает по принципу "Отсчитал до нужного MR, прервался и остановился".
Процедура, на которую он прыгает при прерывании переопределяемая.

Код
void InitTimer()
{
  /* Initialize Timer 2 */  
  PCONP |= PCTIM2;

  PCLKSEL1 &= ~(3 << PCLK_TIMER2_OFFSET);
  PCLKSEL1 |=  (1 << PCLK_TIMER2_OFFSET);

  T2PR = 63; // 1 mks  
  T2MR0 = 99; // 100 mks
  T2MCR = 7; // interupt, reset, stop  

  VICIntEnClr = INTTIM2;
  VICVectAddr26 = (unsigned long)Timer2Handler;
  VICVectPriority26 = 10;

  T2TCR = 0x01;

  VICIntEnable += INTTIM2;
}


Код
__irq void Timer2Handler()
{
  if (OnTimerInterupt)
    OnTimerInterupt();  
  
  T2IR = 0x01;
  VICVectAddr = 0;  
}


Код
typedef void (*CallBackFunction)(void);
CallBackFunction OnTimerInterupt = 0;


Допустим, я назначаю на прерывание функцию, которая выполняется около 1мс (пусть будет Func1).
При прерывании в этой функции запускаю этот же таймер, переопределяя OnTimerInterupt на функцию с небольшим временем выполнения (пусть будет Func2), и настраиваю таймер на срабатывание через 100 мкс.

Вопрос: как поведет себя выполняющаяся функция Func1, при следующем прерывании таймера (в котором вызовется Func2)?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
whiteTigr
сообщение Aug 16 2011, 07:28
Сообщение #2


Участник
*

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



Сегодня дошло, что в первом сообщении глупость. В таком порядке прерывания явно не должны вызываться.

Пните пожалуйста в направлении хорошего объяснения механизма работы прерываний (возможно, вложеных). На форуме перечитал много, но общее впечатление от тем осталось в стиле "Я попрыгал с бубном и у меня получилось".
Из даташита на процессор мало что понятно, слишком скупая информация.

UPD: Ну или можно пнуть в направлении книжки по проектированию систем на микропроцессорах.

Сообщение отредактировал whiteTigr - Aug 16 2011, 07:40
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 16 2011, 07:46
Сообщение #3


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

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



Цитата(whiteTigr @ Aug 16 2011, 10:28) *
Сегодня дошло, что в первом сообщении глупость. В таком порядке прерывания явно не должны вызываться.

Пните пожалуйста в направлении хорошего объяснения механизма работы прерываний (возможно, вложеных). На форуме перечитал много, но общее впечатление от тем осталось в стиле "Я попрыгал с бубном и у меня получилось".
Из даташита на процессор мало что понятно, слишком скупая информация.

UPD: Ну или можно пнуть в направлении книжки по проектированию систем на микропроцессорах.



А что конкретно непонятно?
Go to the top of the page
 
+Quote Post
whiteTigr
сообщение Aug 16 2011, 07:52
Сообщение #4


Участник
*

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



Цитата(sergeeff @ Aug 16 2011, 11:46) *
А что конкретно непонятно?


IRQ0 _______/-------
IRQ1 __/--------------

Первым пришло низкоприоритетное прерывание, уже во время этого прерывания приходит высокоприоритетное. Что происходит в этом случае?
а) Прерывается выполнение IRQ1 и начинает выполняться IRQ0?
б) Или сначала завершается обработка IRQ1 и только потом начинает выполняться IRQ0?

Ну и хотелось бы увидеть общие рекомендации по проектированию систем прерываний. Что можно делать, чего категорически нельзя, как желательно? Понимаю, что рано или поздно дойду до этого, но не хотелось бы топтать поле с граблями.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- whiteTigr   Таймер и прерывания   Aug 15 2011, 12:21
- - sergeeff   Вы же ARM'ами заняты? Там всего два прерывания...   Aug 16 2011, 08:50
|- - whiteTigr   Цитата(sergeeff @ Aug 16 2011, 12:50) Вы ...   Aug 16 2011, 09:50
- - sergeeff   Как-то я с VIC'ом не работал, только с AIC...   Aug 16 2011, 10:00
|- - whiteTigr   Цитата(sergeeff @ Aug 16 2011, 14:00) Как...   Aug 16 2011, 10:26
|- - sergeeff   Цитата(whiteTigr @ Aug 16 2011, 13:26) И ...   Aug 16 2011, 11:40
|- - whiteTigr   Цитата(sergeeff @ Aug 16 2011, 15:40) Ну ...   Aug 16 2011, 11:49
|- - toweroff   Цитата(whiteTigr @ Aug 16 2011, 15:49) 20...   Aug 16 2011, 16:22
|- - whiteTigr   Цитата(toweroff @ Aug 16 2011, 20:22) ойо...   Aug 17 2011, 05:04
- - sergeeff   Тогда уж напишите: Кодif (++buffer->addrW...   Aug 17 2011, 06:28
|- - whiteTigr   Цитата(sergeeff @ Aug 17 2011, 10:28) Тог...   Aug 17 2011, 07:09
- - toweroff   если размер буфера равен степени двойки, то вот та...   Aug 17 2011, 08:40
- - whiteTigr   Цитата(toweroff @ Aug 17 2011, 12:40) есл...   Aug 17 2011, 10:06
- - toweroff   Цитата(whiteTigr @ Aug 17 2011, 14:06) Мо...   Aug 17 2011, 10:08
- - whiteTigr   Цитата(toweroff @ Aug 17 2011, 14:08) да ...   Aug 17 2011, 10:43


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

 


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


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