Почему clock() возвращает -1 в C

Я пытаюсь реализовать обработчик ошибок, используя функцию из "time.h"библиотека. Код работает внутри встроенной системы (Colibri IMX7 — процессор M4). Функция используется для отслеживания текущего значения в определенном диапазоне. Если значение тока неверно, функция должна вернуть сообщение об ошибке.

Функция увидит, возникает ли ошибка, и при первом запуске сохранит первое появление ошибки в виде ссылки, а затем при следующих запусках, если ошибка все еще существует, она сравнит текущее время с использованием предыдущую ссылку и посмотрите, будет ли она длиннее определенного времени.

Проблема в том, что функция clock()всегда возвращает -1. Что мне делать, чтобы этого избежать? Кроме того, почему я не могу объявить clock_tпеременная как статическая (например, static clock_t start_t = clock()?

Пожалуйста, смотрите ниже функцию:

      bool CrossLink_check_error_LED_UV_current_clock(int current_state, int current_at_LED_UV)
{
    bool has_LED_UV_current_deviated = false;
    static int current_number_of_errors_Current_LED_CANNON = 0;
    clock_t startTimeError = clock();

    const int maximum_operational_current_when_on = 2000;
    const int minimum_turned_on_LED_UV_current = 45;     
    
    if( (current_at_LED_UV > maximum_operational_current_when_on)
      ||(current_state!=STATE_EMITTING && (current_at_LED_UV > minimum_turned_on_LED_UV_current))
      ||(current_state==STATE_EMITTING && (current_at_LED_UV < minimum_turned_on_LED_UV_current)) ){
        current_number_of_errors_Current_LED_CANNON++;
        if(current_number_of_errors_Current_LED_CANNON > 1) {
            if (clock() - startTimeError > 50000){ // 50ms
                has_LED_UV_current_deviated = true;
                PRINTF("current_at_LED_UV: %d", current_at_LED_UV);
                if(current_state==STATE_EMITTING){
                    PRINTF(" at state emitting");
                }
                PRINTF("\n\r");
            }
        }else{
            if(startTimeError == -1){
                startTimeError = clock();
            }
        }
    }else{
        startTimeError = 0;
        current_number_of_errors_Current_LED_CANNON = 0;
    }
    return has_LED_UV_current_deviated;
}

Редактировать: я забыл упомянуть ранее, но мы используем компилятор GCC 9.3.1 arm-none-eabi с CMake для создания исполняемого файла. У нас есть встроенная система (Colibri IMX7 производства Toradex), которая состоит из 2 процессоров A7, на которых работает наш Linux (более визуальный интерфейс), а программа, которая используется для управления нашим устройством, работает на процессоре M4 без ОС, просто голая. металл.

2 ответа

Для многих функций стандартной библиотеки c, если у вас установлена ​​документация (обычно она устанавливается вместе с компилятором), вы можете просмотреть документацию, используя manкоманда в оболочке. С man clock, он говорит мне, что:

      NAME
       clock - determine processor time

SYNOPSIS
       #include <time.h>

       clock_t clock(void);

DESCRIPTION
       The clock() function returns an approximation of processor time used by the program.

RETURN VALUE
       The  value  returned  is  the  CPU time used so far as a clock_t; to get the number of seconds used, divide by
       CLOCKS_PER_SEC.  If the processor time used is not available or its value cannot be represented, the  function
       returns the value (clock_t) -1.

etc.

Это говорит нам о том, что -1 означает, что процессорное время ( CLOCK_PROCESS_CPUTIME_ID) недоступен. Решение заключается в использовании CLOCK_MONOTONICвместо. Мы можем выбрать часы, которые мы хотим использовать с clock_gettime.

      timespec clock_time;

if (clock_gettime(CLOCK_MONOTONIC, &clock_time)) {
    printf("CLOCK_MONOTONIC is unavailable!\n");
    exit(1);
}

printf("Seconds: %d Nanoseconds: %ld\n", clock_time.tv_sec, clock_time.tv_nsec);

в конце концов проблема заключалась в том, что, поскольку мы запускаем наш код на «голом железе», функция clock() не работает. В итоге мы использовали внутренний таймер на процессоре M4, который мы нашли, так что теперь все в порядке. Спасибо за ответы.

Другие вопросы по тегам