Jump to content

    

FreeRTOS + LwIp + PPP

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

Подымаю выход в интернет по 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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this