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

📄 common.c

📁 rtai-3.1-test3的源代码(Real-Time Application Interface )
💻 C
📖 第 1 页 / 共 3 页
字号:
        return 0;}static inline int drg_on_name(unsigned long name){	unsigned long flags;	int slot;	for (slot = 1; slot <= max_slots; slot++) {		flags = rt_spin_lock_irqsave(&list_lock);		if (lxrt_list[slot].name == name) {			if (slot < max_slots) {				lxrt_list[slot] = lxrt_list[max_slots];			}			if (max_slots > 0) {				max_slots--;			}			rt_spin_unlock_irqrestore(flags, &list_lock);			return slot;		}		rt_spin_unlock_irqrestore(flags, &list_lock);	}	return 0;} static inline int drg_on_name_cnt(unsigned long name){	unsigned long flags;	int slot, count;	for (slot = 1; slot <= max_slots; slot++) {		flags = rt_spin_lock_irqsave(&list_lock);		if (lxrt_list[slot].name == name && lxrt_list[slot].count > 0 && !(count = --lxrt_list[slot].count)) {			if (slot < max_slots) {				lxrt_list[slot] = lxrt_list[max_slots];			}			if (max_slots > 0) {				max_slots--;			}			rt_spin_unlock_irqrestore(flags, &list_lock);			return count;		}		rt_spin_unlock_irqrestore(flags, &list_lock);	}	return -EFAULT;} static inline int drg_on_adr(void *adr){	unsigned long flags;	int slot;	for (slot = 1; slot <= max_slots; slot++) {		flags = rt_spin_lock_irqsave(&list_lock);		if (lxrt_list[slot].adr == adr) {			if (slot < max_slots) {				lxrt_list[slot] = lxrt_list[max_slots];			}			if (max_slots > 0) {				max_slots--;			}			rt_spin_unlock_irqrestore(flags, &list_lock);			return slot;		}		rt_spin_unlock_irqrestore(flags, &list_lock);	}	return 0;} static inline int drg_on_adr_cnt(void *adr){	unsigned long flags;	int slot, count;	for (slot = 1; slot <= max_slots; slot++) {		flags = rt_spin_lock_irqsave(&list_lock);		if (lxrt_list[slot].adr == adr && lxrt_list[slot].count > 0 && !(count = --lxrt_list[slot].count)) {			if (slot < max_slots) {				lxrt_list[slot] = lxrt_list[max_slots];			}			if (max_slots > 0) {				max_slots--;			}			rt_spin_unlock_irqrestore(flags, &list_lock);			return count;		}		rt_spin_unlock_irqrestore(flags, &list_lock);	}	return -EFAULT;} static inline unsigned long get_name(void *adr){	static unsigned long nameseed = 0xfacade;	int slot;        if (!adr) {		unsigned long flags;		unsigned long name;		flags = rt_spin_lock_irqsave(&list_lock);		name = nameseed++;		rt_spin_unlock_irqrestore(flags, &list_lock);		return name;        }	for (slot = 1; slot <= max_slots; slot++) {		if (lxrt_list[slot].adr == adr) {			return lxrt_list[slot].name;		}	}	return 0;} static inline void *get_adr(unsigned long name){	int slot;	for (slot = 1; slot <= max_slots; slot++) {		if (lxrt_list[slot].name == name) {			return lxrt_list[slot].adr;		}	}	return 0;} static inline void *get_adr_cnt(unsigned long name){	unsigned long flags;	int slot;	for (slot = 1; slot <= max_slots; slot++) {		flags = rt_spin_lock_irqsave(&list_lock);		if (lxrt_list[slot].name == name) {			++lxrt_list[slot].count;			rt_spin_unlock_irqrestore(flags, &list_lock);			return lxrt_list[slot].adr;		}		rt_spin_unlock_irqrestore(flags, &list_lock);	}	return 0;} static inline int get_type(unsigned long name){        int slot;        for (slot = 1; slot <= max_slots; slot++) {                if (lxrt_list[slot].name == name) {                        return lxrt_list[slot].type;                }        }        return -EINVAL;}unsigned long is_process_registered(struct task_struct *tsk){	int slot;	for (slot = 1; slot <= max_slots; slot++) {		if (lxrt_list[slot].tsk == tsk) {			if (lxrt_list[slot].pid == (tsk ? tsk->pid : 0)) {				return lxrt_list[slot].name;			}                }        }        return 0;}/** * @ingroup lxrt * Register an object. * * rt_register registers the object to be identified with @a name, which is * pointed by @a adr. * * @return a positive number on success, 0 on failure. */int rt_register(unsigned long name, void *adr, int type, struct task_struct *t){/* * Register a resource. This function provides the service to all RTAI tasks.*/	return get_adr(name) ? 0 : registr(name, adr, type, t );}/** * @ingroup lxrt * Deregister an object by its name. * * rt_drg_on_name deregisters the object identified by its @a name. * * @return a positive number on success, 0 on failure. */int rt_drg_on_name(unsigned long name){	return drg_on_name(name);} /** * @ingroup lxrt * Deregister an object by its address. * * rt_drg_on_adr deregisters the object identified by its @a adr. * * @return a positive number on success, 0 on failure. */int rt_drg_on_adr(void *adr){	return drg_on_adr(adr);} unsigned long rt_get_name(void *adr){	return get_name(adr);} void *rt_get_adr(unsigned long name){	return get_adr(name);}int rt_get_type(unsigned long name){	return get_type(name);}int rt_drg_on_name_cnt(unsigned long name){	return drg_on_name_cnt(name);}int rt_drg_on_adr_cnt(void *adr){	return drg_on_adr_cnt(adr);}void *rt_get_adr_cnt(unsigned long name){	return get_adr_cnt(name);}#ifdef CONFIG_RTAI_SCHED_ISR_LOCKvoid rtai_handle_isched_lock (int nesting) /* Called with interrupts off */{    if (nesting == 0)		/* Leaving interrupt context (inner one processed) */	rt_sched_unlock();    else	rt_sched_lock();	/* Entering interrupt context */}#endif /* CONFIG_RTAI_SCHED_ISR_LOCK */#include <rtai_lxrt.h>extern struct rt_fun_entry rt_fun_lxrt[];void krtai_objects_release(void){	int slot;        struct rt_registry_entry_struct entry;	char name[8], *type;	for (slot = 1; slot <= max_slots; slot++) {                if (rt_get_registry_slot(slot, &entry) && entry.adr) {			switch (entry.type) {	                       	case IS_TASK:					type = "TASK";					rt_named_task_delete(entry.adr);					break;				case IS_SEM:					type = "SEM ";					((void (*)(void *))rt_fun_lxrt[NAMED_SEM_DELETE].fun)(entry.adr);					break;				case IS_RWL:					type = "RWL ";					((void (*)(void *))rt_fun_lxrt[NAMED_RWL_DELETE].fun)(entry.adr);					break;				case IS_SPL:					type = "SPL ";					((void (*)(void *))rt_fun_lxrt[NAMED_SPL_DELETE].fun)(entry.adr);					break;				case IS_MBX:					type = "MBX ";					((void (*)(void *))rt_fun_lxrt[NAMED_MBX_DELETE].fun)(entry.adr);	                       		break;					case IS_PRX:					type = "PRX ";					((void (*)(void *))rt_fun_lxrt[PROXY_DETACH].fun)(entry.adr);					rt_drg_on_adr(entry.adr); 					break;	                       	default:					type = "ALIEN";					break;			}			num2nam(entry.name, name);			rt_printk("SCHED releases registered named %s %s\n", type, name);		}	}}/* ++++++++++++++++++++ END OF COMMON FUNCTIONALITIES +++++++++++++++++++++++ */#ifdef CONFIG_PROC_FS#include <linux/stat.h>#include <linux/proc_fs.h>#include <rtai_proc_fs.h>#include <rtai_nam2num.h>extern struct proc_dir_entry *rtai_proc_root;int rt_get_registry_slot(int slot, struct rt_registry_entry_struct* entry){	unsigned long flags;	if(entry == 0) {		return 0;	}	flags = rt_spin_lock_irqsave(&list_lock);	if (slot > 0 && slot <= max_slots ) {		if (lxrt_list[slot].name != 0) {			*entry = lxrt_list[slot];			rt_spin_unlock_irqrestore(flags, &list_lock);			return slot;		}	}	rt_spin_unlock_irqrestore(flags, &list_lock);	return 0;}/* ----------------------< proc filesystem section >----------------------*/static int rtai_read_lxrt(char *page, char **start, off_t off, int count, int *eof, void *data){	PROC_PRINT_VARS;	struct rt_registry_entry_struct entry;	char *type_name[] = { "TASK", "SEM", "RWL", "SPL", "MBX", "PRX", "BITS", "TBX", "HPCK" };	unsigned int i = 1;	char name[8];	PROC_PRINT("\nRTAI LXRT Information.\n\n");	PROC_PRINT("    MAX_SLOTS = %d\n\n", MAX_SLOTS);//                  1234 123456 0x12345678 ALIEN  0x12345678 0x12345678   1234567      1234567	PROC_PRINT("                                         Linux_Owner         Parent PID\n");	PROC_PRINT("Slot Name   ID         Type   RT_Handle    Pointer   Tsk_PID   MEM_Sz   USG Cnt\n");	PROC_PRINT("-------------------------------------------------------------------------------\n");	for (i = 1; i <= max_slots; i++) {		if (rt_get_registry_slot(i, &entry)) {			num2nam(entry.name, name);			PROC_PRINT("%4d %-6.6s 0x%08lx %-6.6s 0x%p 0x%p  %7d   %8d %7d\n",			i,    			// the slot number			name,       		// the name in 6 char asci			entry.name, 		// the name as unsigned long hex			entry.type >= PAGE_SIZE ? "SHMEM" : 			entry.type > sizeof(type_name)/sizeof(char *) ? 			"ALIEN" : 			type_name[entry.type],	// the Type			entry.adr,		// The RT Handle			entry.tsk,   		// The Owner task pointer			entry.pid,   		// The Owner PID			entry.type == IS_TASK && ((RT_TASK *)entry.adr)->lnxtsk ? (((RT_TASK *)entry.adr)->lnxtsk)->pid : entry.type >= PAGE_SIZE ? entry.type : 0, entry.count);		 }	}        PROC_PRINT_DONE;}  /* End function - rtai_read_lxrt */int rtai_proc_lxrt_register(void){	struct proc_dir_entry *proc_lxrt_ent;	proc_lxrt_ent = create_proc_entry("RTAI names", S_IFREG|S_IRUGO|S_IWUSR, rtai_proc_root);	if (!proc_lxrt_ent) {		printk("Unable to initialize /proc/rtai/lxrt\n");		return(-1);	}	proc_lxrt_ent->read_proc = rtai_read_lxrt;	return(0);}  /* End function - rtai_proc_lxrt_register */void rtai_proc_lxrt_unregister(void){	remove_proc_entry("RTAI names", rtai_proc_root);}  /* End function - rtai_proc_lxrt_unregister *//* ------------------< end of proc filesystem section >------------------*/#endif /* CONFIG_PROC_FS */#ifdef CONFIG_KBUILDEXPORT_SYMBOL(rt_set_sched_policy);EXPORT_SYMBOL(rt_get_prio);EXPORT_SYMBOL(rt_get_inher_prio);EXPORT_SYMBOL(rt_change_prio);EXPORT_SYMBOL(rt_whoami);EXPORT_SYMBOL(rt_task_yield);EXPORT_SYMBOL(rt_task_suspend);EXPORT_SYMBOL(rt_task_resume);EXPORT_SYMBOL(rt_get_task_state);EXPORT_SYMBOL(rt_linux_use_fpu);EXPORT_SYMBOL(rt_task_use_fpu);EXPORT_SYMBOL(rt_task_signal_handler);EXPORT_SYMBOL(rt_gettimeorig);EXPORT_SYMBOL(rt_task_make_periodic_relative_ns);EXPORT_SYMBOL(rt_task_make_periodic);EXPORT_SYMBOL(rt_task_wait_period);EXPORT_SYMBOL(rt_task_set_resume_end_times);EXPORT_SYMBOL(rt_set_resume_time);EXPORT_SYMBOL(rt_set_period);EXPORT_SYMBOL(next_period);EXPORT_SYMBOL(rt_busy_sleep);EXPORT_SYMBOL(rt_sleep);EXPORT_SYMBOL(rt_sleep_until);EXPORT_SYMBOL(rt_task_wakeup_sleeping);EXPORT_SYMBOL(rt_nanosleep);EXPORT_SYMBOL(rt_enq_ready_edf_task);EXPORT_SYMBOL(rt_enq_ready_task);EXPORT_SYMBOL(rt_renq_ready_task);EXPORT_SYMBOL(rt_rem_ready_task);EXPORT_SYMBOL(rt_rem_ready_current);EXPORT_SYMBOL(rt_enq_timed_task);EXPORT_SYMBOL(rt_wake_up_timed_tasks);EXPORT_SYMBOL(rt_rem_timed_task);EXPORT_SYMBOL(rt_enqueue_blocked);EXPORT_SYMBOL(rt_dequeue_blocked);EXPORT_SYMBOL(rt_renq_current);EXPORT_SYMBOL(rt_named_task_init);EXPORT_SYMBOL(rt_named_task_init_cpuid);EXPORT_SYMBOL(rt_named_task_delete);EXPORT_SYMBOL(is_process_registered);EXPORT_SYMBOL(rt_register);EXPORT_SYMBOL(rt_drg_on_name);EXPORT_SYMBOL(rt_drg_on_adr);EXPORT_SYMBOL(rt_get_name);EXPORT_SYMBOL(rt_get_adr);EXPORT_SYMBOL(rt_get_type);EXPORT_SYMBOL(rt_drg_on_name_cnt);EXPORT_SYMBOL(rt_drg_on_adr_cnt);EXPORT_SYMBOL(rt_get_adr_cnt);EXPORT_SYMBOL(rt_get_registry_slot);EXPORT_SYMBOL(rt_task_init);EXPORT_SYMBOL(rt_task_init_cpuid);EXPORT_SYMBOL(rt_set_runnable_on_cpus);EXPORT_SYMBOL(rt_set_runnable_on_cpuid);EXPORT_SYMBOL(rt_check_current_stack);EXPORT_SYMBOL(rt_schedule);EXPORT_SYMBOL(rt_spv_RMS);EXPORT_SYMBOL(rt_sched_lock);EXPORT_SYMBOL(rt_sched_unlock);EXPORT_SYMBOL(rt_task_delete);EXPORT_SYMBOL(rt_is_hard_timer_running);EXPORT_SYMBOL(rt_set_periodic_mode);EXPORT_SYMBOL(rt_set_oneshot_mode);EXPORT_SYMBOL(rt_get_timer_cpu);EXPORT_SYMBOL(start_rt_timer);EXPORT_SYMBOL(stop_rt_timer);EXPORT_SYMBOL(start_rt_timer_cpuid);EXPORT_SYMBOL(start_rt_apic_timers);EXPORT_SYMBOL(rt_sched_type);EXPORT_SYMBOL(rt_preempt_always);EXPORT_SYMBOL(rt_preempt_always_cpuid);EXPORT_SYMBOL(rt_set_task_trap_handler);EXPORT_SYMBOL(rt_get_time);EXPORT_SYMBOL(rt_get_time_cpuid);EXPORT_SYMBOL(rt_get_time_ns);EXPORT_SYMBOL(rt_get_time_ns_cpuid);EXPORT_SYMBOL(rt_get_cpu_time_ns);EXPORT_SYMBOL(rt_get_base_linux_task);EXPORT_SYMBOL(rt_alloc_dynamic_task);EXPORT_SYMBOL(rt_register_watchdog);EXPORT_SYMBOL(rt_deregister_watchdog);EXPORT_SYMBOL(count2nano);EXPORT_SYMBOL(nano2count);EXPORT_SYMBOL(count2nano_cpuid);EXPORT_SYMBOL(nano2count_cpuid);EXPORT_SYMBOL(rt_kthread_init);EXPORT_SYMBOL(rt_smp_linux_task);EXPORT_SYMBOL(rt_smp_current);EXPORT_SYMBOL(rt_smp_time_h);EXPORT_SYMBOL(rt_smp_oneshot_timer);EXPORT_SYMBOL(wake_up_srq);EXPORT_SYMBOL(set_rt_fun_entries);EXPORT_SYMBOL(reset_rt_fun_entries);EXPORT_SYMBOL(set_rt_fun_ext_index);EXPORT_SYMBOL(reset_rt_fun_ext_index);#ifdef CONFIG_SMPEXPORT_SYMBOL(sqilter);#endif /* CONFIG_SMP */#endif /* CONFIG_KBUILD */

⌨️ 快捷键说明

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