Jump to content

    

Алексей ВМ

Участник
  • Content Count

    145
  • Joined

  • Last visited

Everything posted by Алексей ВМ


  1. lwip 2.1.2 можно чуть подробнее, если не сложно. Как понять, что сокет норм закрылся? И где чего дописать, чтоб наверняка?
  2. Выделение памяти не помогает, выделено 8К, если нет таймаутов, то максимум требуется 4К. Да, МК - хост, модем подключен девайсом. Такое впечатление, что где-то утечка памяти, но как её выявить непонятно.
  3. Добрый день! Имеется STM32F4 с FreeRTOS и lwIP на борту. Передаю данные с использованием PPP и USB модема. Передача реализована с помощью сокетов. Возникает ситуация, когда при таймауте ответа от сервера размер используемой кучи lwIP начинает расти, и в конце концов tcp_write() не хватает памяти для размещения очередного сегмента: tcp_write(pcb=20015730, data=20001950, len=2466, apiflags=1) tcp_write: queueing 6720:8080 mem_malloc: could not allocate 1436 bytes tcp_write : could not allocate memory for pbuf copy size 1106 Кто не чистит за собой память? Проблема возникает, если данные не влезают в один сегмент.
  4. Подскажите, плиз, где достать отладку STM32MP157C-DK2 за пару недель. Везде под заказ от 3-4 недель. С-Петербург.
  5. Куплю борду STM32MP157C-DK2.
  6. У меня не эзернет, а USB модем. Косяк в процедуре передачи данных по USB в модем.
  7. Без FreeRTOS все работает отлично, задержка не более 1 секунды. Выходит, проблема в ОС, либо в том, что используются разные функции lwip для работы с ОС и без.
  8. Добрый день, в процессе решения проблемы появилось подозрение, что задержка может образовываться из-за 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 без ОС? Явных ограничений из кода не следует, но вот как быть с функциями таймаутов?
  9. Особых требований нет, но хочется, чтобы все уже было в сборе. В идеальном случае, в корпусе)
  10. Добрый день, Посоветуйте, пожалуйста, одноплатник, со след возможностями: 1. ОС - Линукс с графическим интерфейсом 2. Желательно два ядра ARM - под приложения (Ах) и под обработку реального времени (Мх) 3. 5-6 входов АЦП 4. Желательно наличие встроенного GPS модуля 5. ЖКИ не менее 5" Назначение - прием аналоговых сигналов, обработка в режиме реального времени, отображение в графическом виде.
  11. Спасибо! Программное вычисление CRC включено, в противном случае до сервера вообще бы ничего не доходило, в моем случае доходит 90% посылок, из них 50% с большой задержкой.
  12. Может кто-нибудь прокомментировать, что происходит: Посылаем данные 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
  13. Воткнул модем в ноут - COM портов нет. Думаю, модем каким-то хитрым образом сконфигурирован. Дров не было. Установил - появился СОМ порт.
  14. 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; }
  15. Если кратко, то Модем - 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. А вот куда дальше копать - пока в затруднении
  16. Добрый день! Есть задача передать на сервер данные. Используется STM32F4 с FreeRTOS и lwIP. К STM посредством USB подключен модем. В lwIP включена поддержка PPPoS для работы с модемом. Запись данных и ожидание результата производится в отдельной задаче. Данные передаются, но подтверждение от сервера часто (в 90% случаев) приходит в течении нескольких секунд (2-8), а иногда вообще данные до сервера не доходят. При использовании Ethernet таких проблем на данной плате с данным сервером нет. Может, кто сталкивался с подобной проблемой, в какую сторону копать?
  17. Добрый день! связка STM32F4 и LAN8720 используется в режиме RMII, прерывание по изменению статуса линка на STM не завести. Альтернатива - читать регистр BSR. Подскажите, как это чтение организовать? Запустить в FreeRTOS отдельную задачу? Или в lwIP уже есть этот функционал?
  18. Это макросы. Насколько я понял, служебные функции вызываются при использовании параметров в вызове функции. Если тело функции HalFlashWriteRAM() использовать в функции UpdateFirmware(), то все работает отлично.
  19. Это и есть отдельная программа. Она копируется из ROM в SRAM и оттуда запускается, но при этом происходит обращение к служебным функциям, например LCALL ?BANKED_ENTER_XDATA, которые находятся во флеше. #pragma default_function_attributes = @ "RAMCODE" void UpdateFirmware(void) { buf[0] = 0xBE; buf[1] = 0xEF; buf[2] = 0xDE; buf[3] = 0xAD; HalFlashWriteRAM(TEST_ADDR, buf, 1); LED_ON for(;;); } void HalFlashWriteRAM(uint16 addr, uint8 *buf, uint16 cnt) { halDMADesc_t *ch = HAL_NV_DMA_GET_DESC(); HAL_DMA_SET_SOURCE(ch, buf); HAL_DMA_SET_DEST(ch, &FWDATA); HAL_DMA_SET_VLEN(ch, HAL_DMA_VLEN_USE_LEN); HAL_DMA_SET_LEN(ch, (cnt * HAL_FLASH_WORD_SIZE)); HAL_DMA_SET_WORD_SIZE(ch, HAL_DMA_WORDSIZE_BYTE); HAL_DMA_SET_TRIG_MODE(ch, HAL_DMA_TMODE_SINGLE); HAL_DMA_SET_TRIG_SRC(ch, HAL_DMA_TRIG_FLASH); HAL_DMA_SET_SRC_INC(ch, HAL_DMA_SRCINC_1); HAL_DMA_SET_DST_INC(ch, HAL_DMA_DSTINC_0); // The DMA is to be polled and shall not issue an IRQ upon completion. HAL_DMA_SET_IRQ(ch, HAL_DMA_IRQMASK_DISABLE); HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS); HAL_DMA_SET_PRIORITY(ch, HAL_DMA_PRI_HIGH); HAL_DMA_CLEAR_IRQ(HAL_NV_DMA_CH); HAL_DMA_ARM_CH(HAL_NV_DMA_CH); FADDRL = (uint8)addr; FADDRH = (uint8)(addr >> 8); FCTL |= 0x02; // Trigger the DMA writes. while (FCTL & 0x80); // Wait until writing is done. //LED_ON //for(;;); } #pragma default_function_attributes = Например, вызов функции HalFlashWriteRAM(TEST_ADDR, buf, 1); порождает вызов LCALL ?BANKED_ENTER_XDATA
  20. Добрый день, Необходимо запускать все функции из SRAM, так как надо перезаписать флешь с кодом. Проблема в том, что функция, вызываемая из SRAM, обращается к служебным функциям, сидящим во флеше. Как перенести все функции в SRAM?
  21. Программатор не поможет)). Доступ к СС2541 только по BLE. Внутри СС2541 прошиты BIM, ImageA и ImageB. Перепрошивать может только ImageA. Задача - заменить и BIM, и ImageA, и ImageB.
  22. Да, надо переписать в том числе и BIM. Вообще весь банк 0 обновить с помощью кода, который располагается в 3-м банке.