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

 
 
> Помогите разобраться с PRINTF, Большой обьем выводимой информации - 5К
Димон Безпарольн...
сообщение Feb 16 2018, 03:26
Сообщение #1


Знающий
****

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



Не хочется создавать большой кольцевой буфер для PRINTF. Поступил по - другому. С задержкой.

Посчитав что PRINTF работает через int fputc(int ch, FILE *f), в ней и написал:

Код
int fputc(int ch, FILE *f)                  //Внутри функции реализована задержка заполнения
{                                            //буфера для уменьшения размера буфера.
static unsigned int StreamWaitCnt = 0;        //
    StreamWaitCnt++;                        //Счетчик числа передаваемых байт
    if (StreamWaitCnt > PC_TxBufSize-5)        //Если счеттчик достиг размера буфера
        {                                    //
            StreamWaitCnt = 0;                //Обнулить счетчик
            HAL_Delay(30);                    //Задержка пока буфер улетит в порт
        }                                    //
    return (PC_Putchar(ch));                 //
}                                            //


Т.е. когда буфер заполняется, происходит задержка для ожидания завершения передачи буфера в порт. Передача осуществляется через прерывание:


Код
int PC_Putchar(int ch)                         //Передача. Функция помещает Ch в кольцевой буфер.
{                                             //Указатель головы кольцевого буфера перемещается на
    int tmphead = (PC_TxHead + 1) & PC_TX_BUFFER_MASK; //одну позицию, символ помещается в кольцевой буфер.
    PC_TxBuf[tmphead] = (char)ch;               //Если передача первая после опустошения
    PC_TxHead = tmphead;                    //буфера(переданы все символы), взводится флаг L86_Complete,
        if (PC_Complete==0)                    //Передаваемый символ помещается в передающий регистр порта
        {                                     //(L86_UsartTx();) и инициируется первая передача
            PC_Complete = 1;                //в цепочке - разрешением прерывания.
            PC_UsartTx();                     //Флаг начала цепочки передач
            PC_En_Tranfer_Interrupt;        //Положить первый символ в DR
        }                                     //
    return (ch);                            //
}                                             //



Само прерывание:

Код
void USART2_IRQHandler(void)
{
    if (USART2->ISR & USART_ISR_TC)                 //Bit 6 TC: Transmission complete
    {                                             //
        PC_UsartTx();                             //
    }                                            //
    if (USART2->ISR & USART_ISR_RXNE)             //Bit 5 RXNE: Read data register not empty
    {                                             //
        PC_UsartRx();                            //Функция кладет байт из приёмного регистра в кольцевой буфер
    }                                             //
  HAL_UART_IRQHandler(&huart2);
}



Код
void PC_UsartTx(void)                         //
{                                             //
    if (PC_TxHead != PC_TxTail)                //Check if all data is transmitted
    {                                         //
        PC_TxTail = (PC_TxTail + 1) & PC_TX_BUFFER_MASK;//Перемещение указателя по кольцевому буферу
        USART2->TDR = (int)PC_TxBuf[PC_TxTail];    //Start transmition
    }                                         //
    else                                    //
    {                                        //
        PC_Complete=0;                        //Цепочка передачи окончена
        PC_Dis_Tranfer_Interrupt;            //Запретить прерывание на передачу Bit 6 TCIE:
    }                                        //
}                                             //


Самой задержки (30мс) по идее должно хватать. Т.е. при скорости 115200 за 1 секунду улетает 10килобайт. Примерно. Значит за милисекунду - 10 байт. Итого - 300байт при буфере в 256.

Такой подход по идее должен разрешать иметь любой малый (в разумных пределах) буфер для передачи. На практике же это не работает - часть выводимой информации теряется. И только когда я делаю #define PC_TxBufSize 8192, передача осуществляется без потерь.

Где же я не прав, может кто подскажет?

Сообщение отредактировал Димон Безпарольный - Feb 16 2018, 03:31
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Feb 16 2018, 07:36
Сообщение #2


Гуру
******

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



Цитата(Димон Безпарольный @ Feb 16 2018, 05:26) *
Самой задержки (30мс) по идее должно хватать.

Задержки - типичный ардуино-подход, дилетантский.
Для вывода в поток с помощью printf() никаких задержек вообще не нужно. И размер буфера может быть абсолютно любым, хоть 1 байт. Буфер только даёт возможность более эффективно использовать быстродействие CPU - в среднем уменьшает загрузку CPU.
Если у Вас что-то не работает из-за изменения размеров буфера или требует каких-то задержек - правьте консерваторию.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Feb 16 2018, 09:44
Сообщение #3


