clock.c
来自「伟大的Contiki工程, 短小精悍 的操作系统, 学习编程不可不看」· C语言 代码 · 共 137 行
C
137 行
#include "sys/clock.h"#include "sys/etimer.h"#include <avr/io.h>#include <avr/interrupt.h>static volatile clock_time_t count;/*---------------------------------------------------------------------------*/SIGNAL(SIG_OUTPUT_COMPARE0){ ++count; if(etimer_pending()) { etimer_request_poll(); }}/* External clock source does not work ? */#if 0voidclock_init(void){ cli (); TIMSK &= ((unsigned char)~(1 << (TOIE0))); TIMSK &= ((unsigned char)~(1 << (OCIE0))); /* Disable TC0 interrupt */ /** * set Timer/Counter0 to be asynchronous * from the CPU clock with a second external * clock(32,768kHz)driving it */ ASSR |= (1 << (AS0)); TCCR0 = _BV (CS02) | _BV (CS01) | _BV (WGM1); TCNT0 = 0; OCR0 = 128; TIMSK |= (1 << (OCIE0)); TIMSK |= (1 << (TOIE0)); sei ();}#endif/*---------------------------------------------------------------------------*/voidclock_init(void){ cli (); /* Select internal clock */ ASSR = 0x00; /* Set counter to zero */ TCNT0 = 0; /* * Set comparison register: * Crystal freq. is 16000000, * pre-scale factor is 1024, i.e. we have 125 "ticks" / sec: * 16000000 = 1024 * 125 * 125 */ OCR0 = 125; /* * Set timer control register: * - prescale: 1024 (CS00 - CS02) * - counter reset via comparison register (WGM01) */ TCCR0 = _BV(CS00) | _BV(CS01) | _BV(CS02) | _BV(WGM01); /* Clear interrupt flag register */ TIFR = 0x00; /* * Raise interrupt when value in OCR0 is reached. Note that the * counter value in TCNT0 is cleared automatically. */ TIMSK = _BV (OCIE0); /* * Counts the number of ticks. Since clock_time_t is an unsigned * 16 bit data type, time intervals of up to 524 seconds can be * measured. */ count = 0; sei ();}/*---------------------------------------------------------------------------*/clock_time_tclock_time(void){ return count;}/*---------------------------------------------------------------------------*//** * Delay the CPU for a multiple of TODO */voidclock_delay(unsigned int i){ for (; i > 0; i--) { /* Needs fixing XXX */ unsigned j; for (j = 50; j > 0; j--) asm volatile("nop"); }}/*---------------------------------------------------------------------------*//** * Wait for a multiple of 1 / 125 sec = 0.008 ms. * */voidclock_wait(int i){ clock_time_t start; start = clock_time(); while(clock_time() - start < (clock_time_t)i);}/*---------------------------------------------------------------------------*/voidclock_set_seconds(unsigned long sec){ // TODO}unsigned longclock_seconds(void){ return count / CLOCK_SECOND;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?