[quote=&-rey,Sep 14 2005, 13:49]
[/quote]
И я о том же.
Отличная иллюстрация того, что у AVR на самом деле НЕТ приоритетной системы прерываний
[/quote]
Как понять НЕТ. Есть. и будет есть. Самый старший приоритет RESET. Затем внешние прерывания, UART где-то в конце. А если надо иначе - то разрешайте глобальное в обработчике прерывания. Лично пользовался и все работало.
[/quote]
Есть??? Ну извините.
Берём мегу128. Берём прерывание TIMER1CAPT. Прерывания от таймера 2 и внешние прерывания INT
как бы имеют больший приоритет, а прерывания от остальных таймеров и UART
как бы имеют меньший приоритет.
Пожалуйста, объясните мне, неразумному, как сделать такую вещь. Я хочу, чтобы обработчик TIMER1_CAPT было
можно прервать любым внешним прерыванием или прерываниями таймера2, но
нельзя прервать прерываниями от таймера3 и от USART-ов.
Если я в начале обработчика TIMER1_CAPT поставлю sei, то прерывание TIMER3_OVF,
якобы самое низкоприоритетное, сможет прервать мой обработчик наравне с INT0. Ну и где тут
приоритетная система???
У AVR
НЕТУ приоритетной системы прерываний. Есть "близость к процессору в цепочке запросов", которая решает - кто из двух и более возьмёт управление при
одновремённом возникновении запросов, такт в такт. И как часто это происходит? А если "более приоритетное" возникнет на такт позже "менее приоритетного"? А если при этом этом "менее приоритетное" ну очень не хочется прерывать "ещё менее приоритетным", так как "более приоритеное" выписано так, что быстро отработате и выставит флаги, а "ещё менее" может занять процессор на милисекунду, так как для фонового процесса это совсем до лампочки?
Итого я утверждаю, что слово "приоритет" применительно к прерываниям у AVR - это скорее маркетинговый термин, чем технический.
Когда такая система есть, то более приоритетное прерывание прервёт менее приоритетное как только более приоритетное возникнет - независимо от желания менее приоритетного. У MCS51 это возможно, более приоритетное может прервать менее приоритетное, менее приоритетное не будет вызвано пока более приоритетное не выполнит команду reti. Но у MCS51 нет понятия приоритета процессора и там нельзя "вот на этот период" запретить только менее приоритетные прерывания, а более приоритетные оставить.
===
MIPS - Meanless Indicator of Performance for Salesmen