os_task.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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 shark_timer_task_handler(void *);
  9. static shark_timer_t shark_timer_head = {
  10. .prev = &shark_timer_head,
  11. .next = &shark_timer_head
  12. };
  13. static shark_task_t shark_task_head = {
  14. .next = &shark_task_head,
  15. .handler = shark_timer_task_handler
  16. };
  17. void SysTick_Handler(void)
  18. {
  19. shark_mseconds++;
  20. }
  21. void os_disable_irq(void) {
  22. __disable_irq();
  23. }
  24. void os_enable_irq(void) {
  25. __enable_irq();
  26. }
  27. u64 shark_get_mseconds(void)
  28. {
  29. return shark_mseconds;
  30. }
  31. u32 shark_get_seconds(void){
  32. return shark_mseconds/1000;
  33. }
  34. static inline void shark_timer_sync(void)
  35. {
  36. shark_task_head.time = shark_timer_head.next->time;
  37. }
  38. void shark_timer_post(shark_timer_t *timer, u32 delay)
  39. {
  40. shark_timer_t *node;
  41. u64 time;
  42. __disable_irq();
  43. time = shark_mseconds + (delay > 0 ? delay : 1);
  44. if (timer->prev != NULL) {
  45. timer->prev->next = timer->next;
  46. }
  47. if (timer->next != NULL) {
  48. timer->next->prev = timer->prev;
  49. }
  50. for (node = shark_timer_head.next; node != &shark_timer_head; node = node->next) {
  51. if (node->time > time) {
  52. break;
  53. }
  54. }
  55. timer->prev = node->prev;
  56. node->prev->next = timer;
  57. node->prev = timer;
  58. timer->next = node;
  59. timer->time = time;
  60. shark_timer_sync();
  61. __enable_irq();
  62. }
  63. void shark_timer_cancel(shark_timer_t *timer)
  64. {
  65. __disable_irq();
  66. timer->prev->next = timer->next;
  67. timer->next->prev = timer->prev;
  68. timer->next = timer->prev = timer;
  69. shark_timer_sync();
  70. __enable_irq();
  71. }
  72. static u32 shark_timer_task_handler(void *p)
  73. {
  74. while (1) {
  75. shark_timer_t *timer = shark_timer_head.next;
  76. if (timer->time > shark_mseconds) {
  77. return timer->time - shark_mseconds;
  78. }
  79. if (timer != &shark_timer_head) {
  80. shark_timer_cancel(timer);
  81. timer->handler(timer);
  82. } else {
  83. break;
  84. }
  85. wdog_reload();
  86. }
  87. return 0xFFFFFFFF;
  88. }
  89. void shark_task_add(shark_task_t *task)
  90. {
  91. __disable_irq();
  92. task->next = shark_task_head.next;
  93. shark_task_head.next = task;
  94. __enable_irq();
  95. }
  96. shark_task_t *shark_task_create(TskFunction_t handler, void *params) {
  97. shark_task_t *ntsk = os_alloc(sizeof(shark_task_t));
  98. if (ntsk == NULL) {
  99. return ntsk;
  100. }
  101. ntsk->handler = handler;
  102. ntsk->params = params;
  103. shark_task_add(ntsk);
  104. return ntsk;
  105. }
  106. void shark_task_run(void)
  107. {
  108. shark_task_t *head = &shark_task_head;
  109. fmc_write_magic(IAP_MAGIC_SUCCESS);
  110. /* setup systick timer for 1000Hz interrupts */
  111. SysTick_Config(SystemCoreClock / 1000);
  112. /* configure the systick handler priority */
  113. NVIC_SetPriority(SysTick_IRQn, 0x00U);
  114. while (1) {
  115. wdog_reload();
  116. if (head->time <= shark_mseconds) {
  117. head->time = shark_mseconds + head->handler(head->params);
  118. }
  119. head = head->next;
  120. }
  121. }