os_task.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #include "os/os_task.h"
  2. #include "os/os_types.h"
  3. #include "bsp/bsp_driver.h"
  4. #include "config.h"
  5. #include "bsp/bsp.h"
  6. extern uint32_t get_system_sleep_time(void);
  7. static u64 shark_mseconds = 0;
  8. static u32 _g_ticks = 0;
  9. static u32 shark_timer_task_handler(void *);
  10. static shark_timer_t shark_timer_head = {
  11. .prev = &shark_timer_head,
  12. .next = &shark_timer_head
  13. };
  14. static shark_task_t shark_task_head = {
  15. .next = &shark_task_head,
  16. .handler = shark_timer_task_handler
  17. };
  18. void SysTick_Handler(void)
  19. {
  20. shark_mseconds++;
  21. _g_ticks ++;
  22. }
  23. u64 shark_get_mseconds(void)
  24. {
  25. return shark_mseconds;
  26. }
  27. u32 shark_get_seconds(void){
  28. return _g_ticks/1000;
  29. }
  30. u32 get_tick_ms(void) {
  31. return _g_ticks;
  32. }
  33. u32 get_delta_ms(uint32_t prev_ms){
  34. uint32_t current = get_tick_ms();
  35. if (current >= prev_ms){
  36. return current - prev_ms;
  37. }
  38. //32λwrapper�����current < prev_ms
  39. return 0xFFFFFFFF - prev_ms + current;
  40. }
  41. static inline void shark_timer_sync(void)
  42. {
  43. shark_task_head.time = shark_timer_head.next->time;
  44. }
  45. void shark_timer_post(shark_timer_t *timer, u32 delay)
  46. {
  47. shark_timer_t *node;
  48. u64 time;
  49. __disable_irq();
  50. time = shark_mseconds + (delay > 0 ? delay : 1);
  51. if (timer->prev != NULL) {
  52. timer->prev->next = timer->next;
  53. }
  54. if (timer->next != NULL) {
  55. timer->next->prev = timer->prev;
  56. }
  57. for (node = shark_timer_head.next; node != &shark_timer_head; node = node->next) {
  58. if (node->time > time) {
  59. break;
  60. }
  61. }
  62. timer->prev = node->prev;
  63. node->prev->next = timer;
  64. node->prev = timer;
  65. timer->next = node;
  66. timer->time = time;
  67. shark_timer_sync();
  68. __enable_irq();
  69. }
  70. void shark_timer_cancel(shark_timer_t *timer)
  71. {
  72. __disable_irq();
  73. timer->prev->next = timer->next;
  74. timer->next->prev = timer->prev;
  75. timer->next = timer->prev = timer;
  76. shark_timer_sync();
  77. __enable_irq();
  78. }
  79. static u32 shark_timer_task_handler(void *p)
  80. {
  81. while (1) {
  82. shark_timer_t *timer = shark_timer_head.next;
  83. if (timer->time > shark_mseconds) {
  84. return timer->time - shark_mseconds;
  85. }
  86. if (timer != &shark_timer_head) {
  87. shark_timer_cancel(timer);
  88. timer->handler(timer);
  89. } else {
  90. break;
  91. }
  92. wdog_reload();
  93. }
  94. return 0xFFFFFFFF;
  95. }
  96. void shark_task_add(shark_task_t *task)
  97. {
  98. __disable_irq();
  99. task->next = shark_task_head.next;
  100. shark_task_head.next = task;
  101. __enable_irq();
  102. }
  103. shark_task_t *shark_task_create(TskFunction_t handler, void *params) {
  104. shark_task_t *ntsk = os_alloc(sizeof(shark_task_t));
  105. if (ntsk == NULL) {
  106. return ntsk;
  107. }
  108. ntsk->handler = handler;
  109. ntsk->params = params;
  110. shark_task_add(ntsk);
  111. return ntsk;
  112. }
  113. void shark_task_run(void)
  114. {
  115. shark_task_t *head = &shark_task_head;
  116. fmc_write_magic(IAP_MAGIC_SUCCESS);
  117. while (1) {
  118. wdog_reload();
  119. if (head->time <= shark_mseconds) {
  120. head->time = shark_mseconds + head->handler(head->params);
  121. }
  122. head = head->next;
  123. }
  124. }