[En-Nut-Discussion] PPP/memory problem

p3stk4 nut at krazniki.pl
Tue Oct 23 16:20:19 CEST 2007


Brett,

I think I can handle it. If you can send me your app, I can see what I
can do.

Daniel

Dnia 23-10-2007, Wt o godzinie 22:35 +1300, Brett Abbott pisze:
> Alain
> 
> Not sure how best to do this.  The original sample app as it stands is 
> still useful and works well as a learning tool as it is clear and 
> simple.  For the extended pppdemo someone needs to spend a bit of time 
> to make it portable to gcc and tidy up the formatting - but it does give 
> some insight of what you need to consider when taking the sample to a 
> higher level of production reliability.  I'd also feel better if someone 
> more familiar with the PPP engine gives it a looking over as well.
> 
> pppdemo.c discusses restarts, error recovery, modem management using DTR 
> etc, includes client and server examples, but doesnt yet include 
> PPPPAUSE mode for interjecting modem AT commands into an active PPP 
> stream (not necessary usually but useful for 3 wire modem control).  The 
> code needs a bit of prettying up and was written as a demo concept to 
> aid with learning how to use PPP on nutos rather than as an ideal coding 
> example.
> 
> Any volunteers?
> 
> Thanks
> Brett
> 
> Alain M. wrote:
> > Could this be incorporated in main version, I intend to use PPP too!!!
> >
> > thanks,
> > Alain
> >
> > Brett Abbott escreveu:
> >   
> >> Daniel
> >>
> >> I have an extended sample app developed for nutos/PPP which didnt make 
> >> it into the released code base for some reason.  This addresses a number 
> >> of bugs and gives some examples for some of the stuff you are trying to 
> >> do.  You might be able to use it to cross check your own code.
> >>
> >> Drop me a note directly with your email address if you are interested.
> >>
> >> Cheers
> >> Brett
> >>
> >> Michael Müller wrote:
> >>     
> >>> 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
> >>>>
> >>>>     
> >>>>         
> >>> _______________________________________________
> >>> http://lists.egnite.de/mailman/listinfo/en-nut-discussion
> >>>
> >>>
> >>>   
> >>>       
> > _______________________________________________
> > http://lists.egnite.de/mailman/listinfo/en-nut-discussion
> >
> >
> >   
> 
> -- 
> -----------------------------------------------------------------
> Brett Abbott, Managing Director, Digital Telemetry Limited
> Email: Brett.Abbott at digital-telemetry.com
> PO Box 24 036 Manners Street, Wellington, New Zealand
> Phone +64 (4) 462-3439  Mobile +64 (21) 656-144
> ------------------- Commercial in confidence --------------------
> 
> 
> 
> _______________________________________________
> http://lists.egnite.de/mailman/listinfo/en-nut-discussion




More information about the En-Nut-Discussion mailing list