亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rtai.c

?? rtai-3.1-test3的源代碼(Real-Time Application Interface )
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* arch/arm/rtai.cCOPYRIGHT (C) 2001 Paolo Mantegazza (mantegazza@aero.polimi.it)COPYRIGHT (C) 2001 Alex Z黳ke, SYSGO RTS GmbH (azu@sysgo.de)COPYRIGHT (C) 2002 Wolfgang M黮ler (wolfgang.mueller@dsa-ac.de)COPYRIGHT (C) 2002 Guennadi Liakhovetski, DSA GmbH (gl@dsa-ac.de)COPYRIGHT (C) 2002 Thomas Gleixner (gleixner@autronix.de)This program is free software; you can redistribute it and/or modifyit under the terms of version 2 of the GNU General Public License aspublished by the Free Software Foundation.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*//*--------------------------------------------------------------------------Changelog03-10-2002	TG	added support for trap handling.			added function rt_is_linux.11-07-2003	GL	First of a series of fixes, proposed by Thomas			Gleixner. Disable interrupts on return from			dispatch_[irq|srq]().12-07-2003	GL	Move closer to Linux. Remove re-declaration			of irq_desc, replace IBIT with Linux' I_BIT,			remove unneeded rtai_irq_t type.21-07-2003	GL	Fix a race in linux_sti(), created by making			linux_sti() re-entrant.28-07-2003	GL	Improve handling of pending interrupts to Linux,			put debugging BUG() statement, idea of which			belongs to Thomas Gleixner.29-07-2003	GL	Initial support for 2.4.19-rmk7 for StrongARM.28-08-2003	GL	Use native Linux masking for linux-only			interrupts. Handle unmasking of RTAI-Linux			shared interrupts, deliver them, if new			ones arrived, while the interrupt line			was masked by Linux.*/#include <linux/config.h>#include <linux/module.h>#include <linux/sched.h>#include <linux/interrupt.h>#include <linux/init.h>#include <linux/compiler.h>#include <asm/system.h>#include <asm/smp.h>#include <asm/io.h>#include <linux/bitops.h>#include <asm/atomic.h>#ifdef CONFIG_PROC_FS#include <linux/stat.h>#include <linux/proc_fs.h>#include <rtai_proc_fs.h>#endif#include <asm/rtai.h>#include <asm/rtai_srq.h>#include <rtai_version.h>#include <rtai_trace.h>#undef CONFIG_RTAI_MOUNT_ON_LOAD// proc filesystem additions.#ifdef CONFIG_PROC_FSstatic int rtai_proc_register(void);static void rtai_proc_unregister(void);#endif// End of proc filesystem additions./* Some define */#define NR_SYSRQS  	 	32#define NR_TRAPS		32/* these are prototypes for timer-handling abstraction */extern void linux_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs);extern void soft_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs);struct global_rt_status {	volatile unsigned int used_by_linux;	volatile unsigned int locked_cpus;	volatile int irq_in, irq_out, lost_irqs;	volatile rtai_irq_mask_t pending_srqs;	volatile rtai_irq_mask_t active_srqs;	struct list_head pending_linux_irq;	spinlock_t data_lock;	spinlock_t ic_lock;};static struct global_rt_status global __attribute__ ((aligned(32)));volatile unsigned int *locked_cpus = &global.locked_cpus;/* VERY IMPORTANT, since I saw no way to just ack, we mask_ack always, so	*//* it is likely we have to recall to set an arch dependent call to unmask	*//* in the scheduler timer handler. Other arch allow just to ack, maybe we'll	*//* we can get along as it is now, let's recall this point.			*/#include <asm/mach/irq.h>extern struct irqdesc irq_desc[];#include <asm/rtai_irqops.h>/* Most of our data */static struct irq_handling {	void (*handler)(int irq, void *dev_id, struct pt_regs *regs);	void *dev_id;	unsigned long count;} global_irq[NR_IRQS] __attribute__ ((__aligned__(32)));static struct irqdesc shadow_irq_desc[NR_IRQS];static struct sysrq_t {	unsigned int label;	void (*rtai_handler)(void);	long long (*user_handler)(unsigned int whatever);} sysrq[NR_SYSRQS];static RT_TRAP_HANDLER rtai_trap_handler[NR_TRAPS];// The main items to be saved-restored to make Linux our humble slavestatic struct rt_hal linux_rthal;static struct pt_regs rtai_regs;  // Dummy registers.static void *saved_timer_action_handler; // Saved timer-action handlerstatic struct cpu_own_status {	volatile unsigned int intr_flag;	volatile unsigned int linux_intr_flag;	volatile rtai_irq_mask_t pending_irqs;	volatile rtai_irq_mask_t active_irqs;} processor[NR_RT_CPUS];void send_ipi_shorthand(unsigned int shorthand, unsigned int irq) { }void send_ipi_logical(unsigned long dest, unsigned int irq) { }//static void hard_lock_all_handler(void) { }volatile union rtai_tsc rtai_tsc;static void linux_cli(void){	processor[hard_cpu_id()].intr_flag = 0;}static void (*ic_mask_ack_irq[NR_IRQS])(unsigned int irq);static void (*ic_mask_irq[NR_IRQS])(unsigned int irq);static void (*ic_unmask_irq[NR_IRQS])(unsigned int irq);/** * linux_sti() must be re-entrant. */static void linux_sti(void){	unsigned int irq;	unsigned long flags;	unsigned long cpuid;	struct cpu_own_status *cpu;	cpu = processor + (cpuid = hard_cpu_id());	hard_save_flags(flags);	if (unlikely(flags & I_BIT)) {		hard_sti();		BUG();	}	rt_spin_lock_irq(&(global.data_lock));	while (have_pending_irq() != NO_IRQ || have_pending_srq()) {		cpu->intr_flag = 0; /* cli */		while ((irq = have_pending_irq()) != NO_IRQ) {			struct irqdesc *desc = irq_desc + irq;#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,19)			if (desc->pending || desc->disable_depth || ! list_empty(&desc->pend)) {				printk(KERN_CRIT "IRQ %d: pending %d, disable_depth %d, running %d, list %sempty\n",				       irq, desc->pending, desc->disable_depth, desc->running,				       list_empty(&desc->pend) ? "" : "not ");				BUG();			}#else			if (! desc->enabled) {				printk(KERN_CRIT "IRQ %d: disabled\n", irq);				BUG();			}#endif			clear_pending_irq(irq);			/* Emulate Linux behaviour, i.e. serve multiplexed interrupts 1 at a time */			if (isdemuxirq(irq))				irq_desc[ARCH_MUX_IRQ].running = 1;			rt_spin_unlock_irq(&(global.data_lock));			// ** call old Linux do_IRQ() to handle IRQ			linux_rthal.do_IRQ(irq, &rtai_regs);			/* Unmasking is done in do_IRQ above - don't do twice */			rt_spin_lock_irq(&(global.data_lock));			if (isdemuxirq(irq))				irq_desc[ARCH_MUX_IRQ].running = 0;		}		// Local IRQ Handling - missing here ... only on SMP		cpu->intr_flag = I_BIT | (1 << cpuid); // sti()		if (have_pending_srq()) {			// SRQ Handling - same as on PPC			irq = pending_srq();			activate_srq(irq);			clear_pending_srq(irq);			rt_spin_unlock_irq(&(global.data_lock));			if (sysrq[irq].rtai_handler) {				sysrq[irq].rtai_handler();			}			rt_spin_lock_irq(&(global.data_lock));			deactivate_srq(irq);		}	}	rt_spin_unlock_irq(&(global.data_lock));	cpu->intr_flag = I_BIT | (1 << cpuid);}/* we need to return faked, but real flags * * imagine a function calling our linux_save_flags() while rtai is loaded * and restoring flags when rtai is unloaded. CPSR is broken ... */static unsigned int linux_save_flags(void){	unsigned long flags;	hard_save_flags( flags );	/* check if we are in CLI, then set I bit in flags */	return (flags & ~I_BIT) | ( processor[hard_cpu_id()].intr_flag ? 0 : I_BIT );}static void linux_restore_flags(unsigned int flags){	/* check if CLI-bit is set */	if (flags & I_BIT) {		processor[hard_cpu_id()].intr_flag = 0;	} else {		linux_sti();	}}#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21)static unsigned int linux_save_flags_sti(void){	unsigned long flags;	flags = linux_save_flags();	linux_sti();	return flags;}#endifunsigned int linux_save_flags_and_cli(void){	unsigned long flags;	flags = linux_save_flags();        processor[hard_cpu_id()].intr_flag = 0;	return flags;}unsigned long linux_save_flags_and_cli_cpuid(int cpuid){	return linux_save_flags_and_cli();}void rtai_just_copy_back(unsigned long flags, int cpuid){	/* also check if CLI-bit is set and set up intr_flag accordingly */	if (flags & I_BIT) {	        processor[cpuid].intr_flag = 0;	} else {	        processor[cpuid].intr_flag = I_BIT | (1 << cpuid);	}}// For the moment we just do mask_ack_unmask, maybe it has to be adjustedstatic void do_nothing_picfun(unsigned int irq) { }static void linux_mask_ack(unsigned int irq){	irq_desc[irq].masked = 1;}unsigned int rt_startup_irq(unsigned int irq){	unsigned int flags;	struct irqdesc *irq_desc;	if ((irq_desc = &shadow_irq_desc[irq])/* && irq_desc->unmask*/) {		flags = rt_spin_lock_irqsave(&global.ic_lock);		irq_desc->probing = 0;		irq_desc->triggered = 0;#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,19)		irq_desc->enabled = 1;#else		irq_desc->disable_depth = 0;#endif		irq_desc->unmask(irq);		rt_spin_unlock_irqrestore(flags, &global.ic_lock);	}	return 0;}void rt_shutdown_irq(unsigned int irq){	unsigned int flags;	struct irqdesc *irq_desc;	if ((irq_desc = &shadow_irq_desc[irq])) {		flags = rt_spin_lock_irqsave(&global.ic_lock);#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,19)		irq_desc->enabled = 0;#else		irq_desc->disable_depth = (unsigned int)-1;#endif		irq_desc->mask(irq);		rt_spin_unlock_irqrestore(flags, &global.ic_lock);	}}void rt_enable_irq(unsigned int irq){	unsigned int flags;	struct irqdesc *irq_desc;	if ((irq_desc = &shadow_irq_desc[irq])) {		flags = rt_spin_lock_irqsave(&global.ic_lock);#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,19)		irq_desc->probing = 0;		irq_desc->triggered = 0;		irq_desc->enabled = 1;		ic_unmask_irq[irq](irq);#else		if ( ! irq_desc->disable_depth ) {			printk("enable_irq(%u) unbalanced from %p\n", irq, __builtin_return_address(0));		} else if ( ! --irq_desc->disable_depth ) {			irq_desc->probing = 0;			ic_unmask_irq[irq](irq);		}#endif		rt_spin_unlock_irqrestore(flags, &global.ic_lock);	}}void rt_disable_irq(unsigned int irq){	unsigned int flags;	struct irqdesc *irq_desc;	if ((irq_desc = &shadow_irq_desc[irq])) {		flags = rt_spin_lock_irqsave(&global.ic_lock);#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,19)		irq_desc->enabled = 0;		ic_mask_irq[irq](irq);#else		if ( ! irq_desc->disable_depth++ )			ic_mask_irq[irq](irq);#endif		rt_spin_unlock_irqrestore(flags, &global.ic_lock);	}}void rt_mask_ack_irq(unsigned int irq){	unsigned int flags;	flags = rt_spin_lock_irqsave(&global.ic_lock);	ic_mask_ack_irq[irq](irq);	rt_spin_unlock_irqrestore(flags, &global.ic_lock);}void rt_mask_irq(unsigned int irq){	unsigned int flags;	flags = rt_spin_lock_irqsave(&global.ic_lock);	ic_mask_irq[irq](irq);	rt_spin_unlock_irqrestore(flags, &global.ic_lock);}void rt_unmask_irq(unsigned int irq){	unsigned int flags;	flags = rt_spin_lock_irqsave(&global.ic_lock);	ic_unmask_irq[irq](irq);	rt_spin_unlock_irqrestore(flags, &global.ic_lock);}/* * A real time handler must unmask ASAP. Especially important for the timer * ISR. When RTAI is mounted, this should be done in the macro * DO_TIMER_PROPER_OP(), called on entry to the rt_timer_handler(). */asmlinkage void dispatch_irq(int irq, struct pt_regs *regs){	rt_spin_lock(&global.ic_lock);	if (irq >= 0 && irq < NR_IRQS) {		ic_mask_ack_irq[irq](irq);		irq_desc[irq].masked = 0;		rt_spin_unlock(&global.ic_lock);		TRACE_RTAI_GLOBAL_IRQ_ENTRY(irq, !user_mode(regs));		// We just care about our own RT-Handlers installed		if (global_irq[irq].handler) {			/* If this interrupt happened in Linux, in the rt-handler below			   we might context-switch to rt, and then back to Linux, at which			   point linux_sti() might be called - which is a bit early yet.			   Prevent it. */			unsigned long flags = linux_save_flags_and_cli();			global_irq[irq].count++;			global_irq[irq].handler(irq, global_irq[irq].dev_id, regs);			rtai_just_copy_back(flags, hard_cpu_id());			rt_spin_lock_irq(&(global.data_lock));			/* The timer interrupt should be unmasked in the handler, due			   to RTAI's prioritisation of RT-tasks. Linux has a handler-flag			   to mark handlers, that want their interrupts to be unmasked			   immediately (hint). */			ic_unmask_irq[irq](irq);		} else {			rt_spin_lock(&(global.data_lock));			rt_pend_linux_irq(irq);		}		if (! isdemuxirq(irq) && (global.used_by_linux & processor[hard_cpu_id()].intr_flag)) {			linux_cli();			rt_spin_unlock_irq(&(global.data_lock));			linux_sti();		} else {			rt_spin_unlock(&(global.data_lock));		}		TRACE_RTAI_GLOBAL_IRQ_EXIT();	} else {		rt_spin_unlock(&global.ic_lock);		printk(KERN_ERR "RTAI-IRQ: spurious interrupt 0x%02x\n", irq);	}	hard_cli();}#define MIN_IDT_VEC 0xF0#define MAX_IDT_VEC 0xFFstatic unsigned long long (*idt_table[MAX_IDT_VEC - MIN_IDT_VEC + 1])(unsigned int srq, unsigned long name);asmlinkage long long dispatch_srq(int srq, unsigned long whatever){	unsigned long vec;	long long retval = -1;	if (!(vec = srq >> 24)) {		TRACE_RTAI_SRQ_ENTRY(srq, 0);		if (srq > 1 && srq < NR_SYSRQS && sysrq[srq].user_handler) {			retval = sysrq[srq].user_handler(whatever);		} else {			for (srq = 2; srq < NR_SYSRQS; srq++) {				if (sysrq[srq].label == whatever) {					retval = srq;				}			}		}		TRACE_RTAI_SRQ_EXIT();	} else {		if ((vec >= MIN_IDT_VEC) && (vec <= MAX_IDT_VEC) && (idt_table[vec - MIN_IDT_VEC])) {			TRACE_RTAI_SRQ_ENTRY(srq, 0);			retval = idt_table[vec - MIN_IDT_VEC](srq & 0xFFFFFF, whatever);			TRACE_RTAI_SRQ_EXIT();		} else {			printk("RTAI SRQ DISPATCHER: bad srq (0x%0x)\n", (int) vec);		}	}	hard_cli();	return retval;}struct desc_struct rt_set_full_intr_vect(unsigned int vector, int type, int dpl, void *handler){	struct desc_struct fun = { 0 };	if (vector >= MIN_IDT_VEC && vector <= MAX_IDT_VEC) {		fun.fun = idt_table[vector - MIN_IDT_VEC];		idt_table[vector - MIN_IDT_VEC] = handler;		if (!rthal.do_SRQ) {			rthal.do_SRQ = dispatch_srq;		}	}	return fun;}void rt_reset_full_intr_vect(unsigned int vector, struct desc_struct idt_element){	if (vector >= MIN_IDT_VEC && vector <= MAX_IDT_VEC) {		idt_table[vector - MIN_IDT_VEC] = idt_element.fun;	}}/* *	Dispatch Traps like Illegal instruction, .... *	Keep call compatible to x386  */asmlinkage int dispatch_trap(int vector, struct pt_regs *regs){	if ( (vector < NR_TRAPS) && (rtai_trap_handler[vector]) ) 		return rtai_trap_handler[vector](vector, vector, regs, NULL);	return 1;	/* Let Linux do the job */}RT_TRAP_HANDLER rt_set_rtai_trap_handler(int trap, RT_TRAP_HANDLER handler){        RT_TRAP_HANDLER old_handler = NULL;	if (trap < NR_TRAPS) {		old_handler = rtai_trap_handler[trap];

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品一区八戒影视| 一区二区三区不卡视频在线观看| 国产欧美一区二区精品性| 成人欧美一区二区三区黑人麻豆 | 亚洲欧美日韩在线| 成人看片黄a免费看在线| 日本一区二区免费在线| 日韩欧美精品三级| 亚洲欧洲av一区二区三区久久| 麻豆91精品视频| 在线观看精品一区| 中文字幕日本乱码精品影院| 精品一区二区日韩| 91精品一区二区三区久久久久久 | 免费欧美高清视频| 99国产精品久久久久久久久久久| 日韩精品中文字幕在线一区| 亚洲成人黄色小说| 色诱亚洲精品久久久久久| 国产欧美一区二区精品秋霞影院 | 国产精品一区免费在线观看| 欧美系列日韩一区| 一区二区三区在线高清| 丁香婷婷综合色啪| 久久久久久黄色| 国产在线国偷精品产拍免费yy| 91精品国产高清一区二区三区蜜臀| 亚洲视频中文字幕| 91丝袜美腿高跟国产极品老师| 国产精品乱人伦一区二区| 国产高清一区日本| 国产午夜精品久久| 福利一区在线观看| 中文字幕精品一区 | 麻豆精品精品国产自在97香蕉| 欧美三级电影网| 亚洲成人精品影院| 在线播放一区二区三区| 日韩电影免费一区| 日韩欧美精品三级| 国产精品一二二区| 国产精品免费看片| 91丨porny丨在线| 一级中文字幕一区二区| 欧美性做爰猛烈叫床潮| 石原莉奈在线亚洲二区| 91麻豆精品国产综合久久久久久| 日韩精品电影一区亚洲| 精品国产乱码久久久久久闺蜜 | 成人激情动漫在线观看| 中文字幕制服丝袜一区二区三区| 91啪亚洲精品| 亚洲午夜久久久| 欧美一区二区久久| 国产成人在线看| 亚洲免费成人av| 91麻豆精品国产| 国产一区二三区| 国产精品激情偷乱一区二区∴| 91久久精品一区二区| 日韩电影在线一区| 国产三级一区二区| 欧美亚洲禁片免费| 精品一区二区三区不卡| 亚洲丝袜自拍清纯另类| 91精品国产色综合久久久蜜香臀| 国产毛片精品视频| 亚洲国产中文字幕在线视频综合| 日韩一二三四区| av激情亚洲男人天堂| 五月婷婷欧美视频| 中文久久乱码一区二区| 欧美日韩免费视频| 成人精品视频一区| 日韩成人精品视频| 亚洲婷婷综合久久一本伊一区| 欧美一区二区三区婷婷月色 | 中文乱码免费一区二区| 欧美另类变人与禽xxxxx| 成人手机电影网| 奇米色777欧美一区二区| 亚洲色图另类专区| 精品粉嫩超白一线天av| 在线观看欧美黄色| 成人高清视频在线| 激情文学综合插| 午夜婷婷国产麻豆精品| 国产精品欧美久久久久一区二区| 91精品婷婷国产综合久久性色| 成人午夜av在线| 精品无码三级在线观看视频| 亚洲一区二区三区爽爽爽爽爽| 国产亚洲一二三区| 日韩色视频在线观看| 欧美体内she精视频| 91亚洲精品乱码久久久久久蜜桃 | 亚洲免费资源在线播放| 久久久久久久久久美女| 欧美一区二区在线观看| 欧美日韩视频一区二区| 91亚洲永久精品| hitomi一区二区三区精品| 久久99精品国产.久久久久| 天天综合日日夜夜精品| 亚洲一区二区3| 一区二区三区中文字幕在线观看| 欧美国产日韩在线观看| 26uuu国产一区二区三区| 日韩欧美一区二区在线视频| 欧美剧情片在线观看| 欧美亚洲图片小说| 日本韩国欧美国产| 欧美曰成人黄网| 一本色道**综合亚洲精品蜜桃冫 | 欧美日韩色一区| 欧美在线视频全部完| 在线观看免费成人| 欧美色偷偷大香| 欧美精品黑人性xxxx| 欧美片网站yy| 欧美一级视频精品观看| 日韩三级免费观看| 欧美xingq一区二区| 久久免费视频一区| 中文字幕高清不卡| 亚洲日本护士毛茸茸| 亚洲在线视频网站| 视频在线观看一区二区三区| 视频一区二区三区中文字幕| 日本一不卡视频| 精品一区二区在线观看| 国产精品主播直播| 97精品国产97久久久久久久久久久久| gogo大胆日本视频一区| 在线免费观看成人短视频| 国产精品午夜电影| 亚洲特黄一级片| 日韩精品电影一区亚洲| 国产美女视频91| 91在线无精精品入口| 在线电影国产精品| 久久综合久久99| 亚洲伦理在线精品| 日韩高清不卡一区二区三区| 国内偷窥港台综合视频在线播放| 国产黄色91视频| 欧美色图片你懂的| 国产亚洲一区二区三区| 亚洲精品国产精华液| 蜜臀a∨国产成人精品| 成人一级片网址| 欧美人与性动xxxx| 国产校园另类小说区| 一区二区三区高清在线| 麻豆精品视频在线观看免费 | 麻豆免费精品视频| 成人动漫视频在线| 日韩一区二区三区免费看| 国产欧美日韩在线观看| 午夜一区二区三区在线观看| 国产一区二区女| 欧美性xxxxxx少妇| 国产精品久久久久久久久搜平片 | 日本不卡中文字幕| 99久久国产综合精品色伊| 日韩一级视频免费观看在线| 欧美高清在线视频| 日韩电影在线一区| 91久久精品一区二区二区| 久久免费美女视频| 日韩精品成人一区二区三区| 99久久婷婷国产综合精品| 欧美大片拔萝卜| 亚洲国产视频直播| 91污片在线观看| 久久精品亚洲精品国产欧美kt∨| 污片在线观看一区二区| 99精品视频免费在线观看| 日韩精品中文字幕在线不卡尤物| 亚洲另类春色国产| 波多野结衣欧美| 久久精品人人爽人人爽| 青青草成人在线观看| 欧美三级三级三级| 亚洲欧美一区二区不卡| 成人性生交大片免费看在线播放| 欧美大片拔萝卜| 蜜桃在线一区二区三区| 欧美高清dvd| 亚洲动漫第一页| 一本大道av一区二区在线播放| 国产精品全国免费观看高清 | 丁香六月综合激情| 久久先锋影音av鲁色资源| 免费在线观看不卡| 日韩三级在线免费观看| 美女尤物国产一区| 日韩欧美卡一卡二| 国产自产2019最新不卡| 精品国内二区三区|