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

📄 preempt-module.c

📁 rtai-3.1-test3的源代码(Real-Time Application Interface )
💻 C
字号:
/* * Copyright (C) 1999 Paolo Mantegazza <mantegazza@aero.polimi.it> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <asm/io.h>#include <rtai.h>#include <rtai_sched.h>#include <rtai_fifos.h>MODULE_LICENSE("GPL");#undef ONESHOT_MODE#define FIFO 0#define NAVRG 1000#define USE_FPU 0#define FASTMUL  4#define SLOWMUL  24#ifdef CONFIG_UCLINUX#define TICK_TIME 1000000#else#define TICK_TIME 100000#endifstatic RT_TASK thread;static RT_TASK Slow_Task;static RT_TASK Fast_Task;static int period, slowjit, fastjit;static RTIME expected;static int cpu_used[NR_RT_CPUS];static void Slow_Thread(int dummy){	int jit;	RTIME svt, t;	svt = rt_get_cpu_time_ns() - SLOWMUL*TICK_TIME;        while (1) {  		jit = (int) ((t = rt_get_cpu_time_ns()) - svt - SLOWMUL*TICK_TIME);		svt = t;		if (jit) { jit = - jit; }		if (jit > slowjit) { slowjit = jit; }		cpu_used[hard_cpu_id()]++;                rt_busy_sleep(SLOWMUL/2*TICK_TIME);                rt_task_wait_period();                                                }}                                        static void Fast_Thread(int dummy) {                             	int jit;	RTIME svt, t;	svt = rt_get_cpu_time_ns() - FASTMUL*TICK_TIME;        while (1) {		jit = (int) ((t = rt_get_cpu_time_ns()) - svt - FASTMUL*TICK_TIME);		svt = t;		if (jit) { jit = - jit; }		if (jit > fastjit) { fastjit = jit; }		cpu_used[hard_cpu_id()]++;                rt_busy_sleep(FASTMUL/2*TICK_TIME);                rt_task_wait_period();                                                }                      }static void fun(int thread) {	struct sample { long min, max, avrg, jitters[2]; } samp;	int diff;	int skip;	int average;	int min_diff;	int max_diff;	RTIME svt, t;	min_diff = 1000000000;	max_diff = -1000000000;	while (1) {		unsigned long flags;		average = 0;		svt = rt_get_cpu_time_ns();		for (skip = 0; skip < NAVRG; skip++) {			cpu_used[hard_cpu_id()]++;			expected += period;			rt_task_wait_period();			rt_global_save_flags(&flags);#ifndef ONESHOT_MODE			diff = (int) ((t = rt_get_cpu_time_ns()) - svt - TICK_TIME);			svt = t;#else			diff = (int) count2nano(rt_get_time() - expected);#endif			if (diff < min_diff) {				min_diff = diff;			}			if (diff > max_diff) {				max_diff = diff;			}		average += diff;		}		samp.min = min_diff;		samp.max = max_diff;		samp.avrg = average/NAVRG;		samp.jitters[0] = fastjit;		samp.jitters[1] = slowjit;		rtf_ovrwr_put(FIFO, &samp, sizeof(samp));	}}static int __preempt_init(void){	RTIME start;	rtf_create(FIFO, 1000);	rt_linux_use_fpu(USE_FPU);	rt_task_init_cpuid(&thread, fun, 0, 3000, 0, USE_FPU, 0, 0);	rt_task_init_cpuid(&Fast_Task, Fast_Thread, 0, 3000, 1, 0, 0, 0);	rt_task_init_cpuid(&Slow_Task, Slow_Thread, 0, 3000, 2, 0, 0, 0);#ifdef ONESHOT_MODE	rt_set_oneshot_mode();#endif	period = start_rt_timer(nano2count(TICK_TIME));	expected = start = rt_get_time() + 100*period;	rt_task_make_periodic(&thread, start, period);	rt_task_make_periodic(&Fast_Task, start, FASTMUL*period);	rt_task_make_periodic(&Slow_Task, start, SLOWMUL*period);	return 0;}static void __preempt_exit(void){	int cpuid;	stop_rt_timer();		rt_task_delete(&thread);	rt_task_delete(&Slow_Task);	rt_task_delete(&Fast_Task);	rtf_destroy(FIFO);	printk("\n\nCPU USE SUMMARY\n");	for (cpuid = 0; cpuid < NR_RT_CPUS; cpuid++) {		printk("# %d -> %d\n", cpuid, cpu_used[cpuid]);	}	printk("END OF CPU USE SUMMARY\n\n");}module_init(__preempt_init);module_exit(__preempt_exit);

⌨️ 快捷键说明

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