Easyelectronics.ru

Электроника для всех
Текущее время: 24 ноя 2017, 21:48

Часовой пояс: UTC + 5 часов



    • 10 шт. 2-слоя 100*100mm 2$. Быстрый заказ: JLCPCB.com
    • JLCPCB - это крупнейшая фабрика PCB прототипов в Китае.
    • Имеющий более 290,000 клиентов и выполняющий более 8,000 заказов в день.
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Алгоритм таска
СообщениеДобавлено: 29 май 2015, 00:43 
Заглядывает иногда

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

Вроде все просто и логично, синхронная работа с внешним девайсом - получили сообщение - разобрали - ждем следующего.
Но, иногда может потребоваться вмешательство в логику работу этого таска.
Например, другой таск (TASK_MAIN) решит приостановить работу с этим девайсом на некоторое время.
Как это лучше реализовать? Из TASK_MAIN приостановить работу TASK_DEVICE?
Не совсем вариант, т.к просто приостановить выполнение не достаточно, например, нужно отключить питание, запретить прерывание etc.
Использовать флаги/события?
Т.е сначала ждем очередь с некоторой задержкой, а потом проверяем был ли выставлен ли флаг?
Что-то на подобии:
Код:
void task_device(void *param) {
  while (1) {
    if (wait_queue_with_block(TIME_DELAY) == NO_ERROR) {    // Ждем очереди с задержкой TIME_DELAY.
       process_data();        // Пришло сообщение, разбираем его.
    }
    // Код, который будет выполняться в любом случае, если очередь пришла и если не пришла за время TIME_DELAY
    if (wait_flag_without_block() == NO_ERROR) {// проверяем флаг без блокировки задачи
       // флаг был выставлен
       process_flag();
    }
  }
}


Как лучше построить подобную задачу?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB