|
Многозадачность на авр |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Sep 5 2010, 14:37
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006

|
Цитата(Dimmix @ Sep 5 2010, 15:06)  Подскажите однако как лучше запустить многозадачность на авр-ах Все зависит от задачи. Если не нужно задачи динамически создавать/удалять, то, ИМХО, scmRTOS - лучший выбор. Доку от нее в любом случае почитать стоит.
|
|
|
|
|
Sep 6 2010, 21:49
|
Частый гость
 
Группа: Участник
Сообщений: 140
Регистрация: 2-01-08
Пользователь №: 33 768

|
Цитата(Dimmix @ Sep 5 2010, 16:06)  Подскажите однако как лучше запустить многозадачность на авр-ах Ничего сложного. Можно взять scmRTOS или freeRTOS, можно самому написать в расслабленном режиме за неделю. Всего-то нужно уметь сохранять и восстанавливать контекст (за вдохновением см. реализацию setjmp и longjmp из avr-libc), ну и при запуске задачи придется вручную расписать нужную область памяти так, как это сделала бы функция save_context. Ну. и потом просто восстановиться туда - все, мы уже летаем. На самом деле, занятие это достаточно грустное - скажем, в mega168 с её килобайтом памяти влезают всего две-три задачи, так что для таких развлечений лучше подобрать кристалл, где памяти хотя-бы два-четыре килобайта минимум.
|
|
|
|
|
Sep 7 2010, 03:19
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата ...нужно уметь сохранять и восстанавливать контекст... Самое простое, ИМХО, это посмотреть реализацию TinyTimber. Вообще-то Dimmix спросил Цитата как лучше . Я предпочитаю кооператив а-ля Protothreads - как на AVR, так и на других МК. Считаю, что в большинстве случаев (кроме узкозаточенных решений) критичная ко времени реагирования часть кода должна быть минимизирована и умещаться в обработчиках прерываний, а остальное спокойно работать в фоне. Расход памяти при кооперативе значительно меньше, но приходится платить рулением статическими переменными и решать несколько больше вопросов синхронизации.
--------------------
aka Vit
|
|
|
|
|
Sep 7 2010, 14:34
|
Частый гость
 
Группа: Участник
Сообщений: 140
Регистрация: 2-01-08
Пользователь №: 33 768

|
Цитата(MrYuran @ Sep 7 2010, 12:49)  Кроме вытесняющей, бывает ещё и кооперативная многозадачность, которая дополнительной памяти практически не требует. Это как? Что там, что там - сколько задач, столько и контекстов, стеков и struct task'ов. Цитата(777777 @ Sep 7 2010, 12:19)  А как ее можно не запускать? Вряд ли хоть один проект может обойтись без прерываний, а обычно 90% работы выполняется в них. А что это, если не многозадачность? Это не многозадачность, это асинхронная стейт-машина :-) Цитата(sensor_ua @ Sep 7 2010, 07:19)  Я предпочитаю кооператив а-ля Protothreads - как на AVR, так и на других МК. Кооперативность или вытесняемость - вещь, в общем-то перпендикулярная к методу организации передачи управления. Цитата Считаю, что в большинстве случаев (кроме узкозаточенных решений) критичная ко времени реагирования часть кода должна быть минимизирована и умещаться в обработчиках прерываний, а остальное спокойно работать в фоне. Расход памяти при кооперативе значительно меньше, но приходится платить рулением статическими переменными и решать несколько больше вопросов синхронизации. Все это так, но прототреды и прочие завуалированные стейт-машины дико неудобны тем, что _весь_ код должен поддерживать асинхронность сверху донизу. В какой-то момент придется выбирать: либо память и честное переключение контекста, либо повеситься без мыла на прерываниях.
|
|
|
|
|
Sep 7 2010, 14:42
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(slanted @ Sep 7 2010, 18:34)  Это как? Что там, что там - сколько задач, столько и контекстов, стеков и struct task'ов. Кооперативность или вытесняемость - вещь, в общем-то перпендикулярная к методу организации передачи управления. А вот и нет. В кооперативной задача сама "знает", когда отдаст управление, и соответственно сохраняет свой контекст. Не все регистры подряд, а только нужную инфу. Например, в static переменных. В отличие от вытесняющей, где ход выполнения задачи может прерваться вообще посреди оператора или функции.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 7 2010, 15:26
|
Частый гость
 
