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

📄 cascade-test.c

📁 最新rtlinux内核源码
💻 C
字号:
#include <comedi.h>#include <math.h>#include <stdio.h>#include "../comedi/drivers/8253.h"#if NOT/* this function is meant to replace i8253_cascade_ns_to_timer_2div * (which is completely broken at the moment) */static inline void cascade_new(int i8253_osc_base, unsigned int *d1, unsigned int *d2, unsigned int *nanosec, int round_mode){	unsigned int divider;	unsigned int div1, div2;	unsigned int div1_glb, div2_glb, ns_glb;	unsigned int div1_lub, div2_lub, ns_lub;	unsigned int ns;	unsigned int start;	unsigned int ns_low, ns_high;	divider = *nanosec / i8253_osc_base;	div1_lub = div2_lub = 0;	div1_glb = div2_glb = 0;	ns_glb = 0;	ns_lub = 0xffffffff;	div2 = 0x10000;	start = divider / div2;	if(start < 2) start = 2;	for (div1 = start; div1 <= divider / div1 + 1; div1++) {		for(div2 = divider / div1; div1 * div2 <= divider + div1 + 1; div2++) {			ns = i8253_osc_base * div1 * div2;			if (ns <= *nanosec && ns > ns_glb) {				ns_glb = ns;				div1_glb = div1;				div2_glb = div2;			}			if (div2 <= 0x10000) {				ns = i8253_osc_base * div1 * div2;				if (ns >= *nanosec && ns < ns_lub) {					ns_lub = ns;					div1_lub = div1;					div2_lub = div2;				}			}		}	}	switch (round_mode) {	case TRIG_ROUND_NEAREST:	default:		ns_high = div1_lub * div2_lub * i8253_osc_base;		ns_low = div1_glb * div2_glb * i8253_osc_base;		if( ns_high - *nanosec < *nanosec - ns_low) {			div1 = div1_lub;			div2 = div2_lub;		} else {			div1 = div1_glb;			div2 = div2_glb;		}		break;	case TRIG_ROUND_UP:		div1 = div1_lub;		div2 = div2_lub;		break;	case TRIG_ROUND_DOWN:		div1 = div1_glb;		div2 = div2_glb;		break;	}	*nanosec = div1 * div2 * i8253_osc_base;	*d1 = div1;	*d2 = div2;	return;}#endif#ifdef ROGIint main(int argc,vhar *argv[]){	int osc_base = 1000;	int round_mode = TRIG_ROUND_NEAREST;	int i;	int div1_old, div2_old, ns_old, err_old;	int div1_new, div2_new, ns_new, err_new;	int div1_pow, div2_pow, ns_pow, err_pow;	int err = 0;	/* loop over desired nanosecond timings to test */	for(i = 10000; i < 100000; i++)	{		ns_old = ns_new = ns_pow = i;		i8253_cascade_ns_to_timer_2div(osc_base, &div1_old, &div2_old, &ns_old, round_mode);		err_old = ns_old - i;		i8253_cascade_ns_to_timer_power(osc_base, &div1_pow, &div2_pow, &ns_pow, round_mode);		err_pow = ns_pow - i;		cascade_new(osc_base, &div1_new, &div2_new, &ns_new, round_mode);		err_new = ns_new - i;		/* print results on this condition */		if(abs(err_new) > abs(err_pow))			printf("nanosec %i\terr_new %i\tdiv1_new %i\tdiv2_new %i\n"				"\t\terr_pow %i\tdiv1_pow %i\tdiv2_pow %i\n",				i, err_new, div1_new, div2_new, err_pow, div1_pow, div2_pow);	/* consistency checks */		if(div1_old * div2_old * osc_base != ns_old) err = 1;		if(div1_pow * div2_pow * osc_base != ns_pow) err = 2;		if(div1_new * div2_new * osc_base != ns_new) err = 3;		if(err)		{			printf("err %i\n", err);			err=0;		}	}	return 0;}#endifint main(int argc,char *argv[]){	int osc_base = 1000;	unsigned int ns;	unsigned int div1,div2;	int i=0;	for(ns = 4*osc_base; ns<0x80000000;ns++){		i8253_cascade_ns_to_timer_2div			(osc_base, &div1, &div2, &ns, TRIG_ROUND_UP);		i++;		if(!(i&0xff))			printf("ns=%d div1=%d div2=%d\n",ns,div1,div2);		if(i==100000)exit(0);	}	return 0;}

⌨️ 快捷键说明

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