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

 
 
> Обмен данными между задачами 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
Ответов
Rev0.0
сообщение Feb 2 2015, 05:58
Сообщение #2


Участник
*

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



Сергей Борщ
Ах да, забыл сказать, что task2 нельзя делать ожидающей, задумано так, что она должна работать каждый тик, поэтому лишние переключения нежелательны.
Также нежелательно юзать мьютексы каждый раз при входе в задачу, т.к. они довольно ресурсоемки да и задачи выполняют еще какой-то код помимо кода обмена данными. По этим причинам у меня и возникла идея проверять флаг каждый тик и затем если флаг TRUE, то тогда уже используем лок мьютексом.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Feb 2 2015, 06:08
Сообщение #3


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Rev0.0 @ Feb 2 2015, 07:58) *
Также нежелательно юзать мьютексы каждый раз при входе в задачу, т.к. они довольно ресурсоемки да и задачи выполняют еще какой-то код помимо кода обмена данными.


Самый ресурсоемкий в ваших примерах это вызов os_delay. На все остальное после этого можно не обращать внимания.
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   Цитата(AlexandrY @ Feb 2 2015, 11:08) Сам...   Feb 2 2015, 06:51
- - Сергей Борщ   Цитата(Rev0.0 @ Feb 2 2015, 07:58) Ах да,...   Feb 2 2015, 07:11
- - 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 Текстовая версия Сейчас: 19th July 2025 - 14:24
Рейтинг@Mail.ru


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