Jump to content

    
Sign in to follow this  
simark1979

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

Recommended Posts

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

 

 

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

 

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

 

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

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

 

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

Edited by simark1979

Share this post


Link to post
Share on other sites
Объявите переменную нужной структуры и пишите данные туда раз все меняют только свои данные.

 

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

 

Share this post


Link to post
Share on other sites
Объявите переменную нужной структуры и пишите данные туда раз все меняют только свои данные.

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

 

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

Share this post


Link to post
Share on other sites
Так нельзя. Можно, если только все операции записи в структуру атомарные.

 

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

 

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

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

 

Cпасибо)

 

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

Share this post


Link to post
Share on other sites

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

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

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

 

Share this post


Link to post
Share on other sites
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 ();
     }
}

 

 

Share this post


Link to post
Share on other sites
 void vTask1( void * pvParameters )
{
     for(;; )
     {
         // Task code goes here.
         // ...
         // The operation is complete.  Restart the RTOS kernel.
         xTaskResumeAll ();
     }
}

 

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

 

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

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

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

 

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

 

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

 

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

Edited by simark1979

Share this post


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

 

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

 

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

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

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

 

 

удачи вам

(круглый)

Edited by kolobok0

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites

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

 

 

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

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

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this