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

 
 
> Помогите разобраться с 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
4 страниц V  « < 2 3 4  
Start new topic
Ответов (45 - 59)
Димон Безпарольн...
сообщение Feb 18 2018, 14:54
Сообщение #46


Знающий
****

Группа: Участник
Сообщений: 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
Сообщение #47


Гуру
******

Группа: Свой
Сообщений: 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
Эдди
сообщение Feb 18 2018, 15:32
Сообщение #48


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Цитата(Димон Безпарольный @ Feb 18 2018, 17:54) *
Хоть тут мне и приписали что я обвиняю в чем - то авторов MBED TLS (вероятно тоже "по делу"), хочу отдать должное - ребята грамотные, постарались на славу.

Да ладно!
То-то чрез одно место оно работает…
Хотя, надо еще уточнить, по чьей вине: то ли вы, товарищ, неправильно документацию читаете, то ли авторы этой библиотеки...
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Feb 18 2018, 15:59
Сообщение #49


Знающий
****

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



Цитата(adnega @ Feb 18 2018, 18:23) *
Ровно так же никто из профи не сможет ничего придумать, чтобы по вашему желанию "2х2=5".
Грамотное решение - попросить вторую сторону не присылать данные, к обработке которых вы не готовы.
TCP позволяет это делать, причем очень гибко и грамотно. Если вы не хотите разобраться как это сделать, то да - увеличивайте буфер,
но не надо в код вставлять задержки, даже если сейчас это работает. И точно не нужно хамить людям, которые считают такой подход
дурным тоном программирования.



Никто и не собирался изначально хамить. Хамство и переход на личности начался с 29 поста. Я лишь вежливо просил не гадить в этой теме. Но "помошник" так и не понял о чем его просят.

Что касается 2х2 =5, люди предлагают иногда нестандартные решения. На это и надеялся. Но нарвался на хама . знал бы - не начинал бы сюда писать.

На стадии handshake сервер ждать не будет. Так обьяснили инженеры IBM. Связано с загрузкой серверов. Да и я не представляю сейчас как это сделать через M95 в котором TCP реализован внутри.



Цитата(Эдди @ Feb 18 2018, 18:32) *
Да ладно!
То-то чрез одно место оно работает…
Хотя, надо еще уточнить, по чьей вине: то ли вы, товарищ, неправильно документацию читаете, то ли авторы этой библиотеки...

Ну Вам конечно виднее. Вы же код писали - не я. Работает нормально. Третий час - без сбоев.

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


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Это оно без сбоев работает, пока не понадобилось еще что-то добавить. А там опять та же песня пойдет?
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Feb 18 2018, 16:10
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Димон Безпарольный @ Feb 18 2018, 22:59) *
На стадии handshake сервер ждать не будет. Так обьяснили инженеры IBM. Связано с загрузкой серверов. Да и я не представляю сейчас как это сделать через M95 в котором TCP реализован внутри.

Завтра у них немного изменится размер hadshake, сертификатов, или задержка в одном месте появится, а в другом исчезнет и у вас внезапно всё перестанет работать. Или вдруг сервер сменится....
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Feb 18 2018, 16:43
Сообщение #52


Знающий
****

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



Цитата(HardEgor @ Feb 18 2018, 19:10) *
Завтра у них немного изменится размер hadshake, сертификатов, или задержка в одном месте появится, а в другом исчезнет и у вас внезапно всё перестанет работать. Или вдруг сервер сменится....

Вы наверно стандарт не читали. Весь мир работает с серверами MQTT IBM. В России кучу железа понаделали. Откуда столько страхов?
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 18 2018, 16:59
Сообщение #53


Гуру
******

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



Цитата(Димон Безпарольный @ Feb 18 2018, 18:59) *
Да и я не представляю сейчас как это сделать через M95 в котором TCP реализован внутри.

Почитать Инструкцию
Цитата
When the data transfer should be suspended, the CTS line is set inactive until the transfer from the receiving buffer has
completed. When the receiving buffer is ok to receive more data, CTS goes active once again.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Feb 18 2018, 17:04
Сообщение #54


