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

 
 
> Помогите разобраться с 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
HardEgor
сообщение Feb 16 2018, 13:42
Сообщение #6


Гуру
******

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


Знающий
****

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


Гуру
******

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

Сообщений в этой теме
- Димон Безпарольный   Помогите разобраться с 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
||- - adnega   Цитата(Димон Безпарольный @ Feb 16 2018, 13...   Feb 16 2018, 14:51
||- - Димон Безпарольный   Цитата(adnega @ Feb 16 2018, 17:51) А по ...   Feb 16 2018, 17:02
||- - kolobok0   Цитата(Димон Безпарольный @ Feb 16 2018, 20...   Feb 16 2018, 17:33
|||- - jcxz   Цитата(kolobok0 @ Feb 16 2018, 19:33) 2) ...   Feb 17 2018, 10:23
|||- - 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:08
Рейтинг@Mail.ru


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