⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rt_pend_tq.c

📁 rtlinux-3.2-pre3.tar.bz2 rtlinux3.2-pre3的源代码
💻 C
字号:
#define __NO_VERSION__/* rt_pend_tq.c */#include <linux/kernel.h>#include <linux/errno.h>#include <linux/sched.h>#include <linux/comedidev.h>	// for rt spinlocks#include "rt_pend_tq.h"#ifdef CONFIG_COMEDI_RTAI#include <rtai.h>#endif#ifdef CONFIG_COMEDI_RTL#include <rtl_core.h>#endif#ifdef standalone#include <linux/module.h>#define rt_pend_tq_init init_module#define rt_pend_tq_cleanup cleanup_module#endifvolatile static struct rt_pend_tq rt_pend_tq[RT_PEND_TQ_SIZE];volatile static struct rt_pend_tq * volatile rt_pend_head= rt_pend_tq,	* volatile rt_pend_tail = rt_pend_tq;int rt_pend_tq_irq=0;spinlock_t rt_pend_tq_lock = SPIN_LOCK_UNLOCKED;// WARNING: following code not checked against race conditions yet.#define INC_CIRCULAR_PTR(ptr,begin,size) do {if(++(ptr)>=(begin)+(size)) (ptr)=(begin); } while(0)#define DEC_CIRCULAR_PTR(ptr,begin,size) do {if(--(ptr)<(begin)) (ptr)=(begin)+(size)-1; } while(0)int rt_pend_call(void (*func)(int arg1, void * arg2), int arg1, void * arg2){	unsigned long flags;	if(func==NULL)		return -EINVAL;	if(rt_pend_tq_irq<=0)		return -ENODEV;	comedi_spin_lock_irqsave(&rt_pend_tq_lock, flags);	INC_CIRCULAR_PTR(rt_pend_head,rt_pend_tq,RT_PEND_TQ_SIZE);	if(rt_pend_head==rt_pend_tail) {		// overflow, we just refuse to take this request		DEC_CIRCULAR_PTR(rt_pend_head,rt_pend_tq,RT_PEND_TQ_SIZE);		comedi_spin_unlock_irqrestore(&rt_pend_tq_lock, flags);		return -EAGAIN;	}	rt_pend_head->func=func;	rt_pend_head->arg1=arg1;	rt_pend_head->arg2=arg2;	comedi_spin_unlock_irqrestore(&rt_pend_tq_lock, flags);#ifdef CONFIG_COMEDI_RTAI	rt_pend_linux_srq(rt_pend_tq_irq);#endif#ifdef CONFIG_COMEDI_RTL	rtl_global_pend_irq(rt_pend_tq_irq);#endif	return 0;}#ifdef CONFIG_COMEDI_RTAIvoid rt_pend_irq_handler(void)#endif#ifdef CONFIG_COMEDI_RTLvoid rt_pend_irq_handler(int irq, void *dev, struct pt_regs * regs)#endif{	while(rt_pend_head!=rt_pend_tail) {		INC_CIRCULAR_PTR(rt_pend_tail,rt_pend_tq,RT_PEND_TQ_SIZE);		rt_pend_tail->func(rt_pend_tail->arg1,rt_pend_tail->arg2);	}}int rt_pend_tq_init(void){	rt_pend_head=rt_pend_tail=rt_pend_tq;#ifdef CONFIG_COMEDI_RTAI	rt_pend_tq_irq=rt_request_srq(0,rt_pend_irq_handler,NULL);#endif#ifdef CONFIG_COMEDI_RTL	rt_pend_tq_irq=rtl_get_soft_irq(rt_pend_irq_handler,"rt_pend_irq");#endif	if(rt_pend_tq_irq>0)		printk("rt_pend_tq: RT bottom half scheduler initialized OK\n");	else		printk("rt_pend_tq: rtl_get_soft_irq failed\n");	return 0;}void rt_pend_tq_cleanup(void){	printk("rt_pend_tq: unloading\n");#ifdef CONFIG_COMEDI_RTAI	rt_free_srq(rt_pend_tq_irq);#endif#ifdef CONFIG_COMEDI_RTL	free_irq(rt_pend_tq_irq,NULL);#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -