periodic_test.c

来自「fsmlabs的real time linux的内核」· C语言 代码 · 共 115 行

C
115
字号
/* * (C) Finite State Machine Labs Inc. 1999 business@fsmlabs.com * * Released under the terms of GPL 2. * Open RTLinux makes use of a patented process described in * US Patent 5,995,745. Use of this process is governed * by the Open RTLinux Patent License which can be obtained from * www.fsmlabs.com/PATENT or by sending email to * licensequestions@fsmlabs.com */#include <linux/module.h>#include <linux/kernel.h>#include <asm/ptrace.h>#include <rtl_core.h>#include <asm/io.h>#include <rtl_sync.h>#include <rtl_fifo.h>#include <rtl_time.h>#include <rtl_core.h>#include "common.h"clockid_t clock;void shutdown(void);static int shutdown_flag = 0;static unsigned long max_diff = 0;static unsigned long min_diff = -1;static unsigned long last_time = 0;static unsigned long count = 0;#define FIFO_NUM 0struct timespec spec;void handler(struct pt_regs *p){	unsigned long x, diff;	struct sample samp;	switch (shutdown_flag) {	case 0:		rdtscl(x);		if (last_time) {			diff = (last_time < x ? x - last_time : 0);	//ignore overflows			if (diff > max_diff)				max_diff = diff;			if (diff & (diff < min_diff))				min_diff = diff;		}		if (count++ > 50) {			count = 0;			samp.min = timespec_from_ns(min_diff);			samp.max = timespec_from_ns(max_diff);			rtf_put(FIFO_NUM, &samp, sizeof(samp));			max_diff = 0;			min_diff = -1;		}		rdtscl(last_time);		break;	case 1:		shutdown_flag = 2;	default:		/* do nothing */ ;	}	return;}int fifo_size = 4000;int init_module(void){	rtl_irqstate_t old_irq_state;	int fifo_status;	rtf_destroy(FIFO_NUM);	/* just in case someone else is using! */	fifo_status = rtf_create(FIFO_NUM, fifo_size);	if (fifo_status) {		/*printk("RTLinux measurement test fail. fifo_status=%d\n",fifo_status); */		return -1;	}	/*printk("Starting Timer measurement module: numbers in TSC ticks!\n"); */	rtl_no_interrupts(old_irq_state);	clock = rtl_getbestclock(rtl_getcpuid());	if (!clock || rtl_setclockhandler(clock, handler)) {		/*printk("Can't get clock\n"); */		rtf_destroy(FIFO_NUM);		return -1;	}	/*printk("Requested timer and got %x\n",(unsigned int)clock); */	clock->init(clock);	clock->settimermode(clock, RTL_CLOCK_MODE_PERIODIC);	clock->settimer(clock, 1000000);	rtl_restore_interrupts(old_irq_state);	return 0;}void shutdown(){	rtl_irqstate_t old_irq_state;	rtl_no_interrupts(old_irq_state);	clock->uninit(clock);	rtl_restore_interrupts(old_irq_state);	rtf_destroy(FIFO_NUM);}void cleanup_module(void){	int timeout = 100000;	shutdown_flag = 1;	while ((shutdown_flag == 1) && timeout--);	/* so it's kinda sloppy, wait for timeout or for 	   interrupt routine to ack shutdown, whatever comes	   first */	shutdown();}

⌨️ 快捷键说明

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