C:对“ clock()”的未定义引用

时间:2018-12-12 01:42:11

标签: c

我对C并不是很熟悉,所以请忍受...

我正在用AtmelStudio开发的Atmel Tiny 85上为看门狗定时器编写一些简单的代码。我想访问time.h库的clock()函数:

#include <time.h>

.....

void main() {
  clock_t start = clock();
  ....
}

不幸的是,编译器抱怨时钟是未定义的引用。我在网上查找的每个代码示例似乎都在执行我正在执行的操作。我缺少一些基本的东西吗?谢谢!

这是完整的代码:

#define F_CPU 1000000UL // 1 MHz
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <time.h>
#include <stdio.h>
#include <avr/wdt.h>
#include <stdint.h>
#include <util/atomic.h>

#define LED_PORT PB1
#define RST0_PORT PINB3
#define RST1_PORT PINB4
#define HEARTBEAT PINB0

volatile int HEARTBEAT_RECEIVED;
#define CLOCKS_PER_SECOND 1000000;
const int TIMEOUT_PERIOD = 120; //reset raspberry pi after this many seconds

void set_output();
void set_input();
void set_interrupts();
void run_timer(clock_t start);
void restart_raspberry_pi();

int main(void)
{
    clock_t start;

    HEARTBEAT_RECEIVED = false;

    //Configure IO pins
    set_output();
    set_input();
    PORTB &= ~(1 << RST0_PORT); // Set pin low (common ground pin for pi reset)
    PORTB &= ~(1 << RST1_PORT); // Set pin low (initialize for no pi reset)

    //Configure and enable interrupts
    set_interrupts();

    while (1) {
        sei();
        start = clock();
        run_timer(start);
    }

    return (0);
}


void run_timer(clock_t start) {

    double time_elapsed;

    do {
        _delay_ms(1000);

        if (HEARTBEAT_RECEIVED) { //If heartbeat detected, reset timer.
            HEARTBEAT_RECEIVED = false;
            return;
        }

        time_elapsed = ( clock() - start ) / CLOCKS_PER_SECOND;
    } while (time_elapsed < TIMEOUT_PERIOD);

    restart_raspberry_pi(); //Timeout period has elapsed, reset the pi
}

ISR(PCINT0_vect) {
    //Indicate that a heartbeat has been received
    HEARTBEAT_RECEIVED = true;
}

void restart_raspberry_pi() {
    cli();

    PORTB |= (1 << RST1_PORT); // Set pin high (sets RUN high to reset)
    _delay_ms(500);
    PORTB &= ~(1 << RST1_PORT); // Set pin low (release reset control)
}

void set_output()
{
    //The DDxn bit in the DDRx Register selects the direction of this pin.
    //If DDxn is written logic one, Pxn is configured as an output pin.
    //If DDxn is written logic zero, Pxn is configured as an input pin.

    //PORTB = (0<<PB0) | (1<<PB3);
    DDRB = (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1); // Set pins as output.
}

void set_input()
{
    DDRB |= (0<<DDB0); // set pin 0 as input. Added |=.
}

void set_interrupts()
{
    GIMSK |= (1 << PCIE);   // pin change interrupt enable
    PCMSK |= (1 << PCINT0); // pin change interrupt enabled for PCINT0
}

1 个答案:

答案 0 :(得分:0)

@Shawn说得对。...我深入研究了time.h库代码,显然是对我来说可用:

  

第7.23.2.1节clock()       未实现类型clock_t,宏CLOCKS_PER_SEC和函数clock()。我们       认为这些项目属于操作系统代码,或者在无操作时属于应用程序代码       系统存在。

所以我想这对我是一个教训。感谢您的帮助。