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

 
 
> Помогите разобраться с 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, 02:38
Сообщение #2


Знающий
****

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



Мне этот подход знаком - самое главное не замечать что хамство и переход на личность начался с 29 поста и обвинять в этом только меня. Терпел до последнего, но господин принял вежливость за слабость и не унялся.

Здесь вполне уважаемые люди, но без гнильцы не обходится ни один форум. У товарища гонору как у Циолковского, а желания разбираться нет. Видимо и знаний тоже нет.

Здесь только один человек придрался к задержкам не пожелав разобраться в сути. Даже когда я написал, что проблема УЖЕ не в контроллере, пакеты теряются за ним - он не унялся. Число байт ушедших в DR больше чем выплюнул терминал на 1-3байта на 8Кб информации. Поскольку данные не искажаются, я склонен полагать что частоты не смещены. И только ЗАДЕРЖКА в некритичных во времени местах решила эту проблему, я думаю что Вы уже догадались почему.

У Вас желания тоже не нашлось. У меня другая ситуация чем то, что Вы написали. Замечательно что Вы обошлись без памяти и у Вас просто все это работает. Рад за Вас. Вы просто герой.

Я НЕ могу ничего отложить. В меня последовательно выплевывают тремя пакетами - таков алгоритм HANDSHAKE. Я должен их обработать в реальном времени. Задержка между пакетами - милисекунды. Поэтому если я занимаюсь выводом DEBUG информации с ОЖИДАНИЕМ появления в буфере свободного места - я ПРОСТО ТЕРЯЮ ПАКЕТЫ.

ЗДЕРЖКА в некритичных во времени местах помогает снизить размер кольцевого буфера PC порта с 8 до 2кБ. Предложите другой способ - обсудим.

Ну как до "светочей" разума и всяких свидомитов донести эту простую мысль? Третий раз пишу. А мне намекают на консерваторию. Зачем тартить жизнь на написание глупостей особенно если считаешь себя Циолковским?

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


Гуру
******

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



Цитата(Димон Безпарольный @ Feb 18 2018, 05:38) *
Я должен их обработать в реальном времени.

Дык, вы же их обрабатываете без проблем. Просто вы хотите параллельно зачем-то сгенерить гораздо большую по объему отладочную информацию и успеть ее выплюнуть. Старайтесь в отладку выкидывать только ошибки и результат обработчика HardFault. Что вам мешает подключиться к uart от модема и записывать весь обмен, а затем его обрабатывать (в том числе и с помощью спецутилит)?

Цитата(Димон Безпарольный @ Feb 18 2018, 05:38) *
Ну как до "светочей" разума и всяких свидомитов донести эту простую мысль? Третий раз пишу.

Дык, попытайтесь писать суть, а не "много букв". Не всегда, чем длиннее текст, тем там больше информации.
Как называется ваша тема? И при чем тут printf, когда причина у вас в совершенно другом месте?
Боюсь, если вы не поменяете манеру общения, то заработаете на этом форуме себе такую репутацию, что большинство профи откажутся вам помогать.
У меня позиция, что отвечая на форуме - помогаешь не ТС, а всем, т.к. кто-то может столкнуться с аналогичной проблемой в будущем.
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
|- - Сергей Борщ   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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 05:57
Рейтинг@Mail.ru


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