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

 
 
> Помогите разобраться с 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
Ответов
Димон Безпарольн...
сообщение Feb 18 2018, 14:54
Сообщение #2


Знающий
****

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



Хоть тут мне и приписали что я обвиняю в чем - то авторов MBED TLS (вероятно тоже "по делу"), хочу отдать должное - ребята грамотные, постарались на славу. Благодаря debug информации, проверкам конфигурации такая сложная библиотека не так уж трудно отлаживается. Респект.

Что касается самого DBUG, то сколько тут местные "помощники" ни надрывались, ничего нового не придумали - не можешь ждать, делай буфер шире. Как промежуточное решение - задержка перед критическим во времени местом выполнения, чтобы войти в этот кусок кода с чистым буфером. Тогда буфер можно сделать меньше. Это вкратце.

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


Гуру
******

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



Цитата(Димон Безпарольный @ Feb 18 2018, 17:54) *
то сколько тут местные "помощники" ни надрывались, ничего нового не придумали - не можешь ждать, делай буфер шире.

Ровно так же никто из профи не сможет ничего придумать, чтобы по вашему желанию "2х2=5".
Грамотное решение - попросить вторую сторону не присылать данные, к обработке которых вы не готовы.
TCP позволяет это делать, причем очень гибко и грамотно. Если вы не хотите разобраться как это сделать, то да - увеличивайте буфер,
но не надо в код вставлять задержки, даже если сейчас это работает. И точно не нужно хамить людям, которые считают такой подход
дурным тоном программирования.
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
- - jcxz   Цитата(Димон Безпарольный @ Feb 16 2018, 05...   Feb 16 2018, 07:36
|- - Димон Безпарольный   Цитата(jcxz @ Feb 16 2018, 10:36) Задержк...   Feb 16 2018, 09:44
|- - Эдди   Цитата(Димон Безпарольный @ Feb 16 2018, 12...   Feb 16 2018, 10:18
||- - Димон Безпарольный   Цитата(Эдди @ Feb 16 2018, 13:18) Сам он ...   Feb 16 2018, 10:50
||- - Эдди   Цитата(Димон Безпарольный @ 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
||- - 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
||- - Димон Безпарольный   Цитата(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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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