Easyelectronics.ru

Электроника для всех
Текущее время: 08 мар 2021, 08:51

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Kak лучше вести диалог
СообщениеДобавлено: 24 июл 2019, 23:29 
Здравствуйте!

Зарегистрирован: 24 июл 2019, 23:04
Сообщения: 4
Давно работаю с STM32, но решил использовать FreeRTOS первый раз, так что прошу совета бывалых.

Есть задача инициализировать LTE модем. Посылаем через UART команду, ждем (иногда до 3х минут!) ответа. Идем дальше. Что я пока сделал:
UART обрабатывается на прием через (круговой) DMA. По прерыванию из буффера DMA забираем байты и если конец строки, посылаем сигнал в отдельный поток, что есть строка. Там смотрим на строку и идем дальше. Посылаем очередную команду и ждем сигнала или таймаута. Вроде все просто. Но иногда модем выдает сразу несколько строчек. Например ОК и еще что-то. Я сделал просто: массив из нескольких строчек в который копируются байты и переменная - количество строк в этом буффере. Ясно, что это не решение в духе FreeRTOS. Наверное надо входящие данные писать в очередь? Но, как я понял, это значит лишнее копирование? Т.е. копирую из DMA буффера в еще один буффер, а когда встречу CR, оттуда в очередь? Или оставить свои несколько буфферов и в очередь ставить поинтер на новую строку?
И еще. Инициализация делается один раз. Теоретически можно этот поток закончить, но что это даст? Освободит место в куче, но я не создаю новых потоков, так что есть ли смысл?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Kak лучше вести диалог
СообщениеДобавлено: 24 июл 2019, 23:41 
Старожил

Зарегистрирован: 28 сен 2018, 00:25
Сообщения: 376
Счетный семафор из прерывания как счетчик полных строк в буфере, а в задаче обработки конечный автомат разгребающий ответы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Kak лучше вести диалог
СообщениеДобавлено: 25 июл 2019, 02:48 
Здравствуйте!

Зарегистрирован: 24 июл 2019, 23:04
Сообщения: 4
cubot писал(а):
Счетный семафор из прерывания как счетчик полных строк в буфере, а в задаче обработки конечный автомат разгребающий ответы.


Не до конца понятно. Скажем пришло "ОК" и почти сразу же еще "ХХХ". Записали 1+1 = 2 в семафор. Пока разгребаем "ОК", пришло "УУУ". Но семафор держим пока не обработаем "ХХХ". Значит прерывание блокируется на попытке записать 3 в семафор? Или запрещать прерывания на время разгребания?

А какие недостатки варианта кругового буффера полных строк и записи поинтера на каждую в очередь?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Kak лучше вести диалог
СообщениеДобавлено: 25 июл 2019, 20:56 
Старожил

Зарегистрирован: 28 сен 2018, 00:25
Сообщения: 376
Почему блокируется? Один поток (у вас прерывание) увеличивает счетчик, а второй поток разгребает строки и уменьшает. А зачем через очередь гонять указатели на строки? Если уж обработчик сообщений и так лазит в буфер - достаточно просто счетчика полных строк в буфере.
https://habr.com/ru/post/249283/

т.е. вы принимаете поток из уарта и на лету ловите CR - это один буфер. Потом перекидываете в кольцевой буфер полных строк - это второй буфер. Потом указатели в очередь - это уже фактически третий буфер. Я правильно понял? Не слишком-ли дофига буферов?

КМК, складывать из уарта в один кольцевой буфер и на лету ловить CR. Как только нашлось - увеличиваем счетный семафор. При этом задача разгребания ответов висит на ожидании изменения этого счетчика. Как только все полные строки обработаны - задача опять засыпает и ждет пока ось разбудит. Т.к. одна задача только пишет, а вторая только читает, об атомарности доступа к указателям на голову и хвост буфера нет необходимости беспокоиться.
Единственный минус который я вижу - этот кольцевой буфер и его указатели придется глобальными делать - не фэншуйно несколько.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Kak лучше вести диалог
СообщениеДобавлено: 25 июл 2019, 21:33 
Здравствуйте!

Зарегистрирован: 24 июл 2019, 23:04
Сообщения: 4
cubot писал(а):
Почему блокируется? Один поток (у вас прерывание) увеличивает счетчик, а второй поток разгребает строки и уменьшает.

Я думал, что вы предлагаете складывать полные строчки куда-то и увеличивать счетчик их колличества. Но кажется теперь понимаю, что вы предлагаете оставить реальные байты в DMA buffer, и только увеличивать счетчик полных строк. Это должно работать. Спасибо. И спасибо за ссылку.

Что до глобального буффера, так он не должен никак мешать. Пишет туда только DMA. Читает один поток, так что вроде беспокоиться не о чем.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Kak лучше вести диалог
СообщениеДобавлено: 25 июл 2019, 22:22 
Старожил

Зарегистрирован: 28 сен 2018, 00:25
Сообщения: 376
Ну я говорю - не фэншуйно.

В общем-то да, но еще возможны ошибки вида
int a;
a=5;
int bbb(int q)
{
static int a = 10;
здесь а==10, а не 5 как возможно хотелось.
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Kak лучше вести диалог
СообщениеДобавлено: 25 июл 2019, 23:12 
Здравствуйте!

Зарегистрирован: 24 июл 2019, 23:04
Сообщения: 4
cubot писал(а):
здесь а==10, а не 5 как возможно хотелось.
}


Ну в С всегда можно выстрелить себе в ногу, известное дело. Но в данном случае, если я правильно понимаю, "а" объявлено локальной переменной. То что static, значит не на стеке, а статически выделена память. Но в контексте bbb() "а" другое, чем глобальное. Или не так?

P.S. решил погуглить на всякий случай, в вроде я все понимаю правильно

Static local variables: variables declared as static inside a function are statically allocated while having the same scope as automatic local variables. Hence whatever values the function puts into its static local variables during one call will still be present when the function is called again.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Kak лучше вести диалог
СообщениеДобавлено: 26 июл 2019, 02:21 
Старожил

Зарегистрирован: 28 сен 2018, 00:25
Сообщения: 376
да, все так. статик, конечно, здесь никакого тайного смысла не несет..


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB