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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Замена обработчика прерывания в WinAVR
ReAl
сообщение Dec 20 2008, 16:34
Сообщение #31


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Я погонял компиляцию этого дела в разных режимах.
В том числе для ISR, в том числе с байтовой переменной состояния в ОЗУ и
Код
enum { IDLE = 0, DRAIN };
    static uint8_t state = IDLE;
    static void *state_addr[] PROGMEM = { &&idle, &&drain };
    goto *(void*)pgm_read_word( &state_addr[state] );
что даёт бОльшую задержку на входе (но всё равно постоянную, не зависящую от ветви) и добавляет саму таблицу и код для зачитывания из неё, зато сокращает код и время для обновления состояния в ветвях, что на большом количестве состояний может дать выигрыш.
Довольно нормально получается.

Но реально не применяю :-), как-то не жмёт пока обычный switch()...


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 20 2008, 16:49
Сообщение #32


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ReAl @ Dec 20 2008, 20:34) *
что даёт бОльшую задержку на входе

Дык никто и не мешает в особо быстрых случаях подзагрузить таблицу в ОЗУ.
А во-вторых, реальное применение этого - как раз в статических сопрограммах с переопределяемой точкой входа. Т.е. кооперативная многозадачность, избавленная от тяжелого switch() - это КРУТО! smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 4th September 2025 - 16:18
Рейтинг@Mail.ru


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