Почему 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, который мы нашли, так что теперь все в порядке. Спасибо за ответы.