Subject:
|
LNP collision detection Bug found and fixed
|
Newsgroups:
|
lugnet.robotics.rcx.legos
|
Date:
|
Wed, 8 Dec 1999 03:25:37 GMT
|
Viewed:
|
1031 times
|
| |
| |
Hi there, i just found an evil little bug in lnp ( or maybe it's
actually a bug in gcc ). The problem is the definition of tx_state as
char, and compare operations like if (tx_state < TX_ACTIVE) . The
compiler generates wrong code for this operation. Also, setting
tx_state=TX_COLL ( #defined to -1) sets it to 0 ! looks like the
compiler treats char as unsigned ?
If you use lnp everything works fine as long as no collision happens,
beacuse TX_COLL is not involved. If it does, lnp_logical_write() never
returns in most cases.
My fix: declare tx_state as volatile int, and omit the cast to volatile
char* in lnp_logical.c. It works for me, and collisions are detected now
as expected.
BTW, i wrote a little linux library that tries to implement lnp exactly
like the RCX does, i.e., looking for frame-errors and unexpected receive
chars while sending. The only difference is the inter-byte-timeout,
which must be set a little bit higher on linux.
The reason for this: sigio is not delivered on each incoming byte, some
tests show on my box there are up to 8 bytes in the queue when sigio is
delivered. I guess this effect is due to linux scheduling with 100 Hz (
on i386 ). Setting the interbyte timeout to 3 times the value used on
the RCX works fine. Maybe it also would help to use realtime scheduling,
but you have to set the program SUID root for this ;-( i haven't tested
this so far.
I'm not really happy with this implementation, because it uses signals
heavily and handlers are called from inside sigio handler, what means
they cannot use full libc functionality.
I'd like to try to build an implementation based on POSIX threads,
sometime... However, it looks like it's working so far, if anyone is
interested in the source drop me a note.
|
|
Message has 1 Reply:
3 Messages in This Thread:
- Entire Thread on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
|
|
|
|