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

 
 
> Организация асинхронных вычислительных процессов, как лучше организовать это на МК
alvol
сообщение May 12 2010, 05:37
Сообщение #1


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

Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119



Добрый день. Есть некоторая задача: работать на МК с модулем, скажем блутус, который имеет свой набор команд (запросы, подтверждения выполнения команды, идентификаторы событий). Кроме всего прочего нужно общаться и с другой периферией(иногда аналогичной ) и выполнять прочие действия.
Суть проблемы: как правильно организовать обработку асинхронных процессов, различных по длительности и при вариативности результата этих действий?
Реализовывал несколько конечных автоматов, в которые входил раз за проход, проверял что изменилось, за нек промежуток времени, реагировал, менял состояния и переходил к следующему конечному автомату.
Теперь этого не хватает. Потому как при работе с модулем накапливается огромное количество всевозможных состояний, различных переходов от состояния к состоянию и приходится реагировать на события, которые накапливаются параллельно (скажем опрос окружения, работа с несколькими конечными точками), отдавать запросы и ожидать подтверждений в несколько этапов.
Как-то возможностей конечного автомата--уже мало (слишком много состояний и большая вариативность возможных вариантов развития), а про организацию простых операционных систем--пока не имею представления.
Возможно кто-то натолкнет на правильные идеи? На что нужно обратить внимание при организации подобных программ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Pasha
сообщение May 12 2010, 06:57
Сообщение #2


;
******

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



Почему-то мне кажется, что Ваша задача на 100% решается простейшей кооперативной многозадачкой. Protothreads
Модифицировать ее можно таким образом, чтобы все сопрограммы выполнялмсь внутри одной функции. Пример для GCC
Код
void *thread1(void *pc);
//..................................
void *threadN(void *pc);
void idle(void)
{
do{ static void *pc=NULL; pc = thread1(pc);}while(0);
//..............................................................................
do{ static void *pc=NULL; pc = threadN(pc);}while(0);
}

Для исключения рекурсивного вызова сопрограммы надо предусмотреть ее блокировку. Тогда у Вас появится возможность в циклах ожидания вызывать эту idle() - стек расходуется, но это уже разумный компромисс.
В общем, чем более бедненький МК, тем больше преимуществ у Protothreads
Go to the top of the page
 
+Quote Post



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

 


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


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