Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

AVR GCC прекъсване
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=11367
Страница 1 от 1

Автор:  vgeorgiev [ Вто Май 07, 2013 12:23 pm ]
Заглавие:  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

Автор:  ike [ Вто Май 07, 2013 12:58 pm ]
Заглавие:  Re: AVR GCC прекъсване

Това не ти е джава. В прекъсването сетваш флаг и веднага излизаш. А в главната програма вече си вършиш глупостите и "викаш" другите прекъсвания.

Автор:  vgeorgiev [ Вто Май 07, 2013 1:41 pm ]
Заглавие:  Re: AVR GCC прекъсване

ike написа:
Това не ти е джава. В прекъсването сетваш флаг и веднага излизаш. А в главната програма вече си вършиш глупостите и "викаш" другите прекъсвания.

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

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

Автор:  head_up [ Вто Май 07, 2013 2:31 pm ]
Заглавие:  Re: AVR GCC прекъсване

vgeorgiev написа:
ike написа:
Това не ти е джава. В прекъсването сетваш флаг и веднага излизаш. А в главната програма вече си вършиш глупостите и "викаш" другите прекъсвания.

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


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

Автор:  Ники [ Сря Май 08, 2013 1:28 am ]
Заглавие:  Re: AVR GCC прекъсване

в WinAVR документацията има нужнит описания.
Като атрибут за прекъсването се слага NOBLOCK, така се разрешават вложените прекъсвания.
Защо не се връщаш от прекъсване, мога само да гадя, или не сетваш правилния вектор, или си разрешил друго прекъсване, за което нямаш обработка.

Автор:  tgi [ Сря Май 08, 2013 2:29 pm ]
Заглавие:  Re: AVR GCC прекъсване

vgeorgiev написа:
...
Няма значение какъв е езика... Всичко се компилира до асемблер.
...


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

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

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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/