Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 35
1

Алгоритм таска

27.05.2015, 23:56. Показов 28108. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер.
Есть таск (TASK_DEVICE), в котором крутится работа с внешним девайсом (подключенным к МК по УАРТу).
Устройство шлет в МК текстовые данные, с переодичностью, например, пара строк в секунду.
Эти данные должна разбирать программа и дальше выносить определенные действия.
Как я вижу построение таска:
1. В прерывании складываем данные пришедшие по УАРТу в буфер и отправляем очередью.
2. В таске ждем очереди (с блокировкой задачи), очередь пришла - разбираем ее.
3. Разобрали - делаем определенные действия в зависимости от поступивших данных.

Вроде все просто и логично, синхронная работа с внешним девайсом - получили сообщение - разобрали - ждем следующего.
Но, иногда может потребоваться вмешательство в логику работу этого таска.
Например, другой таск (TASK_MAIN) решит приостановить работу с этим девайсом на некоторое время.
Как это лучше реализовать? Из TASK_MAIN приостановить работу TASK_DEVICE?
Не совсем вариант, т.к просто приостановить выполнение не достаточно, например, нужно отключить питание, запретить прерывание etc.
Использовать флаги/события?
Т.е сначала ждем очередь с некоторой задержкой, а потом проверяем был ли выставлен ли флаг?
Что-то на подобии:
Код
void task_divice(void *param) {
while (1) {
if (woyt_queue_wyth_btock(TIME_DELAY) == NO_ERROR) {    // Ждем очереди с задержкой TIME_DELAY.
process_data();        // Пришло сообщение, разбираем его.
}
// Код, который будет выполняться в любом случае, если очередь пришла и если не пришла за время TIME_DELAY
if (woyt_flag_wythout_btock() == NO_ERROR) {// проверяем флаг без блокировки задачи
// флаг был выставлен
process_flag();
}
}
}
Как лучше построить подобную задачу?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2015, 23:56
Ответы с готовыми решениями:

Gradle не идет запуск собственного таска
Что не так в таске Gradle? Идет копирование только при запуске с консоли gradle copyJars таска:...

Создание таска ToDo в почтовой базе
Всем привет. Суть задачи такова: кропаю на лотусе скрам доску с ембед вьюхами. При отправке на...

Новая таска по таймеру. Что делаю не так?
Всем привет народ! Вопрос следующий: Есть значит сервис, который синхронизируется с весами,...

Gulp таска watch выполняется только один раз
Здраствуйте, написла себе мини сборку для верстки, дома работало все прекрасно, но вот при...

0
27.05.2015, 23:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2015, 23:56
Помогаю со студенческими работами здесь

Импорт таска в Планировщик задач (Таск Шедулер) на компьютеры с разными именами
Добрый день! Экспортированный с одного компьютера таск не импортируется на другой - возникает...

Id текущего таска равен Null при использовании await Task.Delay(100);
Объясните, пожалуйста, почему используя await Task.Delay(100) в таске Task.CurrentId возвращает...

Нужен алгоритм поиска пути в этом лабиринте (будь то волновой алгоритм или алгоритм правой/левой руки )
#include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; void lab...

Волновой алгоритм поиска (Алгоритм A* / Алгоритм А стар)
Хочу разработать алгоритм для решения головоломки с подвижными дисками (перестановочная...

Линейный алгоритм, Алгоритм с ветвлениями, Циклический алгоритм Линейный алгоритм
Линейный алгоритм, Алгоритм с ветвлениями, Циклический алгоритм Линейный алгоритм 1. Объясни, что...

Алгоритм Маркова.Реализовать алгоритм, выполняющий |x-y| над числами в унарном коде
Нужно зделать алгоритм по алгоритм Маркова, чтобы выполнялолось модуль разности чисел.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru