реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Closed TopicStart new topic
> Помогите разобраться с PRINTF, Большой обьем выводимой информации - 5К
Эдди
сообщение Feb 16 2018, 11:27
Сообщение #16


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Цитата(Димон Безпарольный @ Feb 16 2018, 13:50) *
printf использует библиотека MBEDTLS, нужен форматирванный вывод.
Если вы не можете обойтись без дырявой библиотеки, правьте ее код и высылайте пулл-риквесты автору.
Go to the top of the page
 
+Quote Post
x893
сообщение Feb 16 2018, 11:35
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Цитата(Димон Безпарольный @ Feb 16 2018, 13:50) *
printf использует библиотека MBEDTLS, нужен форматирванный вывод.

Суть во всем это одна -



Я так и делал, но другим способом - наблюдая за головой и хвостом.

В данном случае это ПОКА неприемлимо. Сервер выкидывает HandShake, следом сертификаты. Так вот. С выводом debug информации не получается успевать декодировать первое сообщение - его затирает втрое.

Для этого люди придумали блокирующий и неблокирующий вывод.
Ещё есть вывод через RTT (тоже нескольких типов).
Вы уж определитесь, что Вам нужно, а потом можно код строчить.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 16 2018, 12:41
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Димон Безпарольный @ Feb 16 2018, 11:44) *
За пару милисекунд проц настрочил 5кб текста и выплюнул все это в кольцевой буфер. А с одним байтом будет еще прикольнее. Наверно только первый байт от 5кб и попадет в терминал. Мож и не первый...

Проц сам ничего не "строчит". Если Вы так пишете своё ПО, что у Вас байты попадают или не попадают куда-то по воле случая, то пенять надо только на себя.
Если немного включить голову и понять, что при заполнении буфера, задачу в которой выполняется printf(), можно заблокировать до момента освобождения места в этом буфере, то всё получится с любым размером буфера. ISR или DMA передаст часть данных из буфера в UART и сообщит об этом ждущей задаче (с printf-ом), разбудит её, чтобы она могла дописать ещё байты в буфер.
И всё. Всё элементарно. Но ардуинщики продолжают городить задержки, и удивляются что у них кто-то куда-то "строчит" и уже не хватает даже килобайтов памяти на ерундовую задачу... laughing.gif
PS: У меня printf вполне себе нормально формирует HTTP-ответы (в HTTP-сервере) большими потоками и нескольким клиентам параллельно. И обходится минимальными буферами.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Feb 16 2018, 13:42
Сообщение #19


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(jcxz @ Feb 16 2018, 15:41) *
можно заблокировать до момента освобождения места в этом буфере, то всё получится с любым размером буфера.

Можно и дальше гнуть свое, не читая что я пишу, но толку от этого не будет. Много букв и все впустую.

Заблокировать до момента... как раз нельзя. Нельзя прервать выполнение программы до определенного момента. Я об этом выше писал. И этот код, должный быть выполнен за минимальное время формирует большой поток DEBUG информации. Складывать его кроме как в буфер некуда. Задержка - не лучший выход, полинг - не выход. Остается только буфер.

P.S.
Я даже не ардуинщик - я тупой и еще тупее. Пнумпень вообщем. Это чтоб Вам было спокойней.
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Feb 16 2018, 13:42
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Димон Безпарольный @ Feb 16 2018, 17:50) *
В данном случае это ПОКА неприемлимо. Сервер выкидывает HandShake, следом сертификаты. Так вот. С выводом debug информации не получается успевать декодировать первое сообщение - его затирает втрое.

Хех, природу не наебе.. обманешь.
Если скорость поступления байтов от сервера выше чем скорость обработки и вывода printf, то либо увеличивайте буфер, либо просите сервер подождать с передачей пакетов а также размер пакета от сервера уменьшайте до размера вашего буфера.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Feb 16 2018, 13:49
Сообщение #21


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(HardEgor @ Feb 16 2018, 16:42) *
Хех, природу не наебе.. обманешь.
Если скорость поступления байтов от сервера выше чем скорость обработки и вывода printf, то либо увеличивайте буфер, либо просите сервер подождать с передачей пакетов а также размер пакета от сервера уменьшайте до размера вашего буфера.

