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

 
 
> вопрос по работе с тремя прерываниями одинакового приоритета,, которые могут возникнуть одновременно. 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
 
Start new topic
Ответов
GetSmart
сообщение Nov 23 2009, 15:23
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



А где код, который вызывает все эти обработчики? У них общий хэндлер?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Bulat
сообщение Nov 24 2009, 04:44
Сообщение #3


Местный
***

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



Цитата(GetSmart @ Nov 23 2009, 20:23) *
А где код, который вызывает все эти обработчики? У них общий хэндлер?

Структура программы следующая:
Код
//Обработчик прерывания таймера 1 - контроллер паузы между принимаемыми словами
__ramfunc void pause_timer_irq()
{
  - запись принятого 32-битного слова в буфер;
}

//Прием последовательности бит по прерыванию от порта PIO
__ramfunc void irq_Receive()
{
   - запуск таймера 1, контролирующего паузу;
   - прием последовательности бит по прерыванию от порта PIO
}

//Передача последовательности бит по прерыванию от таймера 0
__ramfunc void timer0_irq_handler()
{  
  ii--;  //счетчик переданных бит
  ...
}

//Команда на передачу данных
void Write_TRA()
{
   - подготовка данных для передачи по послед каналу;
   - запуск таймера-генератора 0, с пом. которого передаются данные;
   while(ii!=0); //ожидание обнуления счетчика переданных бит (32)
}

void main()
{
   - конфигурирование обработчиков прерывания;
   while(1)  { чтение принятых команд от хоста}
}

Прием и передача идут одновременно с частотой 100 кГц. То есть за 5 мкс необходимо подготовить данные для передачи и выставить их в порт, а за следующие 5 мкс считать данные, которые к тому времени находятся в порту. А во время паузы (40 мкс) надо успеть записать принятое слово в буфер. Для этого я все обработчики помещаю в ОЗУ с помощью __ramfunc. Но при этом какие то сбои происходят при приеме, но когда я убираю из ОЗУ обработчик передатчика timer0_irq_handler, то данные начинают идти, хотя не все... Почему так происходит и как правильно размещать в ОЗУ обработчики прерываний? Все 3 прерывания имеют одинаковый приоритет 7.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Bulat   вопрос по работе с тремя прерываниями одинакового приоритета,   Nov 23 2009, 12:49
- - 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 Текстовая версия Сейчас: 22nd July 2025 - 04:53
Рейтинг@Mail.ru


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