Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Глобальные данные в FreeRTOS/CMSIS RTOS
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
simark1979
Будьте добры, подскажите новичку во FreeRTOS


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

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

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

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


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

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

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

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


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

Cпасибо)

PS. если у кого есть другие идеи, просьба отозваться.
arhiv6
У вас Cortex-M контроллер? Если да, можно атомарность обеспечить без запрета прерываний: http://we.easyelectronics.ru/STM32/atomarn...-cortex-m3.html
x893
Да как угодно можно сделать атомарную запись.
Про неё в первом посте ничего не сказано.
Хоть средствами RTOS, хоть руками (прерывание, флаги и т.п.)
juvf
Цитата(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 ();
     }
}


filip popov
Если объем данных невелик, то для этой цели больше подойдут очереди (Queues).
https://www.freertos.org/a00018.html
ViKo
Цитата(simark1979 @ Jan 25 2018, 08:19) *
PS. если у кого есть другие идеи, просьба отозваться.

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


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

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


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

Если велик, они тоже подойдут cool.gif
Ведь в очередь можно писать не только сами данные, но и дескрипторы (указатели) блоков, в которых эти данные находятся.
И в этом случае можно даже обойтись вообще без критических секций. Одними только LDREX/STREX.
simark1979
Всё-таки вернулся к очередям. И уже сделал


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

ViKo
Мьютекс задает эксклюзивный доступ к ресурсу, к структуре данных в данном случае.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.