clock.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "FreeRTOS.h"
  2. #include "Task.h"
  3. #include "clock.h"
  4. extern fr_atomic_t fr_hw_atomic_load(volatile fr_atomic_t *ptr);
  5. extern void fr_hw_atomic_store(volatile fr_atomic_t *ptr, fr_atomic_t val);
  6. extern fr_atomic_t fr_hw_atomic_add(volatile fr_atomic_t *ptr, fr_atomic_t val);
  7. extern fr_atomic_t fr_hw_atomic_sub(volatile fr_atomic_t *ptr, fr_atomic_t val);
  8. extern fr_atomic_t fr_hw_atomic_and(volatile fr_atomic_t *ptr, fr_atomic_t val);
  9. extern fr_atomic_t fr_hw_atomic_or(volatile fr_atomic_t *ptr, fr_atomic_t val);
  10. extern fr_atomic_t fr_hw_atomic_xor(volatile fr_atomic_t *ptr, fr_atomic_t val);
  11. extern fr_atomic_t fr_hw_atomic_exchange(volatile fr_atomic_t *ptr, fr_atomic_t val);
  12. extern void fr_hw_atomic_flag_clear(volatile fr_atomic_t *ptr);
  13. extern fr_atomic_t fr_hw_atomic_flag_test_and_set(volatile fr_atomic_t *ptr);
  14. extern fr_atomic_t fr_hw_atomic_compare_exchange_strong(volatile fr_atomic_t *ptr, fr_atomic_t *old, fr_atomic_t _new);
  15. static volatile unsigned long c_tick = 0;
  16. static void (*fr_tick_hook)(void);
  17. void fr_tick_sethook(void (*hook)(void))
  18. {
  19. fr_tick_hook = hook;
  20. }
  21. fr_tick_t fr_tick_get(void)
  22. {
  23. /* return the global tick */
  24. return (fr_tick_t)fr_hw_atomic_load(&(c_tick));
  25. }
  26. void fr_tick_set(fr_tick_t tick)
  27. {
  28. fr_hw_atomic_store(&(c_tick), tick);
  29. }
  30. void fr_tick_increase(void)
  31. {
  32. fr_hw_atomic_add(&(c_tick), 1);
  33. }
  34. fr_tick_t fr_tick_from_millisecond(int ms)
  35. {
  36. fr_tick_t tick;
  37. if (ms < 0)
  38. {
  39. tick = (fr_tick_t)(-1);
  40. }
  41. else
  42. {
  43. tick = 1000 * (ms / 1000);
  44. tick += (1000 * (ms % 1000) + 999) / 1000;
  45. }
  46. return tick;
  47. }
  48. fr_tick_t fr_tick_get_millisecond(void)
  49. {
  50. return fr_tick_get() * (1000u / 1000);
  51. }