[英]How does time.h clock() work under Windows?
我正在嘗試為 C 中的嵌入式系統創建一個簡單的隊列計划。這個想法是在循環中根據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
返回的)是整數類型,如果您將差異(如上面的那個)轉換為例如double
並除以CLOCKS_PER_SEC
,則只能獲得浮點值。 嘗試使用"%f"
格式打印clock_t
將導致未定義的行為。
閱讀clock
參考可能會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.