os_task.c 3.0 KB

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