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

 
 
 
Reply to this topicStart new topic
> Глобальные данные в FreeRTOS/CMSIS RTOS
simark1979
сообщение Jan 24 2018, 13:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-03-09
Из: Краснодарский край
Пользователь №: 46 094



Будьте добры, подскажите новичку во FreeRTOS


Есть несколько потоков, которые собирают различные данные с разных устройств, висящих на шинах i2c/uart

Есть таймер, по которому вызывается функция, которая собранные в кучу данные должна выбрасывать хосту через uart

Возможно ли организовать ОДНУ глобальную структуры, в которой каждый поток менял бы только свои данные?
Правильно понимаю, что https://www.keil.com/pack/doc/CMSIS/RTOS/ht...__PoolMgmt.html как раз для таких целей?

Дайте пинка в нужном направлении, спасибо)

Сообщение отредактировал simark1979 - Jan 25 2018, 05:26
Go to the top of the page
 
+Quote Post
x893
сообщение Jan 24 2018, 14:13
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Объявите переменную нужной структуры и пишите данные туда раз все меняют только свои данные.
Go to the top of the page
 
+Quote Post
simark1979
сообщение Jan 24 2018, 15:19
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-03-09
Из: Краснодарский край
Пользователь №: 46 094



Цитата(x893 @ Jan 24 2018, 17:13) *
Объявите переменную нужной структуры и пишите данные туда раз все меняют только свои данные.


А как быть, если записывающий поток будет прерван планировщиком во время записи в переменную, а потом запустится функция, которая вычитает частично обновленные данные и отдаст их хосту.
Go to the top of the page
 
+Quote Post
juvf
сообщение Jan 25 2018, 03:10
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(x893 @ Jan 24 2018, 19:13) *
Объявите переменную нужной структуры и пишите данные туда раз все меняют только свои данные.

Так нельзя. Можно, если только все операции записи в структуру атомарные.

Я бы сделал глобальную структуру и при записи/чтении уходил бы в критическую секцию.
Go to the top of the page
 
+Quote Post
simark1979
сообщение Jan 25 2018, 05:19
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-03-09
Из: Краснодарский край
Пользователь №: 46 094



Цитата(juvf @ Jan 25 2018, 06:10) *
Так нельзя. Можно, если только все операции записи в структуру атомарные.

Я бы сделал глобальную структуру и при записи/чтении уходил бы в критическую секцию.


Старался не пользоваться критическими секциями, но тут вы наверное правы, по идее операции быстрые, лагов с переключениями тасков быть не должно.
Буду пробовать.

Cпасибо)

PS. если у кого есть другие идеи, просьба отозваться.
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Jan 25 2018, 05:53
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



У вас Cortex-M контроллер? Если да, можно атомарность обеспечить без запрета прерываний: http://we.easyelectronics.ru/STM32/atomarn...-cortex-m3.html


--------------------
Go to the top of the page
 
+Quote Post
x893
сообщение Jan 25 2018, 08:29
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Да как угодно можно сделать атомарную запись.
Про неё в первом посте ничего не сказано.
Хоть средствами RTOS, хоть руками (прерывание, флаги и т.п.)
Go to the top of the page
 
+Quote Post
juvf
сообщение Jan 25 2018, 08:40
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(simark1979 @ Jan 25 2018, 10:19) *
PS. если у кого есть другие идеи, просьба отозваться.

Код
void vTask1( void * pvParameters )
{
     for(;; )
     {
         // Task code goes here.

         // ...

         // At some point the task wants to perform a long operation during
         // which it does not want to get swapped out.  It cannot use
         // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
         // operation may cause interrupts to be missed - including the
         // ticks.

         // Prevent the RTOS kernel swapping out the task.
         vTaskSuspendAll ();

         // Perform the operation here.  There is no need to use critical
         // sections as we have all the microcontroller processing time.  
         // During this time interrupts will still operate and the RTOS kernel
         // tick count will be maintained.

         // ...

         // The operation is complete.  Restart the RTOS kernel.
         xTaskResumeAll ();
     }
}


Go to the top of the page
 
+Quote Post
filip popov
сообщение Jan 25 2018, 09:32
Сообщение #9





Группа: Участник
Сообщений: 6
Регистрация: 25-04-15
Из: г. Карачев, Брянская обл.
Пользователь №: 86 382



Если объем данных невелик, то для этой цели больше подойдут очереди (Queues).
https://www.freertos.org/a00018.html
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 25 2018, 09:46
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(simark1979 @ Jan 25 2018, 08:19) *
PS. если у кого есть другие идеи, просьба отозваться.

mutex
Go to the top of the page
 
+Quote Post
simark1979
сообщение Jan 25 2018, 12:59
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-03-09
Из: Краснодарский край
Пользователь №: 46 094



Цитата(juvf @ Jan 25 2018, 11:40) *
Код
void vTask1( void * pvParameters )
{
     for(;; )
     {
         // Task code goes here.
         // ...
         // The operation is complete.  Restart the RTOS kernel.
         xTaskResumeAll ();
     }
}


Такой вариант был бы неплох, но есть засада:

"Другие API-функции FreeRTOS нельзя вы-
зывать, когда планировщик приостановлен
вызовом vTaskSuspendAll()." Андрей Курниц

А у меня в это время может придти прерывание, где у меня есть работа с семафорами.....

Пожалуй самое оптимальное решение: глобальная структура+мьтексы

Всем спасибо rolleyes.gif

Сообщение отредактировал simark1979 - Jan 25 2018, 13:00
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Jan 25 2018, 17:17
Сообщение #12


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(simark1979 @ Jan 24 2018, 16:42) *
.Есть таймер, по которому вызывается функция...Возможно ли организовать ОДНУ глобальную структуры, в которой каждый поток менял бы только свои данные?...


да, возможно.

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


удачи вам
(круглый)

Сообщение отредактировал kolobok0 - Jan 25 2018, 17:19
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 25 2018, 18:03
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(filip popov @ Jan 25 2018, 11:32) *
Если объем данных невелик, то для этой цели больше подойдут очереди (Queues).

Если велик, они тоже подойдут cool.gif
Ведь в очередь можно писать не только сами данные, но и дескрипторы (указатели) блоков, в которых эти данные находятся.
И в этом случае можно даже обойтись вообще без критических секций. Одними только LDREX/STREX.
Go to the top of the page
 
+Quote Post
simark1979
сообщение Jan 28 2018, 07:45
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-03-09
Из: Краснодарский край
Пользователь №: 46 094



Всё-таки вернулся к очередям. И уже сделал


Мьютексы задолбали, рекурсивные вызовы вызывают взаимную блокировку.
Пробовал использовать рекурсивные мьютесы, но что-то не работают они у меня (возможно неправильно понимаю их суть)

Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 28 2018, 15:20
Сообщение #15


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Мьютекс задает эксклюзивный доступ к ресурсу, к структуре данных в данном случае.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th April 2024 - 14:23
Рейтинг@Mail.ru


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