Jump to content

    
Sign in to follow this  
cpl

FreeRTOS + LwIp + PPP

Recommended Posts

Здравствуйте

Подымаю выход в интернет по GPRS c применением внешнего стека(LWIP v1.3.0) на платформе AVR32 и применением freertos(v4.7.2).

Возникли следующие вопросы:

 

Что выводит vTaskList ?

первый параметр текущее состояние задачи.

второй приоритет.

третий-четвертый ?

 

Вопрос по реализации функции чтения данных из модема, на сколько корректно это будет под управлением freertos ?

1. В прерывании от USART (принят байт) - производится запись очередного байта в глобальный буфер.(без каких либо сервисов freertos)

2. В функции чтения данных полученных от модема - при обращении к буферу произвожу отключение всех прерываний, по завершении включаю прерывания.

или лучше сделать пересылку с применением сервиса freertos очеред ?

 

Freertos поднял, подключил стек LWIP, поднял PPP пробую поднять TCP соединение и не пойму что не так,

пытаюсь произвести подключение к удаленному серверу запускаю netconn_connect() - выхода из netconn_connect() не происходит

при этом нечего в USART не передается и не принимается из него ? В чем может быть проблема ?

На сколько могу судить система жива, тестовая задача мигания светодиодом продолжает работать.

 

лог соединения:

ppp_con_fd=0
pppMain: unit 0: Connecting
pppStartCB: unit 0
ppp_set_xaccm[0]: outACCM=? ? ? ?
ppp_send_config[0]: outACCM=? ? ? ?
ppp_recv_config[0]: inACCM=? ? ? ?
lcp_lowerup: asyncmap=? ? ? ?
LCP: lowerup state 0 (LS_INITIAL) -> 2 (LS_CLOSED)
auth_reset: 0
lcp_addci: L opt=2 ?
lcp_addci: L opt=5 ?
lcp_addci: opt=7
lcp_addci: opt=8
pppWrite[0]: len=47
sio_write=47
fsm_sdata(LCP): Sent code 1,1,20.
LCP: sending Configure-Request, id 1
LCP: open state 2 (LS_CLOSED) -> 6 (LS_REQSENT)
sio_read paket 1 : 43 54 20 31 31 35 32 30 30 d a 7e ff 7d 23 c0 21 7d 21 7d 21 7d 20 7d 36 7d 21 7d 24 7d 25 dc 7d 22 7d 26 7d 20 7d 20 7d 20 7d 20 7d 27 7d 22 7d 28 7d 22 7d 23 7d 24 c0 23 26 b4 7e 
pppInProc[0]: got 61 bytes
pppInput[0]: LCP len=22
fsm_input(LCP):1,1,22
fsm_rconfreq(LCP): Rcvd id 1 state=6 (LS_REQSENT)
lcp_reqci: rcvd MRU 1500 ASYNCMAP=? PCOMPRESSION ACCOMPRESSION PAP (?)
lcp_reqci: returning CONFACK.
pppWrite[0]: len=49
sio_write=49
fsm_sdata(LCP): Sent code 2,1,22.
sio_read paket 1 : 7e ff 7d 23 c0 21 7d 24 7d 21 7d 20 7d 2a 7d 25 7d 26 44 7d 30 7d 38 52 3a 30 7e 
pppInProc[0]: got 27 bytes
pppInput[0]: LCP len=10
fsm_input(LCP):4,1,10
fsm_rconfnakrej(LCP): Rcvd id 1 state=8 (LS_ACKSENT)
lcp_rejci: long opt 5 rejected
lcp_addci: L opt=2 ?
lcp_addci: opt=7
lcp_addci: opt=8
pppWrite[0]: len=36
sio_write=36
fsm_sdata(LCP): Sent code 1,2,14.
LCP: sending Configure-Request, id 2
sio_read paket 1 : 7e ff 7d 23 c0 21 7d 22 7d 22 7d 20 7d 2e 7d 22 7d 26 7d 20 7d 20 7d 20 7d 20 7d 27 7d 22 7d 28 7d 22 b9 b9 7e 
pppInProc[0]: got 37 bytes
pppInput[0]: LCP len=14
fsm_input(LCP):2,2,14
fsm_rconfack(LCP): Rcvd id 2 state=8 (LS_ACKSENT)
lcp_acki: Ack
ppp_send_config[0]: outACCM=? ? ? ?
ppp_recv_config[0]: inACCM=? ? ? ?
link_established: 0
upap_lowerup: 0 s=0
IPCP: lowerup state 0 (LS_INITIAL) -> 2 (LS_CLOSED)
upap_authwithpeer: 0 user=mts password=mts s=1
pppWrite[0]: len=19
sio_write=19
pap_sauth: Sent id 1
upap_timeout: 0 timeout 6 expired s=3
pppWrite[0]: len=20
sio_write=20
pap_sauth: Sent id 2
sio_read paket 1 : 7e c0 23 7d 22 7d 21 7d 20 7d 2d 7d 28 57 65 6c 63 6f 6d 65 21 4e bc 7e 
pppInProc[0]: got 24 bytes
pppInput[0]: PAP len=13
pap_rauthack: Rcvd id 1 s=3
Remote message: Welcome!
auth_withpeer_success: 0 proto=?
pppWrite[0]: len=30
sio_write=30
fsm_sdata(IPCP): Sent code 1,1,22.
IPCP: sending Configure-Request, id 1
IPCP: open state 2 (LS_CLOSED) -> 6 (LS_REQSENT)
sio_read paket 1 : 7e 80 21 7d 21 7d 21 7d 20 7d 2a 7d 23 7d 26 c0 a8 6f 6f cd 49 7e 7e 80 21 7d 23 7d 21 7d 20 7d 36 7d 23 7d 26 7d 2a 7d 38 45 72 81 7d 26 d5 57 7d 20 7d 21 83 7d 26 d5 57 7d 21 7d 21 bd ac 7e 
pppInProc[0]: got 64 bytes
pppInput[0]: IPCP len=10
fsm_input(IPCP):1,1,10
fsm_rconfreq(IPCP): Rcvd id 1 state=6 (LS_REQSENT)
ipcp_reqci: ADDR 192.168.111.111
ipcp_reqci: returning Configure-ACK
pppWrite[0]: len=17
sio_write=17
fsm_sdata(IPCP): Sent code 2,1,10.
pppInput[0]: IPCP len=22
fsm_input(IPCP):3,1,22
fsm_rconfnakrej(IPCP): Rcvd id 1 state=8 (LS_ACKSENT)
local IP address 10.24.69.114
primary DNS address 213.87.0.1
secondary DNS address 213.87.1.1
pppWrite[0]: len=29
sio_write=29
fsm_sdata(IPCP): Sent code 1,2,22.
IPCP: sending Configure-Request, id 2
sio_read paket 1 : 7e 80 21 7d 22 7d 22 7d 20 7d 36 7d 23 7d 26 7d 2a 7d 38 45 72 81 7d 26 d5 57 7d 20 7d 21 83 7d 26 d5 57 7d 21 7d 21 54 5c 7e 
pppInProc[0]: got 42 bytes
pppInput[0]: IPCP len=22
fsm_input(IPCP):2,2,22
fsm_rconfack(IPCP): Rcvd id 2 state=8 (LS_ACKSENT)
np_up: 0 proto=?
np_up: maxconnect=0 idle_time_limit=0
ipcp: up
sifup: unit 0: linkStatusCB=8000476c errCode=0
vPPPStatusCB: error code = none
vPPPStatusCB: PPP link reported connection established.
local  IP address 10.24.69.114
remote IP address 192.168.111.111
primary   DNS address 213.87.0.1
secondary DNS address 213.87.1.1
Connect to Server                      <- выводится мною
upap_timeout: 0 timeout 6 expired s=4

 

