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

📄 systimem.nc

📁 Zigbee的nesc源码
💻 NC
字号:
/* * Copyright (c) 2003, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. *  * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *  * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Miklos Maroti * Date last modified: 12/07/03 *//** * This module provides a 921.6 KHz timer on the MICA2 platform, * and 500 KHz timer on the MICA2DOT platform. We use 1/8 prescaling. */module SysTimeM{	provides 	{		interface StdControl;		interface SysTime;	}}implementation{	// this field holds the high 16 bits of the current time	uint16_t currentTime;	union time_u	{		struct		{			uint16_t low;			uint16_t high;		};		uint32_t full;	};	async command uint16_t SysTime.getTime16()	{		return __inw_atomic(TCNT3L);	}	async command uint32_t SysTime.getTime32()	{		register union time_u time;		atomic		{			time.low = __inw(TCNT3L);			time.high = currentTime;			// maybe there was a pending interrupt			if( bit_is_set(ETIFR, TOV3) && ((int16_t)time.low) >= 0 )				++time.high;		}		return time.full;	}	async command uint32_t SysTime.castTime16(uint16_t time16)	{		uint32_t time = call SysTime.getTime32();		time += (int16_t)time16 - (int16_t)time;		return time;	}	// Use SIGNAL instead of INTERRUPT to get atomic update of time	TOSH_SIGNAL(SIG_OVERFLOW3)	{		++currentTime;	}	command result_t StdControl.init()	{		uint8_t etimsk;		outp(0x00, TCCR3A);		outp(0x00, TCCR3B);		atomic		{			etimsk = inp(ETIMSK);			etimsk &= (1<<OCIE1C);			etimsk |= (1<<TOIE3);			outp(etimsk, ETIMSK);		}		return SUCCESS;	}	command result_t StdControl.start()	{		// start the timer with 1/8 prescaler, 921.6 KHz on MICA2		outp(0x02, TCCR3B);		return SUCCESS;	}	command result_t StdControl.stop()	{		// stop the timer		outp(0x00, TCCR3B);		return SUCCESS;	}}

⌨️ 快捷键说明

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