Даже не представляю как на стадии Hanshake это сделать. Стандарт этого не предусматривает. Более того, после HandShake в меня через миллисекунды вываливаются сертификаты. Если не успеть обработать Hanshake, то его в буфере забивают сертификаты. А мне бы хотелось еще и DEBUG почитать. Но Вы правы. Кроме огромного 8кБ буфера кажется решений не существует.
Go to the top of the page
 
+Quote Post
Эдди
сообщение Feb 16 2018, 14:14
Сообщение #22


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Почему же? Есть еще одно решение: отдельно выделенный микроконтроллер, который только и будет что "общаться".
Но лучше уж, если так надо много данных хранить, взять МК пожирней.
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 16 2018, 14:51
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Димон Безпарольный @ Feb 16 2018, 13:50) *
Сервер выкидывает HandShake, следом сертификаты. Так вот. С выводом debug информации не получается успевать декодировать первое сообщение - его затирает втрое.

А по какому каналу связь с сервером? Какой протокол?
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Feb 16 2018, 17:02
Сообщение #24


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(adnega @ Feb 16 2018, 17:51) *
А по какому каналу связь с сервером? Какой протокол?

Протокол MQTT уже отлажен. Теперь надо все закрыть TLS.

Дошел до parse certificate. Застрял с проблемой вывода отладочной информации. Сервер internetofthings.ibmcloud.com

Сообщение отредактировал Димон Безпарольный - Feb 16 2018, 17:07
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Feb 16 2018, 17:33
Сообщение #25


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Димон Безпарольный @ Feb 16 2018, 20:02) *
Дошел до ..


чисто по коду в первом посте...
1) задержку надо делать не после а ДО вывода. Тогда возможно шансов упереться в ожидание - снижается, хотя фокусов не бывает. поток вывода из мк, должен обеспечивать скорострельность софта генерящего эти мессаги.
2) если у вас буффер(или предполагаете его юзать) - то ждать надо не абстрактное число мкс а именно свободное место в буффере вывода. Но буффер для дебажного вывода - не есть гуд. когда мозги подвисают - всё самое интересное именно не успеет уйти...

по поводу вообще логики логгирования и метрии..
- рекомендую глянуть готовую либу libp7-baical. Она под мк так-же...


удачи вам
(круглый)
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 16 2018, 19:41
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Димон Безпарольный @ Feb 16 2018, 20:02) *
Протокол MQTT уже отлажен.

Цитата
Протокол MQTT работает на прикладном уровне поверх TCP/IP

Вы можете стандартными средствами TCP притормозить выдачу данных удаленной стороной, чтобы она вам буфер не перезаписывала.
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Feb 16 2018, 23:50
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Димон Безпарольный @ Feb 16 2018, 20:49) *
Даже не представляю как на стадии Hanshake это сделать. Стандарт этого не предусматривает. Более того, после HandShake в меня через миллисекунды вываливаются сертификаты. Если не успеть обработать Hanshake, то его в буфере забивают сертификаты. А мне бы хотелось еще и DEBUG почитать. Но Вы правы. Кроме огромного 8кБ буфера кажется решений не существует.

Что за дурацкий протокол без подтверждения приема?
Стоп, а каким образом на незавершенный hanshake начинают слать сертификаты? Вы же еще не договорились с удаленной стороной?
А если вы не успели обработать сертификаты, сервер начинает слать данные, которые забивают сертификаты??? 8-)
Либо в протоколе всё это есть и вы не разобрались с самой сложной частью протокола, либо протокол тупо рассчитан на большие компьютеры и естественно плохо ложится на микроконтроллеры.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Feb 17 2018, 01:54
Сообщение #28


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(adnega @ Feb 16 2018, 22:41) *
Вы можете стандартными средствами TCP притормозить выдачу данных удаленной стороной, чтобы она вам буфер не перезаписывала.

Не нашел такой возможности у модулей Quectel M95. Наверно аппаратно можно RTS - CTS. Но они не заведены.

Цитата(HardEgor @ Feb 17 2018, 02:50) *
Что за дурацкий протокол без подтверждения приема?
Стоп, а каким образом на незавершенный hanshake начинают слать сертификаты? Вы же еще не договорились с удаленной стороной?
А если вы не успели обработать сертификаты, сервер начинает слать данные, которые забивают сертификаты??? 8-)
Либо в протоколе всё это есть и вы не разобрались с самой сложной частью протокола, либо протокол тупо рассчитан на большие компьютеры и естественно плохо ложится на микроконтроллеры.

