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

 
 
> вопрос по работе с тремя прерываниями одинакового приоритета,, которые могут возникнуть одновременно. at91sam7s
Bulat
сообщение Nov 23 2009, 12:49
Сообщение #1


Местный
***

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



по прерыванию от порта PIO считываются последовательные данные, то есть при каждом прерывании считывается один бит:
Код
__ramfunc void irq_Receive()
{
  PauseTimerBase->TC_CCR = AT91C_TC_CLKEN;  
  PauseTimerBase->TC_CCR = AT91C_TC_SWTRG;                                    

  source = regs->PIOA_PDSR&0x600;
    
  if(source==0x200) {recA = recA>>1;  i_shA++; recA = recA|0x80000000;} //A1
  if(source==0x400) {recA = recA>>1;  i_shA++; recA = recA&0x7FFFFFFF;}  //B1
  
   dummy = AT91C_BASE_PIOA->PIO_ISR;    
}

при этом перезапускается таймер, который остчитывает паузу между принимаемыми словами. как только пришла пауза, таймер срабатывает и по прерыванию:
Код
__ramfunc void pause_timer_irq()
{
  if(i_shA==32)
  {
    recDA[kA] = recA; kA++;    
  }  
  if(kA==12)  send_to_host();  
  i_shA=0;
  dummy = PauseTimerBase->TC_SR;  
}

записывает данные в некий буфер.
но помимо этого одновременно может идти передача данных по прерываниюот другого таймера, работающего в режиме генератора:
Код
__ramfunc void timer0_irq_handler()
{  
  ii--;                                                                         //счетчик переданных бит
  if(ii==1) {MipsTimerBase->TC_CCR = AT91C_TC_CLKDIS;}
  MipsTimerBase->TC_RA = 30; MipsTimerBase->TC_RB = MipsTimerBase->TC_RC = 60;
  if(datA&0x80000000) regA = 0x20000;
  else regA = 0x0;
  regs->PIOA_ODSR = regA|front;      
  datA = datA<<1;
  dummy = MipsTimerBase->TC_SR;
  
}

Передача и прием идут с частотой 100 кГц. Приоритеты всех прерываний 7, то есть по идее они должны выполняться по очереди. Но при этом обработчик таймера паузы должен успеть все сделать до прихода следующего слова.
Передача и прием по отдельности работают нормально, без сбоев. Но при их одновременной работе прием не нарушается, а передача происходит с ошибками и в дальнейшем вовсе останавливается. Поэтому я и решил оптимизировать обработчики прерываний.
Для начала я решил все обработчики поместить в RAM, но тут столкнулся с интересной особенностью, если обработчик приемника void irq_Receive() не помещать в ОЗУ, то прием идет очень медленно, не успевает. Но, если обработчик передатчика void timer0_irq_handler() поместить в ОЗУ, то при одновременной работе приемника и передатчика (замыкание выхода передатчика на вход приемника) данные вообще не передаются, а если не помещать в ОЗУ то немного данных передаются. Как правильно размещать обработчики прерываний в ОЗУ и значительно ли это ускоряет работу?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Bulat   вопрос по работе с тремя прерываниями одинакового приоритета,   Nov 23 2009, 12:49
- - GetSmart   А где код, который вызывает все эти обработчики? У...   Nov 23 2009, 15:23
|- - Bulat   Цитата(GetSmart @ Nov 23 2009, 20:23) А г...   Nov 24 2009, 04:44
- - GetSmart   Ну понятно. Значит ни входа/выхода в прерывание не...   Nov 24 2009, 07:15
|- - Bulat   Цитата(GetSmart @ Nov 24 2009, 12:15) Ну ...   Nov 24 2009, 08:10
|- - GetSmart   Цитата(Bulat @ Nov 24 2009, 14:10) или ещ...   Nov 24 2009, 09:39
|- - Bulat   Цитата(GetSmart @ Nov 24 2009, 14:39) Име...   Nov 24 2009, 11:20
|- - aaarrr   Цитата(Bulat @ Nov 24 2009, 14:20) А поче...   Nov 24 2009, 12:01
|- - Bulat   Цитата(aaarrr @ Nov 24 2009, 17:01) Потом...   Nov 24 2009, 12:18
|- - aaarrr   Цитата(Bulat @ Nov 24 2009, 15:18) Значит...   Nov 24 2009, 12:30
|- - Bulat   Цитата(aaarrr @ Nov 24 2009, 17:30) Прави...   Nov 24 2009, 12:44
|- - aaarrr   Цитата(Bulat @ Nov 24 2009, 15:44) то ест...   Nov 24 2009, 13:02
|- - Bulat   Цитата(aaarrr @ Nov 24 2009, 18:02) Главн...   Nov 24 2009, 13:11
|- - aaarrr   Цитата(Bulat @ Nov 24 2009, 16:11) Но вед...   Nov 24 2009, 13:27
|- - Bulat   Цитата(aaarrr @ Nov 24 2009, 18:27) И зач...   Nov 24 2009, 14:00
|- - aaarrr   Цитата(Bulat @ Nov 24 2009, 17:00) -Когда...   Nov 24 2009, 15:02
|- - Bulat   Цитата(aaarrr @ Nov 24 2009, 20:02) Вот с...   Nov 25 2009, 12:02
|- - aaarrr   Цитата(Bulat @ Nov 25 2009, 15:02) Таймер...   Nov 25 2009, 12:12
|- - Bulat   Цитата(aaarrr @ Nov 25 2009, 17:12) И что...   Nov 25 2009, 12:45
|- - aaarrr   Цитата(Bulat @ Nov 25 2009, 15:45) потому...   Nov 25 2009, 14:08
- - aaarrr   Тип преобразуйте: КодAT91F_AIC_ConfigureIt ( A...   Nov 24 2009, 09:43


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

 


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


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