Знающий
****

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



Я уже писал, что аппаратная реализация не предусматривает пару RTS - CTS. К тому же в модулях ESP - 05 эти сигналы наружу не выведены. В изделии два радиомодуля.



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


Гуру
******

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



Цитата(Димон Безпарольный @ Feb 18 2018, 20:04) *
Я уже писал, что аппаратная реализация не предусматривает пару RTS - CTS. К тому же в модулях ESP - 05 эти сигналы наружу не выведены. В изделии два радиомодуля.

Вам же для отладки нужно. Киньте проводком. Когда все отладите - отключите debug-вывод портянок и уберете провод.
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Feb 18 2018, 17:32
Сообщение #56


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Димон Безпарольный @ Feb 18 2018, 23:43) *
Вы наверно стандарт не читали. Весь мир работает с серверами MQTT IBM. В России кучу железа понаделали. Откуда столько страхов?

А мне и не надо читать. Если в программе требуется подбор задержек - значит программа неправильно построена. И эта неправильность внезапно вылезет в самый неподходящий момент. Вы же сами писали:
Цитата(Димон Безпарольный)
На стадии handshake сервер ждать не будет. Так обьяснили инженеры IBM. Связано с загрузкой серверов.

А завтра у инженеров IBM что-нибудь еще возникнет и они еще чего-нибудь поменяют....
Вот в этом и состоит разница между между профессиональным и дилетантским(читай начинающего) подходом, профессионал во-первых руководствуется правилами и стандартами при разработке, во-вторых он видит и понимает "подводные камни" которые могут возникнуть или точно проявятся и смотрит в перспективу. А дилетант говорит - у меня всё работает отлично, остальное меня не волнует.
У меня студенты на практику приходят, типичные дилетанты, я им это сразу говорю sm.gif и они делятся на две группы - одних ничего не интересует, главное чтобы заработало, они начинают подбирать в программах задержки, в схемах резисторы и конденсаторы, а другие пытаются разобраться и потом осознанно применяют.

Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Feb 19 2018, 01:51
Сообщение #57


Знающий
****

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



Стандарт как раз такое допскает. Задержка нужна была на стадии отладки как временное решение. Ее уже нет, как и вывода массива DBUG информации. Стандарт на TLS допускает такую работу сервера. Дилетант как раз и говорит:

Цитата
А мне и не надо читать.


и не разобравшись в сути делает вывод:
Цитата
Если в программе требуется подбор задержек


Ничего подбирать не требовалось. Читайте выше. Не делайте глупых выводов раз Вы кого - то там учите.

Цитата(adnega @ Feb 18 2018, 20:32) *
Вам же для отладки нужно. Киньте проводком. Когда все отладите - отключите debug-вывод портянок и уберете провод.

Так уже. DEBUG отключен. Библиотека TLS работает AS - IS, без изменения кода библиотеки.

Сообщение отредактировал Димон Безпарольный - Feb 19 2018, 01:48
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Feb 26 2018, 16:34
Сообщение #58


Знающий
****

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



Может кому пригодится - когда начал дорабатывать вывод в порт заметил что контроллер виснет на строке

Код
while(PC_TxHead != PC_TxTail)


если переменные объявлять без volatile. Получается так:



Если объявлять:

Код
volatile uint8_t  PC_TxHead=0;
volatile uint8_t  PC_TxTail=0;


То получается совсем другая картина:





Оптимизация Level 3.

Сообщение отредактировал Димон Безпарольный - Feb 26 2018, 16:35
Go to the top of the page
 
+Quote Post
x893
сообщение Feb 26 2018, 22:20
Сообщение #59


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Это уже всем ёжикам известно.
Но за заботу огромное спасибо.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Feb 27 2018, 05:33
Сообщение #60


Знающий
****

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



Какие же все таки люди злые.
Go to the top of the page
 
+Quote Post

4 страниц V  « < 2 3 4
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd September 2025 - 01:40
Рейтинг@Mail.ru


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