Hello,
I have found a bug in RTAI fifos (newfifos).
The return result from rtf_put() indicates that the entire buffer
has been written even when only a portion of the buffer has been written.
The following patch fixes this problem.
Also, from the user side, one cannot successfully select() on a /dev/rtf
handle unless there is _already_ data in the fifo. A workaround is to
poll by calling select with 0 timeout, but that is lame.
RTL appears not to have these bugs. Also RTL allows me to create a
fifo with a large (16MB) buffer whereas RTAI can only create fifos
with 64KB buffers.
My application is one that runs at a very high frequency and sends a
large amount of data back to user-space.
Unfortunately, the RTL/pthreads approach seems to be much more costly
(in cpu cycles) than in RTAI, so I cannot run at as high of a frequency.
Does anyone know if using the version 1 API of RTL instead of pthreads
would cut the fat and allow tighter timing?
-Truxton
--- rtai_fifos.c~ Tue Jan 18 02:14:51 2000
+++ rtai_fifos.c Sun Aug 20 16:08:39 2000
@@ -472,16 +472,20 @@
static inline int mbx_send_wp(MBX *mbx, void *msg, int msg_size, int lnx)
{
unsigned long flags;
+ int send_size ;
flags = rtf_save_flags_and_cli();
if (mbx->sndsem.free && mbx->frbs) {
mbx->sndsem.free = 0;
rtf_restore_flags(flags);
- mbx_put(mbx, (char **)(&msg),
- msg_size > mbx->frbs ? mbx->frbs : msg_size, lnx);
+ if(msg_size > mbx->frbs)
+ send_size=mbx->frbs ;
+ else
+ send_size=msg_size ;
+ mbx_put(mbx, (char **)(&msg), send_size, lnx);
mbx_signal(mbx);
mbx_sem_signal(&(mbx->sndsem), (FIFO *)mbx);
- return 0;
+ return (msg_size-send_size);
}
rtf_restore_flags(flags);
return msg_size;
-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
---
For more information on Real-Time Linux see:
http://www.rtlinux.org/rtlinux/