|
Помогите разобраться с PRINTF, Большой обьем выводимой информации - 5К |
|
|
|
Feb 16 2018, 03:26
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Feb 18 2018, 15:23
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Димон Безпарольный @ Feb 18 2018, 17:54)  то сколько тут местные "помощники" ни надрывались, ничего нового не придумали - не можешь ждать, делай буфер шире. Ровно так же никто из профи не сможет ничего придумать, чтобы по вашему желанию "2х2=5". Грамотное решение - попросить вторую сторону не присылать данные, к обработке которых вы не готовы. TCP позволяет это делать, причем очень гибко и грамотно. Если вы не хотите разобраться как это сделать, то да - увеличивайте буфер, но не надо в код вставлять задержки, даже если сейчас это работает. И точно не нужно хамить людям, которые считают такой подход дурным тоном программирования.
|
|
|
|
Сообщений в этой теме
Димон Безпарольный Помогите разобраться с 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|