[En-Nut-Discussion] PPP/memory problem

Michael Müller mmueller at cs.uni-kassel.de
Thu Oct 18 20:21:57 CEST 2007


Hi,

I also experience the same problem running the PPP stack. There seems to
be a magic barrier of about 10kB free heap space. If the system
(standard Ethernut 1.3 NutOS 4.3.x) under-runs this amount of free
memory it becomes instable and crashes immediately. As it happens just
with the first dial in and not after many dial processes the memory leak
  seems to be a different trouble maker.

Kind regards
  Michael


p3stk4 schrieb:
> Welcome,
> 
> I'm writting a program for device which has to connect via GPRS modem
> send (MC35i) and some information to the server. Everything was good
> until program become bigger. Than I've noticed a problem with PPP
> driver. Without any reason it cannot establish connection (modem says
> ERROR/OK) or device hangup or restart.
> It seams to be a memory - like problem, because sometimes the
> configuration structure in the memory is overwritten with some data. 
> 
> How can I solve this problem?
> 
> The device is:
> ATmega128 + 64 KB sram memory (3 wait states, one block)
> One RS232
> and nothing more.
> 
> Configuration file used to build Nut/OS:
> 
> PLATFORM = "ETHERNUT1"
> AVR_GCC = ""
> MCU_ATMEGA128 = ""
> NUTMEM_START = "0x100"
> NUTMEM_RESERVED = "64"
> NUTXMEM_SIZE = "0xEE00"
> NUTXMEM_START = "0x1100"
> NUT_CPU_FREQ = "16000000"
> 
> Software:
> avr-gcc 4.2.1-1
> avr-libc 1.4.5-2
> binutils-avr 2.17
> Nut/OS 4.4.0.0
> Ubuntu Gutsy Gibbon RC
> 
> 
> 
> 
> The main below.
> Regards,
> Daniel Lewandowski
> 
> 
> 
> /*
>  * open modem as uart device
>  */
> int modem_open (void)
> {
>   u_long lctl;
>   char buffer[64];
> 
>   strcpy_P(buffer, PSTR("ppp:" PPPCOM "/"));
>   strncat(buffer, config->pppuser, PPPUSER_MAX);
>   strcat_P(buffer, PSTR("/"));
>   strncat(buffer, config->ppppass, PPPPASS_MAX);
> 
>   uart = _open(buffer, _O_RDWR | _O_BINARY);
>   if (uart == -1) {
>     return -1;
>   }
> 
>   lctl = UARTSPEED;
>   _ioctl(uart, UART_SETSPEED, &lctl);
> 
>   lctl = 1;
>   _ioctl(uart, UART_SETRAWMODE, &lctl);
> 
>   modem_rxto(UARTFSTRXTO);
> 
>   _ioctl(uart, HDLC_SETIFNET, 0);
>   NutSleep(2000);
> 
>   return 0;
> }
> 
> 
> /*
>  * close raw uart 
>  */
> int modem_close(void)
> {
>   return _close(uart);
> }
> 
> 
> /*
>  * make a gprs connection active
>  */
> int modem_gprs_open(void)
> {
>   int rc;
>   u_long lctl;
>   char buffer[256];
> 
>   lctl = 0;
>   _ioctl(uart, UART_SETRAWMODE, &lctl);
> 
>   strcpy_P(buffer, PSTR("TIMEOUT 30"
> 			" ABORT ERROR"
> 			" ABORT 'NO CARRIER'"
> 			" ABORT 'NO DIALTONE'"
> 			" '' ATH OK AT&D1 OK"
> 			" AT+CGDCONT=1,\"IP\",\""));
>   strncat(buffer, config->pppapn, PPPAPN_MAX);
>   strcat_P(buffer, PSTR("\" OK ATD*99***1# CONNECT"));
> 
>   rc = NutChat(uart, buffer);
>   return rc;
> }
> 
> 
> int modem_gprs_close(void)
> {
>   int rc = 0;
>   u_long lctl;
> 
>   _ioctl(uart, HDLC_SETIFNET, 0);
>   NutSleep(2000);
> 
>   MODEM_PORT &= ~_BV(MODEM_DTR); // DTR low
> 
>   lctl = 1;
>   _ioctl(uart, UART_SETRAWMODE, &lctl);
> 
>   NutSleep(3000);
> 
> 
>   MODEM_PORT |= _BV(MODEM_DTR); // DTR high
>   NutSleep(500);
> 
> 
>   return rc;
> }
> 
> 
> /*
>  * create request frame
>  */
> static void modem_frame_request(char *buffer);
> static void modem_frame_alarm(char *buffer);
> static void modem_frame_logged(char *buffer);
> static void modem_frame_keepalive(char *buffer);
> 
> static int send_data(u_long ip, u_short port, void *data, u_short bytes)
> {
>   int rc;
>   u_char *msg = (u_char*)data;
>   u_long sock_to = 5000;
>   TCPSOCKET *const sock = NutTcpCreateSocket();
> 
>   if (sock == NULL) {
>     return -1;
>   }
> 
>   NutTcpSetSockOpt(sock, SO_RCVTIMEO, &sock_to, sizeof(sock_to));
>   NutTcpSetSockOpt(sock, SO_SNDTIMEO, &sock_to, sizeof(sock_to));
> 
>   rc = NutTcpConnect(sock, ip, port);
>   if (rc == 0) {
>     while(bytes > 0) {
>       rc = NutTcpSend(sock, msg, bytes);
>       if (rc > 0) {
> 	bytes -= rc;
> 	msg += rc;
>       }
>       else if (rc == 0) {
> 	break;
>       }
>       else {
> 	break;
>       }
>     }
>   }
> 
>   rc = NutTcpCloseSocket(sock);
>   if (rc) {
>     return -1;
>   }
> 
>   return 0;
> }
> 
> 
> /*
>  * send string message to the server
>  */
> static int send_msg(u_long ip, u_short port, char *msg)
> {
>   return send_data(ip, port, msg, strlen(msg));
> }
> 
> 
> 
> char buffer[64];
> 
> /*
>  * main loop
>  */
> int main (void)
> {
>   DEVICE_STATE state;
>   int rc;
> 
>   u_char alarm_phone_index = 0;
>   u_long interval = 0;
>   u_long next_slot = 0;
>   PPPDCB *dcb;
> 
>   state = INITIALIZE;
> 
>   for(;;) {
>     NutSleep(0);
>     watchdog_clear();
>     switch (state) {
>     case INITIALIZE:
>       config_init();
>       adc_init();
>       leds_init();
>       amplifier_init();
>       buttons_init();
>       modem_init();
> 
>       modem_open();
>       modem_ignite();
>       state = IDLE;
> 
> 
>     case IDLE:
>       state = READ_SMS;
>       break;
> 
> 
>     case OPEN_GPRS:
>       NutNetIfConfig("ppp", 0, 0, 0); 
>       dcb = devPpp.dev_dcb;
>       NutDnsConfig2(0, 0, dcb->dcb_ip_dns1, dcb->dcb_ip_dns2);
>       NutIpRouteAdd(0, 0, dcb->dcb_remote_ip, &devPpp);
> 
>       state = WORKING;
>       break;
> 
> 
>     case CLOSE_GPRS:
>       modem_gprs_close();
>       state = IDLE;
>       break;
> 
> 
>     case WORKING:
> 	...
>       break;
>     }
>   }
> 
>   return 0;
> }
> 
> 
> _______________________________________________
> http://lists.egnite.de/mailman/listinfo/en-nut-discussion
> 





More information about the En-Nut-Discussion mailing list