Easyelectronics.ru

Электроника для всех
Текущее время: 24 окт 2018, 08:14

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • 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