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

 
 
> Многозадачность на авр
Dimmix
сообщение Sep 5 2010, 12:06
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 645
Регистрация: 24-10-05
Пользователь №: 10 033



Подскажите однако как лучше запустить многозадачность на авр-ах
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
V_G
сообщение Sep 5 2010, 13:25
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Работа по прерываниям - почти та же многозадачность. Плюс в xmega-x - интенсивное использование DMA и механизмов событий. А реализация многозадачности как во "взрослых" процессорах скорее породит многоглюковость и тугодумие.
Если процессор плохо приспособлен для вашей задачи (многозадачности) - стоит сменить процессор.

Лучше один день потерять, потом за час долететь! ©

Сообщение отредактировал V_G - Sep 5 2010, 13:33
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Sep 5 2010, 14:37
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



Цитата(Dimmix @ Sep 5 2010, 15:06) *
Подскажите однако как лучше запустить многозадачность на авр-ах

Все зависит от задачи. Если не нужно задачи динамически создавать/удалять, то, ИМХО, scmRTOS - лучший выбор. Доку от нее в любом случае почитать стоит.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 5 2010, 20:04
Сообщение #4


;
******

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



Цитата(Dimmix @ Sep 5 2010, 16:06) *
Подскажите однако как лучше запустить многозадачность на авр-ах

Элементарно - берете и запускаете. Если так формулировать свои мысли, ответа Вы не дождетесь
Go to the top of the page
 
+Quote Post
slanted
сообщение Sep 6 2010, 21:49
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 140
Регистрация: 2-01-08
Пользователь №: 33 768



Цитата(Dimmix @ Sep 5 2010, 16:06) *
Подскажите однако как лучше запустить многозадачность на авр-ах

Ничего сложного. Можно взять scmRTOS или freeRTOS, можно самому написать в расслабленном режиме за неделю.
Всего-то нужно уметь сохранять и восстанавливать контекст (за вдохновением см. реализацию setjmp и longjmp из avr-libc), ну и при запуске задачи придется вручную расписать нужную область памяти так, как это сделала бы функция save_context. Ну. и потом просто восстановиться туда - все, мы уже летаем.
На самом деле, занятие это достаточно грустное - скажем, в mega168 с её килобайтом памяти влезают всего две-три задачи, так что для таких развлечений лучше подобрать кристалл, где памяти хотя-бы два-четыре килобайта минимум.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Sep 7 2010, 03:19
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
...нужно уметь сохранять и восстанавливать контекст...
Самое простое, ИМХО, это посмотреть реализацию TinyTimber. Вообще-то Dimmix спросил
Цитата
как лучше
. Я предпочитаю кооператив а-ля Protothreads - как на AVR, так и на других МК. Считаю, что в большинстве случаев (кроме узкозаточенных решений) критичная ко времени реагирования часть кода должна быть минимизирована и умещаться в обработчиках прерываний, а остальное спокойно работать в фоне. Расход памяти при кооперативе значительно меньше, но приходится платить рулением статическими переменными и решать несколько больше вопросов синхронизации.


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 7 2010, 08:19
Сообщение #7


Профессионал
*****

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



Цитата(Dimmix @ Sep 5 2010, 16:06) *
Подскажите однако как лучше запустить многозадачность на авр-ах

А как ее можно не запускать? Вряд ли хоть один проект может обойтись без прерываний, а обычно 90% работы выполняется в них. А что это, если не многозадачность?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 7 2010, 08:49
Сообщение #8


Беспросветный оптимист
******

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



Цитата(slanted @ Sep 7 2010, 01:49) *
На самом деле, занятие это достаточно грустное - скажем, в mega168 с её килобайтом памяти влезают всего две-три задачи, так что для таких развлечений лучше подобрать кристалл, где памяти хотя-бы два-четыре килобайта минимум.

Кроме вытесняющей, бывает ещё и кооперативная многозадачность, которая дополнительной памяти практически не требует.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
slanted
сообщение Sep 7 2010, 14:34
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 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, так и на других МК.

