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

📄 reserve_cpu.c

📁 fsmlabs的real time linux的内核
💻 C
字号:
#include <rtl.h>#include <pthread.h>#include <rtl_conf.h>#ifndef CONFIG_RTL_SUSPEND_LINUX#error CONFIG_RTL_SUSPEND_LINUX not enabled#endifpthread_t thread;#define NUMBER_OF_WAITS 10000#define NUMBER_OF_OUTER_ITERATIONS 500#define NUMBER_OF_INNER_ITERATIONS 10000void * start_routine(void *arg){	int i,j;	unsigned int starttime,endtime;	unsigned int maxdiff= 0,mindiff = -1;	unsigned int diff;	int count = smp_num_cpus;	rtl_printf("RTLinux Reserve_cpu thread starts on cpu %d and about to kill linux\n",hw_smp_processor_id());	pthread_kill(pthread_linux(), RTL_SIG_SUSPEND_LINUX);/* off */	for(i=0; i < NUMBER_OF_WAITS; i++){		if(smp_num_cpus < count)break;		else{ 			nanosleep(hrt2ts(5000000UL), NULL);		}	}	rtl_printf("RTLinux Reserve_cpu demo: Linux is asleep numcpus=%d\n",smp_num_cpus);	for(j=0; j < NUMBER_OF_OUTER_ITERATIONS; j++){		for(i=0; i < NUMBER_OF_INNER_ITERATIONS; i++){			hrtime_t start = clock_gethrtime(CLOCK_REALTIME);			starttime =(int) (start&0xffffffff) ;			clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, hrt2ts(50000 + start), NULL);			endtime =(int) (clock_gethrtime(CLOCK_REALTIME)&0xffffffff) ;			if(endtime > starttime) { /* too lazy to worry about the						     overflow cases every 4 seconds */				diff = endtime - starttime;				if(diff > maxdiff) {					maxdiff=diff;				}				if(diff < mindiff) mindiff=diff;if(hw_smp_processor_id() != smp_num_cpus){rtl_printf("RTLinux error running on processor %d\n",hw_smp_processor_id());	pthread_kill(pthread_linux(), RTL_SIG_RESTART_LINUX);/* on */break;}			}		}	rtl_printf("RESERVE Demo: %d: max=%d min=%d\n",j,maxdiff,mindiff);	maxdiff = 0; mindiff = -1;	}	pthread_kill(pthread_linux(), RTL_SIG_RESTART_LINUX);/* on */	rtl_printf("RTLinux RESERVE DEMO: end numcpus=%d\n",smp_num_cpus);	return 0;}int init_module(void) {	int last_cpu = smp_num_cpus -1; /* id of last CPU */	pthread_attr_t attr;	pthread_attr_init (&attr);        pthread_attr_setcpu_np(&attr, last_cpu);	return pthread_create (&thread, &attr, start_routine, 0);}void cleanup_module(void) {	pthread_delete_np (thread);	pthread_kill(pthread_linux(), RTL_SIG_RESTART_LINUX);/* on *//* 	printk("RTLinux RESERVE DEMO: cleanup numcpus=%d\n",smp_num_cpus); */}

⌨️ 快捷键说明

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