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

 
 
> Обмен данными между задачами 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, 10:16
Сообщение #2


Участник
*

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



Может быть я задачу как-то непонятно описал.
Я же просто привел вариант когда нужно в задаче выполнять периодически действия - как вы это сделаете без os_delay? Аппаратный таймер, который шлет задаче семафор? Да, можно, но вопрос не в этом.
Как вы строите архитектуру с RTOS - все задачи чего-то ждут? У меня в проекте 10 задач и некоторые ждут, а некоторые периодически выполняются. Тем задачам, что выполняются периодически нужна связь с ожидающими. Про очередь - хорошая идея, но как я писал выше мне нужны только последние данные - нет смысла в очереди. Тем более мне нужна очередь с нулевым временем ожидания.

Кстати для решения того, что вы описали с нечетким периодом выполнения задач в FreeRTOS, например, есть vTaskDelayUntil.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Feb 2 2015, 11:10
Сообщение #3


Ally
******

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



Цитата(Rev0.0 @ Feb 2 2015, 12:16) *
Я же просто привел вариант когда нужно в задаче выполнять периодически действия - как вы это сделаете без os_delay?


Используются сервисы ожидания с таймаутом.
xEventGroupWaitBits с указанием xTicksToWait

Но лучше создать отдельную задачу для строго периодических действий.

Кстати, во Free RTOS хорошо написано почему vTaskDelay нельзя использовать для периодических задач.
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, 07:58) Ах да,...   Feb 2 2015, 07:11
- - 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 Текстовая версия Сейчас: 21st August 2025 - 15:55
Рейтинг@Mail.ru


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