rt_tick.c 867 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include "rt_tick.h"
  2. #include <pthread.h>
  3. #include <unistd.h>
  4. static uint32_t rt_tick = 0;
  5. static uint8_t is_initialized = 0;
  6. static void *rt_tick_entry(void *param)
  7. {
  8. int us = 1000000 / RT_TICK_PER_SECOND;
  9. while (1) {
  10. usleep(us);
  11. rt_tick++;
  12. }
  13. pthread_exit(NULL);
  14. }
  15. void rt_tick_init(void)
  16. {
  17. if (is_initialized)
  18. return;
  19. pthread_t tid;
  20. pthread_create(&tid, NULL, rt_tick_entry, NULL);
  21. pthread_detach(tid);
  22. is_initialized = 1;
  23. }
  24. uint32_t rt_tick_get(void)
  25. {
  26. return rt_tick;
  27. }
  28. uint32_t rt_tick_from_millisecond(int32_t ms)
  29. {
  30. uint32_t tick;
  31. if (ms < 0) {
  32. tick = (uint32_t)RT_WAITING_FOREVER;
  33. } else {
  34. tick = RT_TICK_PER_SECOND * (ms / 1000);
  35. tick += (RT_TICK_PER_SECOND * (ms % 1000) + 999) / 1000;
  36. }
  37. /* return the calculated tick */
  38. return tick;
  39. }