Второе от части верно. Может я неправильно выразился. Первая часть hanshake - это когда сервер сообщает о выбранном шифронаборе из предложенных абонентом. После этого вываливает сертификаты. Но контроллер то не слабый - Cortex M3. L151 STM.

Проблему частично решил пока вставив в некритичные во времени места библиотеки TLS функцию:

Код
void Wait_PC_USART_TX_FLUSH(void)
{
    while(PC_TxHead == PC_TxTail)
        {PC_En_Tranfer_Interrupt;}
}


Это позволило уменьшить буфер с 8 до 2Кб. Информация выводится без потерь.

Сообщение отредактировал Димон Безпарольный - Feb 17 2018, 02:26
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 17 2018, 10:23
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(kolobok0 @ Feb 16 2018, 19:33) *
2) если у вас буффер(или предполагаете его юзать) - то ждать надо не абстрактное число мкс а именно свободное место в буффере вывода. Но буффер для дебажного вывода - не есть гуд. когда мозги подвисают - всё самое интересное именно не успеет уйти...

Если надо одномоментно выдать большой объём данных без приостановки процесса их выдающего, то тут - или увеличивать буфер или увеличивать скорость канала связи. Больше никак.
А с подвисанием мозгов, если такое имеет место быть, надо бороться отдельно - сперва устранить причины зависания, а потом думать о корректном выводе отладочной информации. Естественно, что все fault-ы должны корректно обрабатываться и выводиться в лог. Тогда количество "зависаний" резко сократится.

Цитата(Димон Безпарольный @ Feb 17 2018, 03:54) *
Не нашел такой возможности у модулей Quectel M95. Наверно аппаратно можно RTS - CTS. Но они не заведены.

Видимо этот косяк надо исправить. laughing.gif
Хотя аппаратный flowcontrol по UART может быть управлением потоком только именно по UART, между модулем и МК. И никак не влиять на TCP-сокет. Управлять потоком надо именно в TCP-сокете, т.е. - там где расположен стек.

PS: Изначально автор писал о переполнении вывода по UART, постепенно нарисовался ещё TCP (где-то) и, видимо, этот TCP находится в некоем модуле, подключенном по UART (другому или этому же самому?). А переполнение видимо идёт в другом UART (?), через который выводится отладочный лог. Или не так?
Автор в шапке треда написал чрезмерно много буков, но не удосужился даже мельком описать свою архитектуру.
Вобщем - для форумчан предлагается очередной конкурс-угадайка для экстрасенсов. Видимо автору не нужна реальная помощь, а просто хочется потрепаться... wacko.gif
Если для проблемного вывода отладки используется именно отдельный интерфейс, то тут только или тормозить отлаживаемый процесс (управлением потоком), или увеличить скорость отладочного интерфейса. Не вижу проблем поднять скорость UART до 921600 даже на таком дохлом МК как у автора (RC-генератор - не есть препятствие для этого, препятствие есть - не использование DMA на таком МК). Ещё больше поднять скорость можно заменив вывод в UART, каким-то другим интерфейсом, например: вывод в параллельный порт, USB, Ethernet, ...
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Feb 17 2018, 12:15
Сообщение #30


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Да, наверно надо было рассказать об архитектуре. К процессору по уартам подключены модули ESP-05 WiFi и M95 GSM.
По отдельному порту работает DEBUG. C ним и проблемы.

Задача - собрать информацию и отправить ее на MQTT сервер. Это отлажено и работает уже в железках. Теперь начальство возгордилось своим детищем и решило закрыть все это TLSом. Подводная лодка же. Вот тут и начались проблемы описанные выше. Скорость Debug сейчас 460800.

Да, обнаружилась таки еще проблема уже с железом не связанная. При больших потоках байты таки теряются уже в интерфейсе USB. Приходится таки выдавать с задержками. Тогда работает.

Сообщение отредактировал Димон Безпарольный - Feb 17 2018, 12:18
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 22:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01528 секунд с 7
ELECTRONIX ©2004-2016