time.h clock() 在 Windows 下如何工作?
How does time.h clock() work under Windows?
我正在尝试为 C 中的嵌入式系统创建一个简单的队列计划。
这个想法是在 Round Robin 中,根据 Tasks[]
数组中声明的时间限制调用一些函数。
#include <time.h>
#include <stdio.h>
#include <windows.h>
#include <stdint.h>
//Constants
#define SYS_TICK_INTERVAL 1000UL
#define INTERVAL_0MS 0
#define INTERVAL_10MS (100000UL / SYS_TICK_INTERVAL)
#define INTERVAL_50MS (500000UL / SYS_TICK_INTERVAL)
//Function calls
void task_1(clock_t tick);
void task_2(clock_t tick);
uint8_t get_NumberOfTasks(void);
//Define the schedule structure
typedef struct
{
double Interval;
double LastTick;
void (*Function)(clock_t tick);
}TaskType;
//Creating the schedule itself
TaskType Tasks[] =
{
{INTERVAL_10MS, 0, task_1},
{INTERVAL_50MS, 0, task_2},
};
int main(void)
{
//Get the number of tasks to be executed
uint8_t task_number = get_NumberOfTasks();
//Initializing the clocks
for(int i = 0; i < task_number; i++)
{
clock_t myClock1 = clock();
Tasks[i].LastTick = myClock1;
printf("Task %d clock has been set to %f\n", i, myClock1);
}
//Round Robin
while(1)
{
//Go through all tasks in the schedule
for(int i = 0; i < task_number; i++)
{
//Check if it is time to execute it
if((Tasks[i].LastTick - clock()) > Tasks[i].Interval)
{
//Execute it
clock_t myClock2 = clock();
(*Tasks[i].Function)(myClock2);
//Update the last tick
Tasks[i].LastTick = myClock2;
}
}
Sleep(SYS_TICK_INTERVAL);
}
}
void task_1(clock_t tick)
{
printf("%f - Hello from task 1\n", tick);
}
void task_2(clock_t tick)
{
printf("%f - Hello from task 2\n", tick);
}
uint8_t get_NumberOfTasks(void)
{
return sizeof(Tasks) / sizeof(*Tasks);
}
代码编译时没有任何警告,但我想我不明白命令 clock()
是如何工作的。
在这里你可以看到当我运行这个程序时我得到了什么:
F:\AVR Microcontroller>timer
Task 0 clock has been set to 0.000000
Task 1 clock has been set to 0.000000
我尝试将 Interval
和 LastTick
从 float 更改为 double 只是为了确保这不是精度错误,但它仍然不起作用。
%f
不是打印出 myClock1
的正确格式说明符,因为 clock_t
可能不是 double
。您不应该假设 clock_t
是 double
。如果要将 myClock1
打印为浮点数,则必须手动将其转换为 double
:
printf("Task %d clock has been set to %f\n", i, (double)myClock1);
或者,使用宏 CLOCKS_PER_SEC
将 myClock1
转换为秒数:
printf("Task %d clock has been set to %f seconds\n", i,
(double)myClock1 / CLOCKS_PER_SEC);
此外,您在调度程序循环中的减法是错误的。想一想:clock()
随着时间的推移变大,所以 Tasks[i].LastTick - clock()
总是产生负值。我想你想要 clock() - Tasks[i].LastTick
而不是。
clock
函数的行为取决于操作系统。在 Windows 上,它基本上运行挂钟,而在例如。 Linux 这是过程 CPU 时间。
此外,clock
的结果本身是没有用的,它只用于两个时钟之间的比较(例如clock_end - clock_start
)。
最后,clock_t
类型(clock
returns)是一个 整数 类型,如果你将差异(如上面的差异)投射到例如double
并除以 CLOCKS_PER_SEC
。尝试使用 "%f"
格式打印 clock_t
将导致 未定义的行为。
阅读 a clock
reference 可能会有帮助。
我正在尝试为 C 中的嵌入式系统创建一个简单的队列计划。
这个想法是在 Round Robin 中,根据 Tasks[]
数组中声明的时间限制调用一些函数。
#include <time.h>
#include <stdio.h>
#include <windows.h>
#include <stdint.h>
//Constants
#define SYS_TICK_INTERVAL 1000UL
#define INTERVAL_0MS 0
#define INTERVAL_10MS (100000UL / SYS_TICK_INTERVAL)
#define INTERVAL_50MS (500000UL / SYS_TICK_INTERVAL)
//Function calls
void task_1(clock_t tick);
void task_2(clock_t tick);
uint8_t get_NumberOfTasks(void);
//Define the schedule structure
typedef struct
{
double Interval;
double LastTick;
void (*Function)(clock_t tick);
}TaskType;
//Creating the schedule itself
TaskType Tasks[] =
{
{INTERVAL_10MS, 0, task_1},
{INTERVAL_50MS, 0, task_2},
};
int main(void)
{
//Get the number of tasks to be executed
uint8_t task_number = get_NumberOfTasks();
//Initializing the clocks
for(int i = 0; i < task_number; i++)
{
clock_t myClock1 = clock();
Tasks[i].LastTick = myClock1;
printf("Task %d clock has been set to %f\n", i, myClock1);
}
//Round Robin
while(1)
{
//Go through all tasks in the schedule
for(int i = 0; i < task_number; i++)
{
//Check if it is time to execute it
if((Tasks[i].LastTick - clock()) > Tasks[i].Interval)
{
//Execute it
clock_t myClock2 = clock();
(*Tasks[i].Function)(myClock2);
//Update the last tick
Tasks[i].LastTick = myClock2;
}
}
Sleep(SYS_TICK_INTERVAL);
}
}
void task_1(clock_t tick)
{
printf("%f - Hello from task 1\n", tick);
}
void task_2(clock_t tick)
{
printf("%f - Hello from task 2\n", tick);
}
uint8_t get_NumberOfTasks(void)
{
return sizeof(Tasks) / sizeof(*Tasks);
}
代码编译时没有任何警告,但我想我不明白命令 clock()
是如何工作的。
在这里你可以看到当我运行这个程序时我得到了什么:
F:\AVR Microcontroller>timer
Task 0 clock has been set to 0.000000
Task 1 clock has been set to 0.000000
我尝试将 Interval
和 LastTick
从 float 更改为 double 只是为了确保这不是精度错误,但它仍然不起作用。
%f
不是打印出 myClock1
的正确格式说明符,因为 clock_t
可能不是 double
。您不应该假设 clock_t
是 double
。如果要将 myClock1
打印为浮点数,则必须手动将其转换为 double
:
printf("Task %d clock has been set to %f\n", i, (double)myClock1);
或者,使用宏 CLOCKS_PER_SEC
将 myClock1
转换为秒数:
printf("Task %d clock has been set to %f seconds\n", i,
(double)myClock1 / CLOCKS_PER_SEC);
此外,您在调度程序循环中的减法是错误的。想一想:clock()
随着时间的推移变大,所以 Tasks[i].LastTick - clock()
总是产生负值。我想你想要 clock() - Tasks[i].LastTick
而不是。
clock
函数的行为取决于操作系统。在 Windows 上,它基本上运行挂钟,而在例如。 Linux 这是过程 CPU 时间。
此外,clock
的结果本身是没有用的,它只用于两个时钟之间的比较(例如clock_end - clock_start
)。
最后,clock_t
类型(clock
returns)是一个 整数 类型,如果你将差异(如上面的差异)投射到例如double
并除以 CLOCKS_PER_SEC
。尝试使用 "%f"
格式打印 clock_t
将导致 未定义的行为。
阅读 a clock
reference 可能会有帮助。