0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 35
|
|
1 | |
Алгоритм таска27.05.2015, 23:56. Показов 28108. Ответов 0
Метки нет (Все метки)
Добрый вечер.
Есть таск (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
|
27.05.2015, 23:56 | |
Ответы с готовыми решениями:
0
Gradle не идет запуск собственного таска Создание таска ToDo в почтовой базе Новая таска по таймеру. Что делаю не так? Gulp таска watch выполняется только один раз |
27.05.2015, 23:56 | |
27.05.2015, 23:56 | |
Помогаю со студенческими работами здесь
1
Импорт таска в Планировщик задач (Таск Шедулер) на компьютеры с разными именами Id текущего таска равен Null при использовании await Task.Delay(100); Нужен алгоритм поиска пути в этом лабиринте (будь то волновой алгоритм или алгоритм правой/левой руки ) Волновой алгоритм поиска (Алгоритм A* / Алгоритм А стар) Линейный алгоритм, Алгоритм с ветвлениями, Циклический алгоритм Линейный алгоритм Алгоритм Маркова.Реализовать алгоритм, выполняющий |x-y| над числами в унарном коде Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |