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

 
 
> Организация асинхронных вычислительных процессов, как лучше организовать это на МК
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
Ответов (1 - 7)
Dima_G
сообщение May 12 2010, 05:54
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



RTOS?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 12 2010, 06:20
Сообщение #3


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

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



Посмотрите доку на scmRTOS, очень толково написано. А потом, попробовав немного, можно уже определяться.
FreeRTOS помощнее, там можно комбинировать вытесняющую и кооперативную многозадачность. Но и жрёт побольше.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение May 12 2010, 06:57
Сообщение #4


;
******

Группа: Участник
Сообщений: 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
alvol
сообщение May 13 2010, 08:16
Сообщение #5


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

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



Цитата(MrYuran @ May 12 2010, 09:20) *
Посмотрите доку на scmRTOS, очень толково написано.

Угу, спасибо, углубился в изучение
Go to the top of the page
 
+Quote Post
AlexOr
сообщение May 31 2010, 04:56
Сообщение #6


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

Группа: Свой
Сообщений: 89
Регистрация: 30-12-04
Из: Санкт-Петербург
Пользователь №: 1 754



Цитата(alvol @ May 12 2010, 09:37) *
Как-то возможностей конечного автомата--уже мало


А точно, что Вы умеете их делать (готовить)?
Один знакомый программер высокого уровня как то сказал примерно следующее:
На КА можно сделать все и гораздо проще, чем на ОС, только надо немного иначе мыслить.

ЗЫ%
Вы не любите собак?! Да Вы просто не умеете их готовить....
Go to the top of the page
 
+Quote Post
ukpyr
сообщение May 31 2010, 06:11
Сообщение #7


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

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



Цитата
Один знакомый программер высокого уровня как то сказал примерно следующее: На КА можно сделать все и гораздо проще, чем на ОС, только надо немного иначе мыслить.
это в случае небольшого количества задач и состояний. Если их много, программа превращается в трудноподдерживаемую мешанину из switch/case, обработки таймеров и т.д.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 31 2010, 06:53
Сообщение #8


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

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



Цитата(AlexOr @ May 31 2010, 08:56) *
Один знакомый программер как то сказал ...

Сильно зависит от задачи.
Операционка включает в себя обычно не только планировщик, но и некоторые средства межпроцессного взаимодействия типа эвентов, сообщений, очередей, мутексов и др.
Воспроизвести всё это в виде "рассыпухи" непросто.
Да и Sleep(), к примеру, или WaitForEvent() выглядит намного нагляднее нагромождения таймеров и проверок флагов

Да и вообще, интересно глянуть на вытесняющую многозадачку с приоритетами, реализованную "напрямую".
Фактически, та же операционка и получится, только недокументированная, с потенциальными глюками и без поддержки.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

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

 


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


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