Знающий
****

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



Цитата(jcxz @ Feb 16 2018, 10:36) *
Задержки - типичный ардуино-подход, дилетантский.
Для вывода в поток с помощью printf() никаких задержек вообще не нужно. И размер буфера может быть абсолютно любым, хоть 1 байт. Буфер только даёт возможность более эффективно использовать быстродействие CPU - в среднем уменьшает загрузку CPU.
Если у Вас что-то не работает из-за изменения размеров буфера или требует каких-то задержек - правьте консерваторию.

Интересная точка зрения. Ну допустим буфер 128 байт. Кольцевой. За пару милисекунд проц настрочил 5кб текста и выплюнул все это в кольцевой буфер. А с одним байтом будет еще прикольнее. Наверно только первый байт от 5кб и попадет в терминал. Мож и не первый...
Go to the top of the page
 
+Quote Post
Эдди
сообщение Feb 16 2018, 10:18
Сообщение #4


Знающий
****

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



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

Сам он это не выплюнет, он сделает так, как ему разработчик велел. И если разработчик не проверяет коды возврата из процедур, это его личные проблемы!
Если хочется использовать printf (хотя эта штука ну слишком уж жирная!), то она, если что, тоже возвращает количество принятых символов. И вместо фиксированного времени ожидания можно лишь подождать, пока буфер не освободится и закинуть в него критическое сообщение. Некритическое же вообще можно опустить (но для этого придется дописать простой макрос, возвращающий количество свободных символов в буфере).
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Feb 16 2018, 10:50
Сообщение #5


Знающий
****

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



Цитата(Эдди @ Feb 16 2018, 13:18) *
Сам он это не выплюнет, он сделает так, как ему разработчик велел. И если разработчик не проверяет коды возврата из процедур, это его личные проблемы!
Если хочется использовать printf (хотя эта штука ну слишком уж жирная!), то она, если что, тоже возвращает количество принятых символов. И вместо фиксированного времени ожидания можно лишь подождать, пока буфер не освободится и закинуть в него критическое сообщение. Некритическое же вообще можно опустить (но для этого придется дописать простой макрос, возвращающий количество свободных символов в буфере).

printf использует библиотека MBEDTLS, нужен форматирванный вывод.

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

Цитата
можно лишь подождать, пока буфер не освободится


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

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

Сообщение отредактировал Димон Безпарольный - Feb 16 2018, 10:52
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 16 2018, 14:51
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 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
Сообщение #8


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

Группа: Участник
Сообщений: 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
jcxz
сообщение Feb 17 2018, 10:23
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 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

