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

📄 kern_clock.c

📁 很好的一个嵌入式linux平台下的bootloader
💻 C
字号:
/* $Id: kern_clock.c,v 1.2 1996/01/16 14:21:19 chris Exp $ *//*- * Copyright (c) 1982, 1986, 1991 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * *	@(#)kern_clock.c	7.16 (Berkeley) 5/9/91 */#include "param.h"#include "systm.h"#include "callout.h"#include "kernel.h"#include "resourcevar.h"#include "proc.h"/* * Clock handling routines. * *//* * Bump a timeval by a small number of usec's. */#define BUMPTIME(t, usec) { \	register struct timeval *tp = (t); \ \	tp->tv_usec += (usec); \	if (tp->tv_usec >= 1000000) { \		tp->tv_usec -= 1000000; \		tp->tv_sec++; \	} \}/* * The hz hardware interval timer. * We update the events relating to real time. * If this timer is also being used to gather statistics, * we run through the statistics gathering routine as well. */hardclock(ticks){	register struct callout *p1;	register struct proc *p;	register int s;	int needsoft = 0;	/*	 * Update real-time timeout queue.	 * At front of queue are some number of events which are ``due''.	 * The time to these is <= 0 and if negative represents the	 * number of ticks which have passed since it was supposed to happen.	 * The rest of the q elements (times > 0) are events yet to happen,	 * where the time for each is given as a delta from the previous.	 * Decrementing just the first of these serves to decrement the time	 * to all events.	 */	p1 = calltodo.c_next;	while (p1) {		if ((p1->c_time -= ticks) > 0)			break;		needsoft = 1;		if (p1->c_time == 0)			break;		p1 = p1->c_next;	}	if (p = curproc) {	    struct pstats *pstats = p->p_stats;	    if (timerisset(&pstats->p_timer[ITIMER_VIRTUAL].it_value) &&		itimerdecr(&pstats->p_timer[ITIMER_VIRTUAL], ticks*tick) == 0)	      psignal(p, SIGVTALRM);	}	BUMPTIME(&time, ticks * tick)	if (needsoft)	  setsoftclock();}/* * Software priority level clock interrupt. * Run periodic events from timeout queue. *//*ARGSUSED*/softclock(){	for (;;) {		register struct callout *p1;		register caddr_t arg;		register int (*func)();		register int a, s;		s = splhigh();		if ((p1 = calltodo.c_next) == 0 || p1->c_time > 0) {			splx(s);			break;		}		arg = p1->c_arg; func = p1->c_func; a = p1->c_time;		calltodo.c_next = p1->c_next;		p1->c_next = callfree;		callfree = p1;		splx(s);		(*func)(arg, a);	}}/* * Arrange that (*func)(arg) is called in t/hz seconds. */timeout(func, arg, t)	int (*func)();	caddr_t arg;	register int t;{	register struct callout *p1, *p2, *pnew;	register int s = splhigh();	if (t <= 0)		t = 1;	pnew = callfree;	if (pnew == NULL)		panic("timeout table overflow");	callfree = pnew->c_next;	pnew->c_arg = arg;	pnew->c_func = func;	for (p1 = &calltodo; (p2 = p1->c_next) && p2->c_time < t; p1 = p2)		if (p2->c_time > 0)			t -= p2->c_time;	p1->c_next = pnew;	pnew->c_next = p2;	pnew->c_time = t;	if (p2)		p2->c_time -= t;	splx(s);}/* * untimeout is called to remove a function timeout call * from the callout structure. */untimeout(func, arg)	int (*func)();	caddr_t arg;{	register struct callout *p1, *p2;	register int s;	s = splhigh();	for (p1 = &calltodo; (p2 = p1->c_next) != 0; p1 = p2) {		if (p2->c_func == func && p2->c_arg == arg) {			if (p2->c_next && p2->c_time > 0)				p2->c_next->c_time += p2->c_time;			p1->c_next = p2->c_next;			p2->c_next = callfree;			callfree = p2;			break;		}	}	splx(s);}/* * Compute number of hz until specified time. * Used to compute third argument to timeout() from an * absolute time. */hzto(tv)	struct timeval *tv;{	register long ticks;	register long sec;	int s = splhigh();	/*	 * If number of milliseconds will fit in 32 bit arithmetic,	 * then compute number of milliseconds to time and scale to	 * ticks.  Otherwise just compute number of hz in time, rounding	 * times greater than representible to maximum value.	 *	 * Delta times less than 25 days can be computed ``exactly''.	 * Maximum value for any timeout in 10ms ticks is 250 days.	 */	sec = tv->tv_sec - time.tv_sec;	if (sec <= 0x7fffffff / 1000 - 1000)		ticks = ((tv->tv_sec - time.tv_sec) * 1000 +			(tv->tv_usec - time.tv_usec) / 1000) / (tick / 1000);	else if (sec <= 0x7fffffff / hz)		ticks = sec * hz;	else		ticks = 0x7fffffff;	splx(s);	return (ticks);}

⌨️ 快捷键说明

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