Отговори на тема  [ 6 мнения ] 
AVR GCC прекъсване 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Сря Фев 06, 2013 10:25 am
Мнения: 197
Мнение AVR GCC прекъсване
Здравейте,

Имам следния код.
Проблема е, че не се връщам в main loop-a след прекъсване.
Код:
ISR(USART_RXC_vect)
{
   ......
   switch ( serial_processing() )
   {
      case ISO_RETURN_CODE_OK: 
      serial_puts_P(PSTR("\n\rOK"));
      print_prompt();
      break;
   ......
   }

}

char serial_processing(void)
{
   ......
   sei();
   unsigned char return_code = iso_send_msg(iso_msg_buf, serial_msg_len ); //използва TIMER0 overflow interrupt.
   ......
   cnt = iso_recv_msg(iso_msg_buf);  //използва TIMER0 overflow interrupt и INT0.
   ......
   
}


Прочетох малко документация и разбрах, че имам няколко проблема:
1) При изпълнение на ISR всички други прекъсвания са забранени. => за това викам sei(), защото iso_send_msg и iso_recv_msg използват други прекъсвания. Без sei() не работи.
2) ISR трябва да е максимално кратък като код и време за изпълнение.

Въпросът ми е защо не се връщам от прекъсването.
Следващия въпрос е как да направя ISR, който да може да бъде прекъсван от други прекъсвания.

Тук намерих следното:

Код:
Interruptible Interrupt routine
“Rule of thumb”: in the doubt ISR. Those in the following described method use only if one realizes oneself the
different function mode.
#include <avr/interrupt.h>
//...
void XXX_vect(void) __attribute__((interrupts));
void XXX_vect(void) {
//...
}
Here stands for XXX for described the name of the vector the above (thus e.g. void TIMER0_OVF_vect
(void)…). The difference compared with ISR is that when calling the function global the Enable interrupts
bits become certified here automatically again set and thus further interrupts. This can to not insignificant
problems of in the simplest case a stack OVERFLOW up to other unexpected effects


Вто Май 07, 2013 12:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: AVR GCC прекъсване
Това не ти е джава. В прекъсването сетваш флаг и веднага излизаш. А в главната програма вече си вършиш глупостите и "викаш" другите прекъсвания.

_________________
Warriors of the Night, ASSEMBLER!!!


Вто Май 07, 2013 12:58 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Сря Фев 06, 2013 10:25 am
Мнения: 197
Мнение Re: AVR GCC прекъсване
ike написа:
Това не ти е джава. В прекъсването сетваш флаг и веднага излизаш. А в главната програма вече си вършиш глупостите и "викаш" другите прекъсвания.

Няма значение какъв е езика... Всичко се компилира до асемблер. Много е грозно да говориш за кода, както за "глупусти". Това са българските форуми -> Задаваш въпрос и следват постове, обясняващи ти колко си прост, зле и т.н.

Благодаря все пак за отговора. В ISR-а, ще сетна един влаг и само ще пъляня един буфер.


Вто Май 07, 2013 1:41 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Юни 01, 2008 9:54 pm
Мнения: 1503
Местоположение: Пловдив
Мнение Re: AVR GCC прекъсване
vgeorgiev написа:
ike написа:
Това не ти е джава. В прекъсването сетваш флаг и веднага излизаш. А в главната програма вече си вършиш глупостите и "викаш" другите прекъсвания.

Няма значение какъв е езика... Всичко се компилира до асемблер. Много е грозно да говориш за кода, както за "глупусти". Това са българските форуми -> Задаваш въпрос и следват постове, обясняващи ти колко си прост, зле и т.н.


Мислех да ти кажа и аз как се прави, за да не останеш с пръст някъде като ще разрешаваш прекъсване в прекъсването, но щом си толкова устат - пиши код и мълчи. Да не ти казват колко си ... какъвто и да е.


Вто Май 07, 2013 2:31 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение Re: AVR GCC прекъсване
в WinAVR документацията има нужнит описания.
Като атрибут за прекъсването се слага NOBLOCK, така се разрешават вложените прекъсвания.
Защо не се връщаш от прекъсване, мога само да гадя, или не сетваш правилния вектор, или си разрешил друго прекъсване, за което нямаш обработка.


Сря Май 08, 2013 1:28 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 2:22 pm
Мнения: 6492
Местоположение: София
Мнение Re: AVR GCC прекъсване
vgeorgiev написа:
...
Няма значение какъв е езика... Всичко се компилира до асемблер.
...


Всъщност всичко се компилира до машинен код, асемблерът в само вид компилатор
правещ това от вид сорс с определен - обикновено платформено-специфичен- синтаксис :-).

Не мога да ти помогна за това кой компилатор какво прави.

Това, което знам обаче е, че за да почнеш да можеш да пишеш реално работещ код
в който има обработки на прекъсвания, поне последните трябва да можеш да ги
направиш на асемблер, чак след това да оставяш компилатора да се мисли за
по-умен от тебе и да прави каквото иска да прави.
Не ти ли е ясно кога кои регистри се стекват, *къде* се стекват и откъде се
възстановяват работата е безнадеждна.

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/


Сря Май 08, 2013 2:29 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: Google [Bot] и 30 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни