Перейти к содержанию
    

Глобальные данные в FreeRTOS/CMSIS RTOS

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

 

 

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

 

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

 

Возможно ли организовать ОДНУ глобальную структуры, в которой каждый поток менял бы только свои данные?

Правильно понимаю, что https://www.keil.com/pack/doc/CMSIS/RTOS/ht...__PoolMgmt.html как раз для таких целей?

 

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

Изменено пользователем simark1979

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Объявите переменную нужной структуры и пишите данные туда раз все меняют только свои данные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Объявите переменную нужной структуры и пишите данные туда раз все меняют только свои данные.

 

А как быть, если записывающий поток будет прерван планировщиком во время записи в переменную, а потом запустится функция, которая вычитает частично обновленные данные и отдаст их хосту.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Объявите переменную нужной структуры и пишите данные туда раз все меняют только свои данные.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Буду пробовать.

 

Cпасибо)

 

PS. если у кого есть другие идеи, просьба отозваться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да как угодно можно сделать атомарную запись.

Про неё в первом посте ничего не сказано.

Хоть средствами RTOS, хоть руками (прерывание, флаги и т.п.)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 ();
     }
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если объем данных невелик, то для этой цели больше подойдут очереди (Queues).

https://www.freertos.org/a00018.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PS. если у кого есть другие идеи, просьба отозваться.

mutex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 void vTask1( void * pvParameters )
{
     for(;; )
     {
         // Task code goes here.
         // ...
         // The operation is complete.  Restart the RTOS kernel.
         xTaskResumeAll ();
     }
}

 

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

 

"Другие API-функции FreeRTOS нельзя вы-

зывать, когда планировщик приостановлен

вызовом vTaskSuspendAll()." Андрей Курниц

 

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

 

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

 

Всем спасибо :rolleyes:

Изменено пользователем simark1979

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

.Есть таймер, по которому вызывается функция...Возможно ли организовать ОДНУ глобальную структуры, в которой каждый поток менял бы только свои данные?...

 

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

 

для такого варианта, синхронизация не нужна.

1) синхронная фаза таймера уже вам квитирует доступ

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

 

 

удачи вам

(круглый)

Изменено пользователем kolobok0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если объем данных невелик, то для этой цели больше подойдут очереди (Queues).

Если велик, они тоже подойдут B)

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

И в этом случае можно даже обойтись вообще без критических секций. Одними только LDREX/STREX.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

Мьютексы задолбали, рекурсивные вызовы вызывают взаимную блокировку.

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мьютекс задает эксклюзивный доступ к ресурсу, к структуре данных в данном случае.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...