Группа: Участник
Сообщений: 140
Регистрация: 2-01-08
Пользователь №: 33 768

|
Цитата(MrYuran @ Sep 7 2010, 18:42)  А вот и нет. В кооперативной задача сама "знает", когда отдаст управление, и соответственно сохраняет свой контекст. Не все регистры подряд, а только нужную инфу. Например, в static переменных. Те регистры что не "все подряд" сохранит компилятор при вызове функции переключения задач ;-) А то что вы описываете - это прототреды.
|
|
|
|
|
Sep 7 2010, 16:19
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Все это так, но прототреды и прочие завуалированные стейт-машины дико неудобны тем, что _весь_ код должен поддерживать асинхронность сверху донизу. В какой-то момент придется выбирать: либо память и честное переключение контекста, либо повеситься без мыла на прерываниях. Похоже, у Вас просто нет опыта использования подобных технологий. Холивар разводить не хочу, да и пока не о чем спорить. Потому как вижу только Ваши эмоции, но ничего относящегося к предмету.
--------------------
aka Vit
|
|
|
|
|
Sep 7 2010, 16:41
|
Частый гость
 
Группа: Участник
Сообщений: 140
Регистрация: 2-01-08
Пользователь №: 33 768

|
Цитата(sensor_ua @ Sep 7 2010, 20:19)  Похоже, у Вас просто нет опыта использования подобных технологий. Холивар разводить не хочу, да и пока не о чем спорить. Потому как вижу только Ваши эмоции, но ничего относящегося к предмету. Покажите код штоле ;-)
|
|
|
|
|
Sep 7 2010, 20:49
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Покажите код штоле ;-) Вот выдрал простой кусочек из реального старинного проекта "выходного дня" - всего-лишь блинк, который пришлось вставлять в программку вместо обычного ожидающего Код void BlinkLed(unsigned short Blink_Count, unsigned short LED_on_ms, unsigned short LED_off_ms) дабы добавить к имевшейся задаче ещё парочку параллельно выполняющихся. Всё это фунциклирует  без жесткого риалтайма. Код unsigned short clock(void){ unsigned short tms; __enter_critical(); tms = xtimer_ms; __exit_critical(); return (tms);
}
unsigned short clock_Elapsed(unsigned short tstart){ return ((unsigned short)( clock() - tstart)); }
static unsigned short BCount; static unsigned short Bon_ms; static unsigned short Boff_ms; static unsigned short Bts_ms;
void xBlinkLed_Start(unsigned short Blink_Count, unsigned short LED_on_ms, unsigned short LED_off_ms){ BCount = Blink_Count; Bon_ms = LED_on_ms; Boff_ms = LED_off_ms; Bts_ms = clock(); LED_OFF(); }
bool xBlinkLed_Done(bool forceoff){ static unsigned char st = 0; if(forceoff){ BCount = 0; st = 0; LED_OFF(); } if(BCount){ switch(st){ case 0: if(clock_Elapsed(Bts_ms) < Boff_ms)break; LED_ON(); Bts_ms = clock(); st = 1;
case 1: if(clock_Elapsed(Bts_ms) < Bon_ms)break; LED_OFF(); Bts_ms = clock(); BCount -= 1; st = 0; break;
default: st = 0; break; } } if(BCount == 0){ return true;} return false; } Тут в явном виде хоть и не представлены именно прототриды, но зато неплохо выражены способы применения и видны накладные
--------------------
aka Vit
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|