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

 
 
> TNKernel переход в другую часть таска
hound
сообщение Apr 25 2015, 14:32
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 15-02-15
Пользователь №: 85 179



Добрый день, есть таск для работы с некоторым внешним устройством.
Устройство общается с МК по юарту, данные в прерывании складываются в буфер и очередьми отправляется в этот таск.
В таксе есть основной бесконечный цикл, в котором по очереди выполняются разные функции.
Т.е, грубо говоря:
Код
while (1) {
  func_1();
  func_2();
  func_3();
  func_4();
  func_5();  
}


Время выполнения каждой функции разное, примерно от 100мс до 1 сек.

Но само устройство может перейти в другой режим работы, для которого нужно будет выполнять уже другие функции. И устройство может перейти в этот режим в любой момент.
Когда устройство переходит в другой режим оно отправляет определенное сообщение МК. Это сообщение отлавливается в прерывании и дальше уже нужно заставить таск выйти из этого цикла и перейти в другой. Каким способ лучше подобное реализовать?
Проверка на наличии сообщения о переходе в другой режим при проверки очереди в каждой функции не вариант, т.к функций в основном цикле может быть намного больше и каждый раз делать проверку кажется лишним.

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
hound
сообщение May 17 2015, 13:15
Сообщение #2





Группа: Участник
Сообщений: 12
Регистрация: 15-02-15
Пользователь №: 85 179



Переход в другую задачу еще не совсем вариант, потому что это в этом "другом режиме работы" нужно девайсу отправить буквально одну команду.
Идеальным вариантом было бы при получении в прерывании уведомления о этом режиме, например, выставлять флаг и запускать сразу следующую итерацию цикла.
Перезапуск основной задачи тоже не вариант, т.к в начале этой задачи идет инициализация этого устройства и его первая перезагрузка, что в "разгаре" работы нельзя делать.
Go to the top of the page
 
+Quote Post
Bulya
сообщение May 18 2015, 12:54
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 11-10-08
Из: Харьков
Пользователь №: 40 874



Цитата(hound @ May 17 2015, 16:15) *
Переход в другую задачу еще не совсем вариант, потому что это в этом "другом режиме работы" нужно девайсу отправить буквально одну команду.

Если нужно отправить одну команду и вернуться в основной режим, то нужно просто синхронно выполнить одну функцию с отправкой этой команды.
Но за "буквально" могут скрываться неприятные нюансы.

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

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

Сложно что-то советовать когда непонятны критерии выбора решения.
К чему такая экономия на задачах? Не хватает памяти? (При том, что судя по всему требуемый объем стека небольшой и легко прогнозируем.)

Если итерацию основного режима все-равно нужно прервать, то в ней так или иначе необходима обработка исключений.
А значит переключение режима должно эскалироваться как любая ошибка и приводить к началу новой итерации.
И там в самом начале итерации должен проверяться какой-то флаг и обрабатываться "другой режим".

А вообще нужно просто организовать задачу в виде стейт-машины. И все переключения режимов сразу станут штатными ситуациями.

Проблемма, судя по всему в том, что задача принимает сообщения в разных местах кода или даже принимает сообщения из нескольких очередей.
Это в принципе плохо - повышает количество гонок и вероятность взаминых блокировок.
Нужно стремиться к тому, чтобы поток, обрабатывающий события, получал их в одном месте и из одного источника.
Go to the top of the page
 
+Quote Post



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

 


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


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