Исходник задачи:

static void vTaskPPPStart( void *pvParameters )
{

    lwip_init();

    tcpip_init(NULL, NULL);
    vTaskDelay(20);
    pppInit();
    pppSetAuth(PPPAUTHTYPE_NONE, "mts", "mts");

    for(;; )
    {

        .....инин модема.....
        ppp_link = 0;

        ppp_con_fd = pppOverSerialOpen( sioModem, vPPPStatusCB, NULL );
        APPIP_TRACE( ( "vAppIP(STATE_PPP_INIT): opening ppp connection\r\n") );
        printf("ppp_con_fd=%x\n",ppp_con_fd);

        while(ppp_link == 0) vTaskDelay(100);
        if (ppp_link == 1){
            conn = netconn_new(NETCONN_TCP);
            if (conn == NULL)
                printf("ERROR conn = netconn_new(NETCONN_TCP)\n");
            addr.addr = inet_addr("тут внешний IP");

            printf("Connect to Server\n");
            error = netconn_connect(conn, &addr, 10000);   <- от сюда так и не выходит
            printf("netconn_connect result=%d\n",error);

...................


            netconn_close(conn);

            err = pppClose( ppp_con_fd );
            printf("\npppClose result=%d\n",err);

        }
        for(;;)
            vTaskDelay( 200 );
    }
}

 

 

Share this post


Link to post
Share on other sites

Включил более детальный протокол, нашел следующее

 

tcp_connect to port 10000
tcp_enqueue(pcb=0x1c68, arg=0, len=0, flags=2, apiflags=0)
tcp_enqueue: queuelen: 0
pbuf_alloc(length=4)
mem_malloc: could not allocate 76 bytes
tcp_enqueue: 0 (with mem err)

 

получается что memp_malloc не может выделить память.

в самой memp.c(memp_malloc) в начале есть такая строка:

LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);

попытался найти MEMP_MAX в исходниках, не нашел,

как и откуда берется-формируется непонятно ?!

 

:smile3009:

Share this post


Link to post
Share on other sites
попытался найти MEMP_MAX в исходниках, не нашел,

как и откуда берется-формируется непонятно ?!

 

плохо искали ;) ... lwip-1.3.0\src\include\lwip\memp.h

 

typedef enum {
#define LWIP_MEMPOOL(name,num,size,desc)  MEMP_##name,
#include "lwip/memp_std.h"
  MEMP_MAX
} memp_t;

 

c ppp на авр32 дело не имел еще (тьфу*3)... но с езернетом наигрался вволю ... собственно чего в lwipopts.h нарисовано в части памяти ?

 

Кстати , mem_malloc и memp_malloc это разные сущности ...

Edited by Maddy

Share this post


Link to post
Share on other sites
плохо искали ;) ... lwip-1.3.0\src\include\lwip\memp.h

 

typedef enum {
#define LWIP_MEMPOOL(name,num,size,desc)  MEMP_##name,
#include "lwip/memp_std.h"
  MEMP_MAX
} memp_t;

 

c ppp на авр32 дело не имел еще (тьфу*3)... но с езернетом наигрался вволю ... собственно чего в lwipopts.h нарисовано в части памяти ?

 

Кстати , mem_malloc и memp_malloc это разные сущности ...

 

Это место я нашел, но неочень понимаю что этим хотели выразить....

 

Я правильно понимаю что чтоб отключить ethernet в стеке определяем LWIP_ARP=0 ?

 

мой lwipopts.h

 

