[En-Nut-Discussion] PPP/memory problem

Brett Abbott Brett.Abbott at digital-telemetry.com
Mon Oct 22 20:54:33 CEST 2007


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
>
>
>   

-- 
-----------------------------------------------------------------
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 --------------------






More information about the En-Nut-Discussion mailing list