|
|
|
Глобальные данные в FreeRTOS/CMSIS RTOS |
|
|
|
Jan 24 2018, 13:42
|
Участник
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 24 2018, 15:19
|
Участник
Группа: Участник
Сообщений: 27
Регистрация: 14-03-09
Из: Краснодарский край
Пользователь №: 46 094
|
Цитата(x893 @ Jan 24 2018, 17:13) Объявите переменную нужной структуры и пишите данные туда раз все меняют только свои данные. А как быть, если записывающий поток будет прерван планировщиком во время записи в переменную, а потом запустится функция, которая вычитает частично обновленные данные и отдаст их хосту.
|
|
|
|
|
Jan 25 2018, 05:19
|
Участник
Группа: Участник
Сообщений: 27
Регистрация: 14-03-09
Из: Краснодарский край
Пользователь №: 46 094
|
Цитата(juvf @ Jan 25 2018, 06:10) Так нельзя. Можно, если только все операции записи в структуру атомарные.
Я бы сделал глобальную структуру и при записи/чтении уходил бы в критическую секцию. Старался не пользоваться критическими секциями, но тут вы наверное правы, по идее операции быстрые, лагов с переключениями тасков быть не должно. Буду пробовать. Cпасибо) PS. если у кого есть другие идеи, просьба отозваться.
|
|
|
|
|
Jan 25 2018, 09:32
|
Группа: Участник
Сообщений: 6
Регистрация: 25-04-15
Из: г. Карачев, Брянская обл.
Пользователь №: 86 382
|
Если объем данных невелик, то для этой цели больше подойдут очереди (Queues). https://www.freertos.org/a00018.html
|
|
|
|
|
Jan 25 2018, 12:59
|
Участник
Группа: Участник
Сообщений: 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()." Андрей Курниц А у меня в это время может придти прерывание, где у меня есть работа с семафорами..... Пожалуй самое оптимальное решение: глобальная структура+мьтексы Всем спасибо
Сообщение отредактировал simark1979 - Jan 25 2018, 13:00
|
|
|
|
|
Jan 25 2018, 17:17
|
практикующий тех. волшебник
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417
|
Цитата(simark1979 @ Jan 24 2018, 16:42) .Есть таймер, по которому вызывается функция...Возможно ли организовать ОДНУ глобальную структуры, в которой каждый поток менял бы только свои данные?... да, возможно. для такого варианта, синхронизация не нужна. 1) синхронная фаза таймера уже вам квитирует доступ 2) синхронизировать надо не доступ к данным, а доступ к информации где забирать эти данные. удачи вам (круглый)
Сообщение отредактировал kolobok0 - Jan 25 2018, 17:19
|
|
|
|
|
Jan 28 2018, 07:45
|
Участник
Группа: Участник
Сообщений: 27
Регистрация: 14-03-09
Из: Краснодарский край
Пользователь №: 46 094
|
Всё-таки вернулся к очередям. И уже сделал
Мьютексы задолбали, рекурсивные вызовы вызывают взаимную блокировку. Пробовал использовать рекурсивные мьютесы, но что-то не работают они у меня (возможно неправильно понимаю их суть)
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|