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

 
 
> Помогите разобраться с 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

Сообщений в этой теме
- Димон Безпарольный   Помогите разобраться с 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
- - Димон Безпарольный   Хоть тут мне и приписали что я обвиняю в чем - то ...   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
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


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


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