Jump to content

    

Алексей ВМ

Участник
  • Content Count

    141
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Алексей ВМ

  • Rank
    Частый гость

Recent Profile Visitors

2563 profile views
  1. Подскажите, плиз, где достать отладку STM32MP157C-DK2 за пару недель. Везде под заказ от 3-4 недель. С-Петербург.
  2. Куплю борду STM32MP157C-DK2.
  3. У меня не эзернет, а USB модем. Косяк в процедуре передачи данных по USB в модем.
  4. Без FreeRTOS все работает отлично, задержка не более 1 секунды. Выходит, проблема в ОС, либо в том, что используются разные функции lwip для работы с ОС и без.
  5. Добрый день, в процессе решения проблемы появилось подозрение, что задержка может образовываться из-за FreeRTOS. Пытаюсь собрать проект без ОС (NO_SYS = 1), однако компилятор ругается на отсутствие функций Error: L6218E: Undefined symbol sys_timeout (referred from fsm.o). Error: L6218E: Undefined symbol sys_untimeout (referred from fsm.o). опции следующие; #define LWIP_SOCKET 0 //add sockets.c to compilation #define LWIP_NETCONN 0 //sequiential API is used #define LWIP_ARP 0 //No ARP is needed #define LWIP_DNS 1 #define LWIP_DNS_SECURE 0 //Disable DNS security #define LWIP_ICMP 1 #define LWIP_RAW 1 //RAW IP connections #define LWIP_DHCP 0 #define LWIP_UDP 1 #define LWIP_TCP 1 #define PPP_SUPPORT 1 #define PPPOE_SUPPORT 0 #define PPP_INPROC_IRQ_SAFE 0 #define LWIP_PPP_API 0 #define PAP_SUPPORT 1 #define VJ_SUPPORT 1 #define LWIP_TIMERS 0 Вопрос - возможна ли в принципе поддержка PPP без ОС? Явных ограничений из кода не следует, но вот как быть с функциями таймаутов?
  6. Особых требований нет, но хочется, чтобы все уже было в сборе. В идеальном случае, в корпусе)
  7. Добрый день, Посоветуйте, пожалуйста, одноплатник, со след возможностями: 1. ОС - Линукс с графическим интерфейсом 2. Желательно два ядра ARM - под приложения (Ах) и под обработку реального времени (Мх) 3. 5-6 входов АЦП 4. Желательно наличие встроенного GPS модуля 5. ЖКИ не менее 5" Назначение - прием аналоговых сигналов, обработка в режиме реального времени, отображение в графическом виде.
  8. Спасибо! Программное вычисление CRC включено, в противном случае до сервера вообще бы ничего не доходило, в моем случае доходит 90% посылок, из них 50% с большой задержкой.
  9. Может кто-нибудь прокомментировать, что происходит: Посылаем данные TCP CONNECTED tcp_write(pcb=2000db28, data=20001492, len=178, apiflags=1) tcp_write: queuelen: 0 tcp_write: queueing 6516:6694 tcp_write: 1 (after enqueued) tcp_output: snd_wnd 14600, cwnd 4380, wnd 4380, effwnd 178, seq 6516, ack 6516 tcp_output: snd_wnd 14600, cwnd 4380, wnd 4380, effwnd 178, seq 6516, ack 6516, i 0 tcp_output_segment: 6516:6694 pppos_netif_output[0]: proto=0x21, len = 218 И после этого начинается TCP SEND OK!!! tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 4380, wnd 4380, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 4380, wnd 4380, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 4380, wnd 4380, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb tcp_slowtmr: rtime 6 pcb->rto 6 tcp_slowtmr: cwnd 1360 ssthresh 2720 tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, effwnd 178, seq 6516, ack 6516 tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, effwnd 178, seq 6516, ack 6516, i 0 tcp_output_segment: rtseq 6516 tcp_output_segment: 6516:6694 pppos_netif_output[0]: proto=0x21, len = 218 tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb tcp_slowtmr: rtime 12 pcb->rto 12 tcp_slowtmr: cwnd 1360 ssthresh 2720 tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, effwnd 178, seq 6516, ack 6516 tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, effwnd 178, seq 6516, ack 6516, i 0 tcp_output_segment: rtseq 6516 tcp_output_segment: 6516:6694 pppos_netif_output[0]: proto=0x21, len = 218 tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb tcp_slowtmr: processing active pcb tcp_slowtmr: polling application tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, seg == NULL, ack 6516 tcp_slowtmr: processing active pcb NO DATA TO RECEIVE tcp_close: closing in State: ESTABLISHED tcp_enqueue_flags: queuelen: 1 tcp_enqueue_flags: queueing 6694:6695 (0x1) tcp_enqueue_flags: 2 (after enqueued) tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, effwnd 178, seq 6694, ack 6516 tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, effwnd 178, seq 6694, ack 6516, i 0 tcp_output_segment: 6694:6694 pppos_netif_output[0]: proto=0x21, len = 40 Отладка не получила АСК от сервера и пытается периодически что-то на сервер отправить? tcp_output: nothing to send (00000000) tcp_output: snd_wnd 14600, cwnd 1360, wnd 1360, seg == NULL, ack 6516
  10. Воткнул модем в ноут - COM портов нет. Думаю, модем каким-то хитрым образом сконфигурирован. Дров не было. Установил - появился СОМ порт.
  11. cmux не задействован. CDC скорей всего один. Код обмена с модемом писал не я, могу ошибаться. CDC используется для AT команд управления, а данные читаются/пишутся c помощью MSC. Инициализация USB хоста USBH_Init(&USB_OTG_Core,USB_OTG_HS_CORE_ID,&USB_Host,&USBH_MSC_cb,&USR_Callbacks); USBH_Class_cb_TypeDef USBH_MSC_cb = { USBH_MSC_InterfaceInit, USBH_MSC_InterfaceDeInit, USBH_MSC_ClassRequest, USBH_MSC_Handle, }; хм, инициализируется только MSC. Мне кажется, CDC тут фиктивный(?). Вот код передачи по CDC. Видно, что используется MSС. uint32_t USBH_CDC_SendData(uint8_t *data, uint32_t len) { URB_STATE urb_tx = URB_IDLE; uint32_t i = 0; uint32_t size = 0; uint8_t txState = 0; uint8_t j; while (i < len) { urb_tx = HCD_GetURB_State(&USB_OTG_Core, MSC_Machine.hc_num_out); switch (txState) { case 0: //Prepare and send data switch (urb_tx) { case URB_DONE: case URB_IDLE: case URB_NOTREADY: if ((len - i) > MSC_Machine.MSBulkOutEpSize) { size = MSC_Machine.MSBulkOutEpSize; } else { size = (len - i); } taskENTER_CRITICAL(); USBH_BulkSendData(&USB_OTG_Core, (data + i), size, MSC_Machine.hc_num_out); taskEXIT_CRITICAL(); txState = 1; j = 0; break; } break; case 1: switch (urb_tx) { case URB_DONE: i += size; txState = 0; break; case URB_NOTREADY: txState = 0; //printf("\nUSB_TX_NOTREADY"); vTaskDelay(1/portTICK_RATE_MS); //def 5 break; case URB_IDLE: txState = 0; // AlexM 181118 break; case URB_ERROR: vTaskDelay(1/portTICK_RATE_MS); printf("\nUSB_TX_ERR_TOUT"); j++; if (j >= 5) { i += size; txState = 0; printf("\nUSB_TX_ERR"); } break; } break; } } //printf("\nlen=%u, sent=%u",len,i); return i; }
  12. Если кратко, то Модем - HUAWEI E3372h, АТ команды - с использованием CDC поверх USB. PPP_Conn = pppos_create(&ppp_netif, PPPoutputCB, PPPlinkStatusCB, &GLOB_PPP_ConnStatus); static u32_t PPPoutputCB(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx) { return USBH_CDC_SendData(data, len); } Прием USBH_BulkReceiveData(&USB_OTG_Core,&bDatIN[datPtr],64,MSC_Machine.hc_num_in); xTaskCreate(vUSBH, "vtUSBH", configMINIMAL_STACK_SIZE, NULL, 0, NULL); xTaskCreate(vUSBHrx, "vtUSBHrx", configMINIMAL_STACK_SIZE, NULL, 3, NULL); xTaskCreate(vlwIP_PPPinit, "vtlwIP_PPPinit", configMINIMAL_STACK_SIZE, NULL, 0, NULL); void vUSBH(void *pvParameters) { USBH_Init(&USB_OTG_Core,USB_OTG_HS_CORE_ID,&USB_Host,&USBH_MSC_cb,&USR_Callbacks); while (1) { USBH_Process(&USB_OTG_Core, &USB_Host); } } void vUSBHrx(void *pvParameters) { uint32_t datPtr=0; while (1) { if (usbUP == 1) { taskENTER_CRITICAL(); USBH_BulkReceiveData(&USB_OTG_Core,&bDatIN[datPtr],64,MSC_Machine.hc_num_in); taskEXIT_CRITICAL(); if (xSemaphoreTake(SemRxURB_DONE,(200/portTICK_RATE_MS))==pdPASS) { //If URB status is set to URB_DONE in interrupt service routine DatIN=HCD_GetXferCnt(&USB_OTG_Core,MSC_Machine.hc_num_in); if (GLOB_PPP_ConnStatus>=20) { //if already in PPP mode if ((DatIN>=64)&&(datPtr<(64*3))) { datPtr+=DatIN; DatIN=0; } else if ((DatIN+datPtr)>0) { pppos_input_tcpip(PPP_Conn,bDatIN,(DatIN+datPtr)); DatIN=0; datPtr=0; } } else { //if not in PPP mode yet if ((DatIN>=64)&&(datPtr<(64*3))) { datPtr+=DatIN; DatIN=0; } else if ((DatIN+datPtr)>0) { DatIN=DatIN+datPtr; datPtr=0; } } } } else { vTaskDelay(100/portTICK_RATE_MS); } } } void OTG_HS_IRQHandler(void) { static signed portBASE_TYPE xHPTW; //GSH addon USBH_OTG_ISR_Handler(&USB_OTG_Core); if (usbUP != 0) { if (HCD_GetURB_State(&USB_OTG_Core, MSC_Machine.hc_num_in) == URB_DONE) { USB_OTG_Core.host.URB_State[MSC_Machine.hc_num_in] = URB_IDLE; xSemaphoreGiveFromISR(SemRxURB_DONE,&xHPTW); portYIELD_FROM_ISR(xHPTW); } } } При включении LWIP_STATS появляются ошибки tcp drop и proterr. А вот куда дальше копать - пока в затруднении
  13. Добрый день! Есть задача передать на сервер данные. Используется STM32F4 с FreeRTOS и lwIP. К STM посредством USB подключен модем. В lwIP включена поддержка PPPoS для работы с модемом. Запись данных и ожидание результата производится в отдельной задаче. Данные передаются, но подтверждение от сервера часто (в 90% случаев) приходит в течении нескольких секунд (2-8), а иногда вообще данные до сервера не доходят. При использовании Ethernet таких проблем на данной плате с данным сервером нет. Может, кто сталкивался с подобной проблемой, в какую сторону копать?