[En-Nut-Discussion] Dual rs232<->Ethernet

Ulrich Prinz uprinz2 at netscape.net
Mon Nov 9 20:35:05 CET 2009


Hi!

Only had a short look into your code:

You should set NutThreadSetPriority() inside the Threads. Probably the 
same priority for all of them. You should not rise the main() routines 
priority to 128. Background is, that NutThreadSetPriority() sets the 
priority of the task it is called from. And calling it in main will 
modify the prio of the main task, that is doing nothing in your application.

So delete line 143 and do a NutSleep(5000), or if you have a blinking 
LED for giving an 'alive' signal, toggle it there and do a NutSleep( 
1000) there.
Insert NutThreadSetPriority(50) in the two tasks before going into the 
main loop of the task ( i.e. for(;;) {) at lines 54 and 74.
So all four tasks have same priority and are called round and round.

You're using NutThreadYeald() so, if this function is reached, the 
thread releases the CPU to the next waiting thread. This will normally 
lead to the same result than giving all tasks the same priority. 
Remember that if there is only one thread with a higher priority, it 
will always be the next called every NutThreadYeald(). Therefore it is 
better to actively set priorities.

You do not do any buffer checking. So if one of the receiving or sending 
queues is running out of buffer, you have no chance to react.
To find out, what is happening on the crashes, you should enable some 
debug and may be constantly printf your free memory.
You could add a line of code in StreamCopy() to check if the 
buff=malloc() did return something != NULL, as NULL means that there was 
not enough memory to reserve as requested.
Put a debug inside to see if that condition happens.

And, I think, if a free(NULL) is issued, something crashes. I am not 
sure, but put that while(){} loop inside an:
if( buff) {
   loop
}
else {
   Debug() <- could be printf("No MEM!\n")
   free(buff)
}

If the debug comes, you know two things:
1) You run into conditions, where no memory is available anymore
2) I was was wrong and the free(buff) can be called when the malloc 
failed and buff is NULL.

If it still crashes, and there is only a part of the debug or no debug, 
add a
fflush( stdout) behind the debug and try again.
If now the debug comes, you put free(buff) out of else into if and if 
now debug works you have only one problem left:
You need to find out, why now the system does not crash, but looses data 
cause there are no buffers available.

Please check the behavior of fread. I am mixing that up often, but there 
are functions that _wait_ for data to arrive and have a timeout and are 
blocking and there are ones that take what is available and do not block 
if there is no data available.
So if you use one of the blocking ones to read from usart or network, 
the buffer of the other thread may fill up, while the thread is waiting, 
blocked by the active thread.
It is better to use the non-blocking function or set a timeout of a very 
low to nothing value for the blocking ones. So you will more often 
switch from one task to the other but you work with smaller buffers and 
higher 'sampling' of data to transfer.

Best regards
Ulrich

asdus schrieb:
> Hi all!
> After some tries I'm get fully workable code. You can see that here:
> http://pastebin.mozilla-russia.org/102504
> 
> But I still have rare freezes, and need to manually reset my device.
> Have a chance to resolve this?
> 
> 2009/10/27 asdus <asdusik at gmail.com>:
>> Hi all.
>> For my home automation i need to use 2 rs232<->ethernet converters
>> I'm buy Ethernut V 1.3 H board and try to make it, using rs232d, Basic
>> TCP Server and Serial Port Monitor examples.
>> Using that i need to do this in dedicated threads, because i'm use
>> other ethernut's digital pins to get home events. All my tries fails,
>> i have lags using my remote rs232's.
> _______________________________________________
> http://lists.egnite.de/mailman/listinfo/en-nut-discussion


More information about the En-Nut-Discussion mailing list