[ECOS] Réf. : Re: [ECOS] Question on Posix Select function
Wed Jun 21 07:22:00 GMT 2006
1) Our Instrument package stores Timebase, Events code, thread and 2 arguments
and compress each frame and store the frame in a buffer, then when the buffer
reach 1500 oct, it sends the buffer on Ethernet. This allow to reduce the number
of instrument event.
We don't use the Redboot network stack because the PC software need to control
the instrument package on the board in real time.
For exemple, during the run, we can start or stop the trace, change events
filter or we can ask the name and priority of each thread.
2) Thank you for your answer but we don't have the SELECT_WAIT_FLAG_GET() macro
because our eCos PRO is too old. In fact, it seems to work with just one mutex.
We are going to update our eCos soon.
Andrew Lunn <firstname.lastname@example.org> le 20/06/2006 12:33:59
Pour Emmanuel COULLIEN/Faiveley
cc : email@example.com
Objet Re: [ECOS] Question on Posix Select function
On Mon, Jun 19, 2006 at 11:17:42AM +0200, firstname.lastname@example.org wrote:
> We are working on a package to complete the eCos Intrument package
> for communicating with a PC software through Ethernet. The goal is
> to record in real time the Instrument informations from the board to
> the PC and to watch a graph to show tasks and other instrument
Interesting. How do you solve the obvious race condition that using
the network to send the events generate events?
Ideally you should use the RedBoot network stack for this.
> We began to graph a module with a SELECT function but we have some
> difficulties to understand what we see on the Graph. In a task,
> before sending, we call the select function. In fact the task which
> calls the SELECT function is switching on even if the driver is not
> ready to send. So the graph shows that this task is active very
> often instead to sleep until the driver is ready to send. Do
> someone know how to explain this phenomenon and how does the Posix
> select function really work ?
There is pritty good comments in the code. Have you read them:
// A flag is used to block a thread until data from the device is
// available. This prevents all threads from waking up at the same
// time and polling for changes. Each thread is allocated a flag bit
// via the SELECT_WAIT_FLAG_GET() macro when the thread registers for
// selection via cyg_selrecord (). The flag is stored in the driver's
// select info block. Only those threads specified via the flags in
// the select info are woken up by cyg_selwakeup (). If there are
// more than 32 threads in the system, then there is a chance that
// cyg_selwakeup () may wake up more than one thread. Each thread then
// polls for changes.
So you probably have the same bit set as some other thread using the network.
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss
More information about the Ecos-discuss