| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- #include "os/os_task.h"
- #include "os/os_types.h"
- #include "bsp/bsp_driver.h"
- #include "config.h"
- #include "bsp/bsp.h"
- extern uint32_t get_system_sleep_time(void);
- static u64 shark_mseconds = 0;
- static u32 _g_ticks = 0;
- static u32 shark_timer_task_handler(void *);
- static shark_timer_t shark_timer_head = {
- .prev = &shark_timer_head,
- .next = &shark_timer_head
- };
- static shark_task_t shark_task_head = {
- .next = &shark_task_head,
- .handler = shark_timer_task_handler
- };
- void SysTick_Handler(void)
- {
- shark_mseconds++;
- _g_ticks ++;
- }
- u64 shark_get_mseconds(void)
- {
- return shark_mseconds;
- }
- u32 shark_get_seconds(void){
- return _g_ticks/1000;
- }
- u32 get_tick_ms(void) {
- return _g_ticks;
- }
- u32 get_delta_ms(uint32_t prev_ms){
- uint32_t current = get_tick_ms();
- if (current >= prev_ms){
- return current - prev_ms;
- }
- //32λwrapper�����current < prev_ms
- return 0xFFFFFFFF - prev_ms + current;
- }
- static inline void shark_timer_sync(void)
- {
- shark_task_head.time = shark_timer_head.next->time;
- }
- void shark_timer_post(shark_timer_t *timer, u32 delay)
- {
- shark_timer_t *node;
- u64 time;
- __disable_irq();
- time = shark_mseconds + (delay > 0 ? delay : 1);
- if (timer->prev != NULL) {
- timer->prev->next = timer->next;
- }
- if (timer->next != NULL) {
- timer->next->prev = timer->prev;
- }
- for (node = shark_timer_head.next; node != &shark_timer_head; node = node->next) {
- if (node->time > time) {
- break;
- }
- }
- timer->prev = node->prev;
- node->prev->next = timer;
- node->prev = timer;
- timer->next = node;
- timer->time = time;
- shark_timer_sync();
- __enable_irq();
- }
- void shark_timer_cancel(shark_timer_t *timer)
- {
- __disable_irq();
- timer->prev->next = timer->next;
- timer->next->prev = timer->prev;
- timer->next = timer->prev = timer;
- shark_timer_sync();
- __enable_irq();
- }
- static u32 shark_timer_task_handler(void *p)
- {
- while (1) {
- shark_timer_t *timer = shark_timer_head.next;
- if (timer->time > shark_mseconds) {
- return timer->time - shark_mseconds;
- }
- if (timer != &shark_timer_head) {
- shark_timer_cancel(timer);
- timer->handler(timer);
- } else {
- break;
- }
- wdog_reload();
- }
- return 0xFFFFFFFF;
- }
- void shark_task_add(shark_task_t *task)
- {
- __disable_irq();
- task->next = shark_task_head.next;
- shark_task_head.next = task;
- __enable_irq();
- }
- shark_task_t *shark_task_create(TskFunction_t handler, void *params) {
- shark_task_t *ntsk = os_alloc(sizeof(shark_task_t));
- if (ntsk == NULL) {
- return ntsk;
- }
- ntsk->time = shark_mseconds;
- ntsk->handler = handler;
- ntsk->params = params;
- shark_task_add(ntsk);
- return ntsk;
- }
- void shark_task_run(void)
- {
- shark_task_t *head = &shark_task_head;
- fmc_write_magic(IAP_MAGIC_SUCCESS);
- while (1) {
- wdog_reload();
- if (head->time <= shark_mseconds) {
- head->time = shark_mseconds + head->handler(head->params);
- }
- head = head->next;
- }
- }
|