Сообщений в этой теме
- Димон Безпарольный   Помогите разобраться с PRINTF   Feb 16 2018, 03:26
- - mcheb   Я бился с такой проблемой, не решил. Сделал так. О...   Feb 16 2018, 04:24
|- - Димон Безпарольный   Цитата(mcheb @ Feb 16 2018, 07:24) Я билс...   Feb 16 2018, 06:10
- - adnega   Цитата(Димон Безпарольный @ Feb 16 2018, 06...   Feb 16 2018, 05:39
|- - mcheb   Цитата(adnega @ Feb 16 2018, 09:39) А вы ...   Feb 16 2018, 05:51
|- - adnega   Цитата(mcheb @ Feb 16 2018, 08:51) на STM...   Feb 16 2018, 06:16
|- - x893   Цитата(adnega @ Feb 16 2018, 09:16) Я при...   Feb 16 2018, 06:55
|- - adnega   Цитата(x893 @ Feb 16 2018, 09:55) Конечно...   Feb 16 2018, 07:05
||- - Эдди   Цитата(Димон Безпарольный @ Feb 16 2018, 13...   Feb 16 2018, 11:27
||- - x893   Цитата(Димон Безпарольный @ Feb 16 2018, 13...   Feb 16 2018, 11:35
||- - HardEgor   Цитата(Димон Безпарольный @ Feb 16 2018, 17...   Feb 16 2018, 13:42
|||- - Димон Безпарольный   Цитата(HardEgor @ Feb 16 2018, 16:42) Хех...   Feb 16 2018, 13:49
|||- - HardEgor   Цитата(Димон Безпарольный @ Feb 16 2018, 20...   Feb 16 2018, 23:50
|||- - HardEgor   Цитата(jcxz @ Feb 17 2018, 17:23) Видимо ...   Feb 17 2018, 12:18
||- - adnega   Цитата(Димон Безпарольный @ Feb 16 2018, 20...   Feb 16 2018, 19:41
||- - Димон Безпарольный   Цитата(adnega @ Feb 16 2018, 22:41) Вы мо...   Feb 17 2018, 01:54
|- - jcxz   Цитата(Димон Безпарольный @ Feb 16 2018, 11...   Feb 16 2018, 12:41
|- - Димон Безпарольный   Цитата(jcxz @ Feb 16 2018, 15:41) можно з...   Feb 16 2018, 13:42
- - x893   Я делал совсем по простому 2 буфера линейных ПДП т...   Feb 16 2018, 08:18
- - Эдди   Проверяйте в функции отправки сообщения статус воз...   Feb 16 2018, 08:23
- - mcheb   Очень может быть, что сбои (потери) байтов из-за п...   Feb 16 2018, 09:27
- - Эдди   Почему же? Есть еще одно решение: отдельно выделен...   Feb 16 2018, 14:14
- - Димон Безпарольный   Да, наверно надо было рассказать об архитектуре. К...   Feb 17 2018, 12:15
|- - jcxz   Цитата(Димон Безпарольный @ Feb 17 2018, 14...   Feb 17 2018, 12:53
- - Димон Безпарольный   И кому из нас здесь хочется потрепаться? Столько б...   Feb 17 2018, 12:20
- - Димон Безпарольный   FT232. Странное дело. Вроде компов - то с комом не...   Feb 17 2018, 12:56
|- - jcxz   Цитата(Димон Безпарольный @ Feb 17 2018, 14...   Feb 17 2018, 13:15
- - Димон Безпарольный   Зачем столько букв писать? Я получил информацию от...   Feb 17 2018, 13:34
|- - adnega   Цитата(Димон Безпарольный @ Feb 17 2018, 16...   Feb 17 2018, 14:54
- - Димон Безпарольный   Мне этот подход знаком - самое главное не замечать...   Feb 18 2018, 02:38
|- - adnega   Цитата(Димон Безпарольный @ Feb 18 2018, 05...   Feb 18 2018, 07:11
|- - Сергей Борщ   QUOTE (Димон Безпарольный @ Feb 18 2018, 04...   Feb 18 2018, 08:42
|- - Димон Безпарольный   Цитата(adnega @ Feb 18 2018, 10:11) Дык, ...   Feb 18 2018, 09:09
||- - adnega   Цитата(Димон Безпарольный @ Feb 18 2018, 12...   Feb 18 2018, 11:14
|- - jcxz   Цитата(adnega @ Feb 18 2018, 09:11) Боюсь...   Feb 18 2018, 11:30
- - Димон Безпарольный   Попытки "помочь" как раз и начались у эт...   Feb 18 2018, 13:26
|- - adnega   Цитата(Димон Безпарольный @ Feb 18 2018, 16...   Feb 18 2018, 13:34
- - Димон Безпарольный   Хоть тут мне и приписали что я обвиняю в чем - то ...   Feb 18 2018, 14:54
|- - adnega   Цитата(Димон Безпарольный @ Feb 18 2018, 17...   Feb 18 2018, 15:23
||- - Димон Безпарольный   Цитата(adnega @ Feb 18 2018, 18:23) Ровно...   Feb 18 2018, 15:59
||- - HardEgor   Цитата(Димон Безпарольный @ Feb 18 2018, 22...   Feb 18 2018, 16:10
|||- - Димон Безпарольный   Цитата(HardEgor @ Feb 18 2018, 19:10) Зав...   Feb 18 2018, 16:43
|||- - HardEgor   Цитата(Димон Безпарольный @ Feb 18 2018, 23...   Feb 18 2018, 17:32
||- - adnega   Цитата(Димон Безпарольный @ Feb 18 2018, 18...   Feb 18 2018, 16:59
|- - Эдди   Цитата(Димон Безпарольный @ Feb 18 2018, 17...   Feb 18 2018, 15:32
- - Эдди   Это оно без сбоев работает, пока не понадобилось е...   Feb 18 2018, 16:07
- - Димон Безпарольный   Я уже писал, что аппаратная реализация не предусма...   Feb 18 2018, 17:04
|- - adnega   Цитата(Димон Безпарольный @ Feb 18 2018, 20...   Feb 18 2018, 17:32
- - Димон Безпарольный   Стандарт как раз такое допскает. Задержка нужна бы...   Feb 19 2018, 01:51
- - Димон Безпарольный   Может кому пригодится - когда начал дорабатывать в...   Feb 26 2018, 16:34
- - x893   Это уже всем ёжикам известно. Но за заботу огромно...   Feb 26 2018, 22:20
- - Димон Безпарольный   Какие же все таки люди злые.   Feb 27 2018, 05:33


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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 00:24
Рейтинг@Mail.ru


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