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

 
 
> Обмен данными между задачами RTOS
Rev0.0
сообщение Jan 30 2015, 09:49
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 3-05-13
Пользователь №: 76 718



Привет! Вот мучаюсь и все тут, нужен свежий взгляд. Ниже привел псевдокод, который по моему мнению должен нормально работать.
Имеем некоторую RTOS и 2 задачи для простоты.
Задача task1 имеет приоритет выше, чем task2. Задача task1 висит в ожидании данных от некоторой периферии.
Задача task2 должна принимать ПОСЛЕДНИЕ данные от task1, т.е если задача task1 получила скажем 10 буферов данных, то нам нужен в task2 только последний буфер, остальные можем безболезненно потерять (т.е. очередь не нужна).
Важное условие - код task2 должен выполняться как можно быстрее, поэтому я мьютекс поместил внутрь опроса флага, т.е. чтобы данные блокировались только когда они пришли, а не каждый цикл выполнения task2.
Прав ли я с таким кодом, покритикуйте, пожалуйста.

Код
int a,b,c;
int buf[3];

task1
{
while(1)
{
  if (wait_peri_data(&buf))
  {
    mutex_lock();
    a = buf[0];
    b = buf[1];
    c = buf[2];
    mutex_unlock();
    peri_data_available = 1;
  }
  os_delay(1);
}
}

task2
{
int a_task, b_task, c_task;    

while(1)
{
  if (peri_data_available)
  {
    mutex_lock();        
    a_task = a;
    b_task = b;
    c_task = c;
    mutex_unlock();
    peri_data_available = 0;            
  }
  os_delay(1);
}
}


Сообщение отредактировал Rev0.0 - Jan 30 2015, 09:51
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Feb 2 2015, 07:11
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Rev0.0 @ Feb 2 2015, 07:58) *
Ах да, забыл сказать, что task2 нельзя делать ожидающей, задумано так, что она должна работать каждый тик, поэтому лишние переключения нежелательны.
Недопонял. Ну и что, что каждый тик? Все равно выполняя свой os_delay() вы вызываете переключение. Вот только момент возврата из os_delay() и начала полезной работы у вас получился никак не связан с моментом готовности данных.

Цитата(Rev0.0 @ Feb 2 2015, 07:58) *
Также нежелательно юзать мьютексы каждый раз при входе в задачу, т.к. они довольно ресурсоемки да и задачи выполняют еще какой-то код помимо кода обмена данными.
Опять не вижу связи. Если вы используете мутех при входе в задачу - задача будет ждать, даже если этот мутех ей сейчас нафиг не нужен. Я не знаю, что у вас за ОС, но мне кажется, что тут нужен не мутех, тут нужно оформить a, b, c в виде сообщения и это сообщение послать задаче 2. Возможно через очередь сообщений, а возможно достаточно и вырожденной очереди из одного сообщения. И задача 2 должна ждать появления этого сообщения. Возможно ожидать с таймаутом в один тик. А возможно надо разделить на две задачи ту работу, которую задача2 выполняет по приходу данных и ту работу, которую она должна выполнять периодически.

Цитата(Rev0.0 @ Feb 2 2015, 08:51) *
В смысле? Если мне нужно чтобы каждая задача выполнялась периодически, одна с периодом 1 мс, другая 10 мс, третья 100 мс, все задачи с разным приоритетом. Как вы это сделаете?
В вашей реализации одна задача будет выполняться с периодом 1 мс + некоторое время на ее выполнение + некоторое время на выполнение других задач, вторая - с периодом 10 мс + некоторое время, третья - 100 мс + некоторое заранее неизвестное время.

Цитата(Rev0.0 @ Feb 2 2015, 08:51) *
Иначе вся ОС без os_delay будет работать в бесконечном цикле только в одной задаче с самым высоким приоритетом.
Значит у вас что-то не так с архитектурой программы. Потому что правильно спроектированная программа с ОС все свободное время крутится в цикле задачи с наименьшим приоритетом (IdleTask), а все остальные задачи в свободное время ждут появления запускающего их события.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Rev0.0   Обмен данными между задачами RTOS   Jan 30 2015, 09:49
- - Сергей Борщ   Цитата(Rev0.0 @ Jan 30 2015, 11:49) покри...   Jan 30 2015, 10:13
- - AlexandrY   Вот так надо делать: Кодint a,b,c; int buf[3...   Jan 30 2015, 10:58
|- - Сергей Борщ   Цитата(AlexandrY @ Jan 30 2015, 12:58) Во...   Jan 30 2015, 11:20
|- - AlexandrY   Цитата(Сергей Борщ @ Jan 30 2015, 13:20) ...   Jan 30 2015, 11:34
- - Rev0.0   Сергей Борщ Ах да, забыл сказать, что task2 нельзя...   Feb 2 2015, 05:58
|- - AlexandrY   Цитата(Rev0.0 @ Feb 2 2015, 07:58) Также ...   Feb 2 2015, 06:08
|- - Rev0.0   Цитата(AlexandrY @ Feb 2 2015, 11:08) Сам...   Feb 2 2015, 06:51
- - Rev0.0   Может быть я задачу как-то непонятно описал. Я же ...   Feb 2 2015, 10:16
|- - AlexandrY   Цитата(Rev0.0 @ Feb 2 2015, 12:16) Я же п...   Feb 2 2015, 11:10
- - Timmy   Цитата(Rev0.0 @ Jan 30 2015, 12:49) Приве...   Feb 2 2015, 20:57
- - 501-q   Приветствую. Код нормальный. Только, думается мн...   Feb 3 2015, 04:20
- - Rev0.0   501-q, зачем вы указали цикл в task2, мне же нужны...   Feb 3 2015, 10:38
|- - 501-q   Приветствую! Цитата(Rev0.0 @ Feb 3 2015,...   Feb 4 2015, 05:41
- - Rev0.0   Илья, верно, ваш вариант будет работать. НО! Е...   Feb 9 2015, 17:49
|- - AlexandrY   Цитата(Rev0.0 @ Feb 9 2015, 19:49) Илья, ...   Feb 9 2015, 18:14
|- - 501-q   Приветствую! Цитата(Rev0.0 @ Feb 9 2015, ...   Feb 10 2015, 04:28
- - Russky   Есть несколько вариантов, но концепция верна: Зап...   Feb 23 2015, 23:27


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

 


RSS Текстовая версия Сейчас: 20th August 2025 - 07:03
Рейтинг@Mail.ru


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