赞
踩
头文件:
#include
相关函数:
创建FIFO:
int rtf_create(unsigned int fifo, int size);
参数:size指定fifo大小。fifo参数是这一fifo的标识符(由用户指定),系统内唯一,其值必须小于RTF_NO.
返回值:成功为0.
为FIFO创建一个处理器(1):
int rtf_create_handler(unsigned int fifo, int (*
handler)());
参数:指定的FIFO,及为其指定的处理器。
注意:rtf_create_handler函数为指定的FIFO创建一个处理器。当数据被用户空间的程序(linux进程)读取或写入的时候,这个处理器将被执行。这一处理器的优先级与linux的优先级一样,是最低的。
为FIFO创建一个处理器(2):
int rtf_create_rt_handler(unsigned int fifo, int (*
handler)());
参数,指定的FIFO,及为其指定的处理器。
注意:rtf_create_rt_handler函数为指定的FIFO创建一个处理器,当在指定的FIFO上进行rtf_get或rtf_put时,处理器将被调用。即,当实时进程(内核空间)对指定fifo进行读写时,此处理器将被调用。处理器将在调用rtf_put或rtf_get的任务的上下文中执行,即在内核空间中执行。可以通过信号号,使处理器动作同步:在线程中使用sem_wait(),然后在处理器中释放该信号量。
总结:FIFO是一种机制,当作字符设备来使用。用于在实时的线程间,或实时线程与linux进程间,通信。实时模式使用rtf_put(),rtf_get()访问fifo;linux进程使用标准的字符设备访问函数:read(),write(),select()等。
销毁fifo:
int rtf_destroy(unsigned int fifo);
清空fifo:
int rtf_flush(unsigned int fifo);
从fifo中读取数据:
int rtf_get(unsigned int fifo, char * buf, int count);
参数:fifo,被读取的fifo;
buf指定目的地址,count指定读取的数据大小。
注意:此函数与rtf_put只用于实时任务,而linux进程则使用read(),write()来读取/写入fifo.
总结:rtf_get()通常与rtf_create_handler来联合使用来同步处理接收到的数据。
例程即是如此:指定一fifo只用于linux进程写消息,实时任务读消息。将此fifo与一handler绑定。在handler中从这一fifo中读消息。这样,当linux进程写入消息后,handler马上被触发执行(注意:优先级最低),从fifo中用rtf_get()读出消息,达到同步。
问题:由于优先级最低,是否会被耽误。
例程片断:
c[2] = rtf_create(3, 200);//创建fifo;
rtf_create_handler(3, &my_handler);//绑定handler;
if ((ctl = open("/dev/rtf3", O_WRONLY)) < 0){}
//打开设备
if (write(ctl, &msg, sizeof(msg)) < 0){}//向设备中写消息
此时handler被调用:
struct my_msg_struct msg;
if ((err = rtf_get (fifonum, &msg, sizeof(msg))) ==
sizeof(msg))//handler中接收消息
向fifo中写数据:
int rtf_put(unsigned int fifo, char * buf, int count);
为FIFO安装ioctl():
int rtf_link_user_ioctl(unsigned int fifo, int
(*handler)(unsigned int fifo, unsigned int cmd, unsigned long
arg));
说明:此函数将,对字符设备fifo的ioctl调用,传递给handler功能。ioctl的参数同时传给handler,handler的返回值传回ioctl(),作为其返回值。
将一对fifo绑定成一双向fifo:
int rtf_make_user_pair(unsigned int N, unsigned int
P);
说明:rtf_make_user_pari()改变fifo
N的行为:当用户空间程序读取/dev/rtfN时,访问传给fifo P,即读取fifo
p。当用户空间程序写入/dev/rtfN时,将访问fifo N.
即,对于用户空间程序来说,只需访问一个设备:/dev/rtfN即可,而实际对/dev/rtfN的读,写,分别传递给两个fifo:
fifo P和fifo N.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。