Кооперативность или вытесняемость - вещь, в общем-то перпендикулярная к методу организации передачи управления.

Цитата
Считаю, что в большинстве случаев (кроме узкозаточенных решений) критичная ко времени реагирования часть кода должна быть минимизирована и умещаться в обработчиках прерываний, а остальное спокойно работать в фоне. Расход памяти при кооперативе значительно меньше, но приходится платить рулением статическими переменными и решать несколько больше вопросов синхронизации.

Все это так, но прототреды и прочие завуалированные стейт-машины дико неудобны тем, что _весь_ код должен поддерживать асинхронность сверху донизу. В какой-то момент придется выбирать: либо память и честное переключение контекста, либо повеситься без мыла на прерываниях.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 7 2010, 14:42
Сообщение #10


Беспросветный оптимист
******

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



Цитата(slanted @ Sep 7 2010, 18:34) *
Это как? Что там, что там - сколько задач, столько и контекстов, стеков и struct task'ов.
Кооперативность или вытесняемость - вещь, в общем-то перпендикулярная к методу организации передачи управления.

А вот и нет. В кооперативной задача сама "знает", когда отдаст управление, и соответственно сохраняет свой контекст. Не все регистры подряд, а только нужную инфу. Например, в static переменных. В отличие от вытесняющей, где ход выполнения задачи может прерваться вообще посреди оператора или функции.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
slanted
сообщение Sep 7 2010, 15:26
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 140
Регистрация: 2-01-08
Пользователь №: 33 768



Цитата(MrYuran @ Sep 7 2010, 18:42) *
А вот и нет. В кооперативной задача сама "знает", когда отдаст управление, и соответственно сохраняет свой контекст. Не все регистры подряд, а только нужную инфу. Например, в static переменных.

Те регистры что не "все подряд" сохранит компилятор при вызове функции переключения задач ;-)
А то что вы описываете - это прототреды.
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 7 2010, 15:55
Сообщение #12


Профессионал
*****

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



Цитата(MrYuran @ Sep 7 2010, 18:42) *
А вот и нет. В кооперативной задача сама "знает", когда отдаст управление, и соответственно сохраняет свой контекст. Не все регистры подряд, а только нужную инфу. Например, в static переменных. В отличие от вытесняющей, где ход выполнения задачи может прерваться вообще посреди оператора или функции.

Ага, я вот тут набросал многозадачную операционку с кооперативной многозадачностью:

Код
for(;;)
    {
    task1();
    task2();
    task3();
    // ...
    }
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Sep 7 2010, 16:19
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
Все это так, но прототреды и прочие завуалированные стейт-машины дико неудобны тем, что _весь_ код должен поддерживать асинхронность сверху донизу. В какой-то момент придется выбирать: либо память и честное переключение контекста, либо повеситься без мыла на прерываниях.

Похоже, у Вас просто нет опыта использования подобных технологий. Холивар разводить не хочу, да и пока не о чем спорить. Потому как вижу только Ваши эмоции, но ничего относящегося к предмету.


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
slanted
сообщение Sep 7 2010, 16:41
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 140
Регистрация: 2-01-08
Пользователь №: 33 768



Цитата(sensor_ua @ Sep 7 2010, 20:19) *
Похоже, у Вас просто нет опыта использования подобных технологий. Холивар разводить не хочу, да и пока не о чем спорить. Потому как вижу только Ваши эмоции, но ничего относящегося к предмету.

Покажите код штоле ;-)
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Sep 7 2010, 20:49
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
Покажите код штоле ;-)

Вот выдрал простой кусочек из реального старинного проекта "выходного дня" - всего-лишь блинк, который пришлось вставлять в программку вместо обычного ожидающего
Код
void BlinkLed(unsigned short Blink_Count, unsigned short LED_on_ms, unsigned short LED_off_ms)
дабы добавить к имевшейся задаче ещё парочку параллельно выполняющихся. Всё это фунциклируетsmile.gif без жесткого риалтайма.
Код
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
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 01:52
Рейтинг@Mail.ru


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