📄 common.c
字号:
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 + -