#define PPP_SUPPORT             1
#if PPP_SUPPORT
#define NUM_PPP                         1      /* Max PPP sessions. */
#define PAP_SUPPORT                     1      /* Set for PAP. */
#define CHAP_SUPPORT                    0      /* Set for CHAP. */
#define MSCHAP_SUPPORT 0 /* Set for MSCHAP (NOT FUNCTIONAL!) */
#define CBCP_SUPPORT 0 /* Set for CBCP (NOT FUNCTIONAL!) */
#define CCP_SUPPORT 0 /* Set for CCP (NOT FUNCTIONAL!) */
#define VJ_SUPPORT 0 /* Set for VJ header compression. */
#define MD5_SUPPORT 1 /* Set for MD5 (see also CHAP) */
#define PPP_DEBUG      1

#define IP_REASSEMBLY           1 // IP fragments
#define LWIP_DEBUG 1
#define LWIP_ARP 0
#define SYS_LIGHTWEIGHT_PROT            1
#define MEM_ALIGNMENT           4
#define MEM_SIZE                3 * 1024
#define MEMP_NUM_PBUF           6
#define MEMP_NUM_RAW_PCB                1
#define MEMP_NUM_TCP_PCB        2
#define MEMP_NUM_TCP_PCB_LISTEN 1
#define MEMP_NUM_TCP_SEG        9
#define MEMP_NUM_SYS_TIMEOUT    6
#define MEMP_NUM_NETBUF         3
#define MEMP_NUM_NETCONN        4
#define PBUF_POOL_SIZE          6
#define PBUF_POOL_BUFSIZE       500
#define PBUF_LINK_HLEN          16
#define LWIP_TCP                1
#define TCP_TTL                 255
#define TCP_WND                 1500
#define TCP_QUEUE_OOSEQ         1
#define TCP_MSS                 1500
#define TCP_SND_BUF             2150
#define TCP_SND_QUEUELEN        6 * TCP_SND_BUF/TCP_MSS
#define TCP_MAXRTX              12
#define TCP_SYNMAXRTX           4
#define DEFAULT_RAW_RECVMBOX_SIZE       6
#define DEFAULT_UDP_RECVMBOX_SIZE       6
#define DEFAULT_TCP_RECVMBOX_SIZE       6
#define DEFAULT_ACCEPTMBOX_SIZE         6
#define ARP_TABLE_SIZE 10
#define ARP_QUEUEING 0
#define IP_FORWARD              0
#define IP_OPTIONS              1
#define ICMP_TTL                255
#define LWIP_DHCP               0
#define TCPIP_THREAD_NAME              "TCP/IP"
#define TCPIP_THREAD_STACKSIZE          lwipINTERFACE_STACK_SIZE
#define TCPIP_THREAD_PRIO               lwipINTERFACE_TASK_PRIORITY
#define TCPIP_MBOX_SIZE                 6
#define SLIPIF_THREAD_NAME             "slipif"
#define SLIPIF_THREAD_STACKSIZE         configMINIMAL_STACK_SIZE
#define SLIPIF_THREAD_PRIO              1
#define PPP_THREAD_NAME                "pppMain"
#define PPP_THREAD_STACKSIZE            configMINIMAL_STACK_SIZE
#define PPP_THREAD_PRIO                 1
#define DEFAULT_THREAD_NAME            "lwIP"
#define DEFAULT_THREAD_STACKSIZE        configMINIMAL_STACK_SIZE
#define DEFAULT_THREAD_PRIO             1
#define LWIP_STATS 1
#define LWIP_STATS_DISPLAY 1
#if LWIP_STATS
#define LINK_STATS 1
#define IP_STATS   1
#define ICMP_STATS 1
#define UDP_STATS  1
#define TCP_STATS  1
#define MEM_STATS  1
#define MEMP_STATS 1
#define PBUF_STATS 1
#define SYS_STATS  1
#endif /* STATS */

 

Share this post


Link to post
Share on other sites
Это место я нашел, но неочень понимаю что этим хотели выразить....

Ну раньше это так выглядило... Сейчас для более гибких настроек свсарганили костыль .... но суть та-же

