simark1979 0 24 января, 2018 Опубликовано 24 января, 2018 (изменено) · Жалоба Будьте добры, подскажите новичку во FreeRTOS Есть несколько потоков, которые собирают различные данные с разных устройств, висящих на шинах i2c/uart Есть таймер, по которому вызывается функция, которая собранные в кучу данные должна выбрасывать хосту через uart Возможно ли организовать ОДНУ глобальную структуры, в которой каждый поток менял бы только свои данные? Правильно понимаю, что https://www.keil.com/pack/doc/CMSIS/RTOS/ht...__PoolMgmt.html как раз для таких целей? Дайте пинка в нужном направлении, спасибо) Изменено 25 января, 2018 пользователем simark1979 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 55 24 января, 2018 Опубликовано 24 января, 2018 · Жалоба Объявите переменную нужной структуры и пишите данные туда раз все меняют только свои данные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 24 января, 2018 Опубликовано 24 января, 2018 · Жалоба Объявите переменную нужной структуры и пишите данные туда раз все меняют только свои данные. А как быть, если записывающий поток будет прерван планировщиком во время записи в переменную, а потом запустится функция, которая вычитает частично обновленные данные и отдаст их хосту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 25 января, 2018 Опубликовано 25 января, 2018 · Жалоба Объявите переменную нужной структуры и пишите данные туда раз все меняют только свои данные. Так нельзя. Можно, если только все операции записи в структуру атомарные. Я бы сделал глобальную структуру и при записи/чтении уходил бы в критическую секцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 25 января, 2018 Опубликовано 25 января, 2018 · Жалоба Так нельзя. Можно, если только все операции записи в структуру атомарные. Я бы сделал глобальную структуру и при записи/чтении уходил бы в критическую секцию. Старался не пользоваться критическими секциями, но тут вы наверное правы, по идее операции быстрые, лагов с переключениями тасков быть не должно. Буду пробовать. Cпасибо) PS. если у кого есть другие идеи, просьба отозваться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arhiv6 18 25 января, 2018 Опубликовано 25 января, 2018 · Жалоба У вас Cortex-M контроллер? Если да, можно атомарность обеспечить без запрета прерываний: http://we.easyelectronics.ru/STM32/atomarn...-cortex-m3.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 55 25 января, 2018 Опубликовано 25 января, 2018 · Жалоба Да как угодно можно сделать атомарную запись. Про неё в первом посте ничего не сказано. Хоть средствами RTOS, хоть руками (прерывание, флаги и т.п.) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 25 января, 2018 Опубликовано 25 января, 2018 · Жалоба 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 0 25 января, 2018 Опубликовано 25 января, 2018 · Жалоба Если объем данных невелик, то для этой цели больше подойдут очереди (Queues). https://www.freertos.org/a00018.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 января, 2018 Опубликовано 25 января, 2018 · Жалоба PS. если у кого есть другие идеи, просьба отозваться. mutex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 25 января, 2018 Опубликовано 25 января, 2018 (изменено) · Жалоба void vTask1( void * pvParameters ) { for(;; ) { // Task code goes here. // ... // The operation is complete. Restart the RTOS kernel. xTaskResumeAll (); } } Такой вариант был бы неплох, но есть засада: "Другие API-функции FreeRTOS нельзя вы- зывать, когда планировщик приостановлен вызовом vTaskSuspendAll()." Андрей Курниц А у меня в это время может придти прерывание, где у меня есть работа с семафорами..... Пожалуй самое оптимальное решение: глобальная структура+мьтексы Всем спасибо :rolleyes: Изменено 25 января, 2018 пользователем simark1979 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 25 января, 2018 Опубликовано 25 января, 2018 (изменено) · Жалоба .Есть таймер, по которому вызывается функция...Возможно ли организовать ОДНУ глобальную структуры, в которой каждый поток менял бы только свои данные?... да, возможно. для такого варианта, синхронизация не нужна. 1) синхронная фаза таймера уже вам квитирует доступ 2) синхронизировать надо не доступ к данным, а доступ к информации где забирать эти данные. удачи вам (круглый) Изменено 25 января, 2018 пользователем kolobok0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 25 января, 2018 Опубликовано 25 января, 2018 · Жалоба Если объем данных невелик, то для этой цели больше подойдут очереди (Queues). Если велик, они тоже подойдут B) Ведь в очередь можно писать не только сами данные, но и дескрипторы (указатели) блоков, в которых эти данные находятся. И в этом случае можно даже обойтись вообще без критических секций. Одними только LDREX/STREX. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 28 января, 2018 Опубликовано 28 января, 2018 · Жалоба Всё-таки вернулся к очередям. И уже сделал Мьютексы задолбали, рекурсивные вызовы вызывают взаимную блокировку. Пробовал использовать рекурсивные мьютесы, но что-то не работают они у меня (возможно неправильно понимаю их суть) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 января, 2018 Опубликовано 28 января, 2018 · Жалоба Мьютекс задает эксклюзивный доступ к ресурсу, к структуре данных в данном случае. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться