Listing 1: Using a real-time FIFO
#define IN_FIFO_ID 1
#define OUT_FIFO_ID 2
#define IN_FIFO_LENGTH 0x100
#define OUT_FIFO_LENGTH 0x100
// RT FIFO invokes this function every time the user process writes
// something into /dev/rtf1
int pd_do_aout(unsigned int fifo)
{
u32 ao_value;
while ((err = rtf_get(IN_FIFO_ID, &ao_value, sizeof(u32)))
== sizeof(u32))
{
pd_aout_write(board, ao_value);
}
if (err != 0) return -EINVAL; else return 0;
}
void *pp_thread_ep(void *rate) // our periodic thread
{
u16 ain_data;
...
ret = pd_ain_read(board, &ain_data); // read value from analog in
// write to the output FIFO where user process can read it from /dev/rtf2
ret = rtf_put(OUT_FIFO_ID, &ain_data, sizeof(u16));
... process ret for return codes ...
}
init_module(void)
{ ...
// free up the resource, just in case
rtf_destroy(IN_FIFO_ID);
rtf_destroy(OUT_FIFO_ID);
// create fifos we can talk via /dev/rtf1 and /dev/rtf2
rtf_create(IN_FIFO_ID, IN_FIFO_LENGTH); // rt task <- user process
rtf_create(OUT_FIFO_ID, OUT_FIFO_LENGTH); // rt task -> user process
rtf_create_handler(IN_FIFO_ID, &pd_do_aout);
...
}
cleanup_module(void)
{ ...
rtf_destroy(IN_FIFO_ID); // free up the resource, just in case
rtf_destroy(OUT_FIFO_ID); // free up the resource, just in case
...
}
|