Re: [lwip-users] lwip crashing, apparently in sys_check_timeouts

2018-08-20 Thread Stephen Cowell
When presented with problems like this I start by replacing all the 
default handlers with handlers that log a hit.  Since you have NVR that 
you can read and write this should be easy... I use my User Page Flash 
for the same purpose.  This will help you divide-and-conquer.

__
Steve
.

On 8/20/2018 1:13 PM, Keith Rubow wrote:
I am using lwip 2.0.3 with NO_SYS = 1 on a bare metal 386ex processor 
with a Wiznet IIM7010A ethernet interface operating in MAC RAW mode. 
Yes, this hardware is REALLY old, but we have lots of hardware out in 
the field and need to fix a problem, and lwip seems like the best way 
to fix it.


My hardware has a hardware watchdog timer that will reset the 
processor if not refreshed at least every 5 seconds. Since 
implementing lwip I am experiencing extremely infrequent system 
crashes. My debugging indicates that I call sys_check_timeouts, and 
then the watchdog timer times out, resetting the system. Normally the 
watchdog timer is getting refreshed many times per second around the 
main program loop. It appears that sys_check_timeouts is taking at 
least 5 seconds to execute.


This crash (or watchdog timer reset) is happening very infrequently. 
The system will run flawlessly for 2-3 days before crashing. 
Unfortunately I do not have source level debugging capability on this 
old hardware. It is possible a memory exception could be vectoring me 
to a default exception handler that simply hangs in a loop until the 
watchdog timer resets the system (but proper code should never cause a 
memory exception). Or the sys_check_timeouts could simply be taking 
too long to execute. Can it ever take >5 seconds to execute 
sys_check_timeouts?


My IIM7010A ethernet interface is being operated in polled mode. My 
main loop operates as follows:

for (;;) {
  if (received ethernet frame available in wiznet) {
    ethernetif_input();    // this will read and process the 
ethernet frame for this interface

  }
  sys_check_timeouts();
  if (I have data to send) {
    size = size of my data to send; // size is never more than 128 bytes
    if (tcp_sndbuf(userinfo.pcb) >= size) {    // if enough free space 
to send it
  if (tcp_write(userinfo.pcb, mybuffer, size, TCP_WRITE_FLAG_COPY) 
== ERR_OK) { // if send is successful

    tcp_output(userinfo.pcb);    // initiate sending of data
  }
    }
  }
  do other stuff not related to lwip or tcp/ip    // none of it is 
very time consuming, should take only a few 10's of milliseconds

  reset_watchdog_timer();
}

I use ipv4 with fixed ip address. I have a single TCP/IP connection 
up, use callback function for received data, and everything is working 
perfectly except for the occasional crashes. My debugging ability is 
limited to setting debug variables to values in a region of memory 
that is preserved across reboots. My debug variables always show that 
the last thing I did was call sys_check_timeouts before the restart, 
and I never returned from sys_check_timeouts. Any ideas?


Keith



___
lwip-users mailing list
lwip-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/lwip-users



___
lwip-users mailing list
lwip-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/lwip-users

[lwip-users] lwip crashing, apparently in sys_check_timeouts

2018-08-20 Thread Keith Rubow
I am using lwip 2.0.3 with NO_SYS = 1 on a bare metal 386ex processor 
with a Wiznet IIM7010A ethernet interface operating in MAC RAW mode. 
Yes, this hardware is REALLY old, but we have lots of hardware out in 
the field and need to fix a problem, and lwip seems like the best way to 
fix it.


My hardware has a hardware watchdog timer that will reset the processor 
if not refreshed at least every 5 seconds. Since implementing lwip I am 
experiencing extremely infrequent system crashes. My debugging indicates 
that I call sys_check_timeouts, and then the watchdog timer times out, 
resetting the system. Normally the watchdog timer is getting refreshed 
many times per second around the main program loop. It appears that 
sys_check_timeouts is taking at least 5 seconds to execute.


This crash (or watchdog timer reset) is happening very infrequently. The 
system will run flawlessly for 2-3 days before crashing. Unfortunately I 
do not have source level debugging capability on this old hardware. It 
is possible a memory exception could be vectoring me to a default 
exception handler that simply hangs in a loop until the watchdog timer 
resets the system (but proper code should never cause a memory 
exception). Or the sys_check_timeouts could simply be taking too long to 
execute. Can it ever take >5 seconds to execute sys_check_timeouts?


My IIM7010A ethernet interface is being operated in polled mode. My main 
loop operates as follows:

for (;;) {
  if (received ethernet frame available in wiznet) {
    ethernetif_input();    // this will read and process the 
ethernet frame for this interface

  }
  sys_check_timeouts();
  if (I have data to send) {
    size = size of my data to send; // size is never more than 128 bytes
    if (tcp_sndbuf(userinfo.pcb) >= size) {    // if enough free space 
to send it
  if (tcp_write(userinfo.pcb, mybuffer, size, TCP_WRITE_FLAG_COPY) 
== ERR_OK) { // if send is successful

    tcp_output(userinfo.pcb);    // initiate sending of data
  }
    }
  }
  do other stuff not related to lwip or tcp/ip    // none of it is very 
time consuming, should take only a few 10's of milliseconds

  reset_watchdog_timer();
}

I use ipv4 with fixed ip address. I have a single TCP/IP connection up, 
use callback function for received data, and everything is working 
perfectly except for the occasional crashes. My debugging ability is 
limited to setting debug variables to values in a region of memory that 
is preserved across reboots. My debug variables always show that the 
last thing I did was call sys_check_timeouts before the restart, and I 
never returned from sys_check_timeouts. Any ideas?


Keith



___
lwip-users mailing list
lwip-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/lwip-users