typedef enum {
  MEMP_PBUF,
  MEMP_RAW_PCB,
  MEMP_UDP_PCB,
  MEMP_TCP_PCB,
  MEMP_TCP_PCB_LISTEN,
  MEMP_TCP_SEG,

  MEMP_NETBUF,
  MEMP_NETCONN,
  MEMP_API_MSG,
  MEMP_TCPIP_MSG,

  MEMP_SYS_TIMEOUT,
  
  MEMP_MAX
} memp_t;

 

Я правильно понимаю что чтоб отключить ethernet в стеке определяем LWIP_ARP=0 ?

Нет ... Это отключает именно ARP ;) грубо говоря это преобразование MAC адреса интрефейса (или подобного) в IP адрес ... подробнеесюда. Чтоб убить езернет просто не вкючайте ethernetif.c из порта в проект (ну и macb.c соответственно не нужен ...)

 

мой lwipopts.h

Ну явного с памятью не видно ... Все-таки где lwip рушится на memp_malloc или mem_alloc ?

 

далее , Вы уверены что за 20ms стек успевает инициализироваться ?

 tcpip_init(NULL, NULL);
    vTaskDelay(20);

может родную методу попробывать ?

sys_sem_t sem; 

sem = sys_sem_new(0); // Create a new semaphore. 
tcpip_init(tcpip_init_done, &sem); 
sys_sem_wait(sem); // Block until the lwIP stack is initialized. 
sys_sem_free(sem); // Free the semaphore.

Это вроде авторы рекомендуют ...

Share this post


Link to post
Share on other sites
Нет ... Это отключает именно ARP ;) грубо говоря это преобразование MAC адреса интрефейса (или подобного) в IP адрес ... подробнеесюда. Чтоб убить езернет просто не вкючайте ethernetif.c из порта в проект (ну и macb.c соответственно не нужен ...)

 

 

Ну явного с памятью не видно ... Все-таки где lwip рушится на memp_malloc или mem_alloc ?

 

далее , Вы уверены что за 20ms стек успевает инициализироваться ?

 tcpip_init(NULL, NULL);
    vTaskDelay(20);

может родную методу попробывать ?

sys_sem_t sem; 

sem = sys_sem_new(0); // Create a new semaphore. 
tcpip_init(tcpip_init_done, &sem); 
sys_sem_wait(sem); // Block until the lwIP stack is initialized. 
sys_sem_free(sem); // Free the semaphore.

Это вроде авторы рекомендуют ...

Инит переделал как выше, все также без изменений.

Включил более детальный лог, обнаружилось следующее:

 

tcp_connect to port 10000
tcp_enqueue(pcb=0x1c68, arg=0, len=0, flags=2, apiflags=0)
tcp_enqueue: queuelen: 0
pbuf_alloc(length=4)
mem_malloc: could not allocate 76 bytes
tcp_enqueue: 0 (with mem err)

 

файл tcp_out.c

    /* Allocate memory for tcp_seg, and fill in fields. */
    seg = memp_malloc(MEMP_TCP_SEG);
    if (seg == NULL) {
      LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_enqueue: could not allocate memory for tcp_seg\n"));
      goto memerr;
    }

 

увеличил #define MEM_SIZE с 3*1024 до 4*1024

ошибка изчезла, заработало !

От сюда вопрос как понять сколько нужно памяти стеку ?

Вроде как есть статистика LWIP_STATS_DISPLAY поможет это в определении количества требуемой памяти ?

 

Попробовал включить ARP=1

ethernetif.c не подкючал, при компиляции выдает ошибки:

Description    Resource    Path    Location    Type
undefined reference to `etharp_query'    netif.c    lwip_ppp/lwip/core    line 404    C/C++ Problem
undefined reference to `etharp_tmr'    tcpip.c    lwip_ppp/lwip/api    line 143    C/C++ Problem
undefined reference to `ethernet_input'    tcpip.c    lwip_ppp/lwip/api    line 313    C/C++ Problem

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this