G-CAMS-DATU/packages/agile_modbus-v1.1.2/examples/common/rt_tick.c
2024-05-13 16:08:47 +08:00

50 lines
867 B
C

#include "rt_tick.h"
#include <pthread.h>
#include <unistd.h>
static uint32_t rt_tick = 0;
static uint8_t is_initialized = 0;
static void *rt_tick_entry(void *param)
{
int us = 1000000 / RT_TICK_PER_SECOND;
while (1) {
usleep(us);
rt_tick++;
}
pthread_exit(NULL);
}
void rt_tick_init(void)
{
if (is_initialized)
return;
pthread_t tid;
pthread_create(&tid, NULL, rt_tick_entry, NULL);
pthread_detach(tid);
is_initialized = 1;
}
uint32_t rt_tick_get(void)
{
return rt_tick;
}
uint32_t rt_tick_from_millisecond(int32_t ms)
{
uint32_t tick;
if (ms < 0) {
tick = (uint32_t)RT_WAITING_FOREVER;
} else {
tick = RT_TICK_PER_SECOND * (ms / 1000);
tick += (RT_TICK_PER_SECOND * (ms % 1000) + 999) / 1000;
}
/* return the calculated tick */
return tick;
}