tmos.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /*
  2. * tmos.c
  3. *
  4. * Created on: Feb 29, 2024
  5. * Author: Administrator
  6. */
  7. #include "include.h"
  8. #include "typedef.h"
  9. #include "tmos.h"
  10. #include "string.h"
  11. #include "driver_tmr.h"
  12. #define TASK_ID_MAX 10
  13. #define TASK_EVENT_MAX 16
  14. static uint8_t tmos_num = 0;
  15. typedef struct{
  16. tmosEvents event;
  17. tmosTimer timer[TASK_EVENT_MAX];
  18. tmosTimer time_stamp[TASK_EVENT_MAX];
  19. pTaskEventHandlerFn TaskEventHandlerFn;
  20. }ST_TASK;
  21. static ST_TASK tmosTask[TASK_ID_MAX];
  22. static tmosTimer time_stamp = 0;
  23. static tmosTimer toms_tick=0;
  24. AT(.com_text.isr)
  25. void timer3_isq(void)
  26. {
  27. if (tmr_get_flag(TMR3, TMR_IT_UPDATE) != RESET) {
  28. tmr_clear_flag(TMR3, TMR_IT_UPDATE);
  29. toms_tick++;
  30. }
  31. }
  32. void timer3_650us_init(void)
  33. {
  34. tmr_base_init_typedef tmr_base_init_struct;
  35. clk_gate1_cmd(CLK_GATE1_TMR3, CLK_EN);
  36. tmr_base_init_struct.clock_source = TMR_COUNTER_RISING;
  37. tmr_base_init_struct.counter_source = TMR_INC_SOURCE; // 1MHz
  38. tmr_base_init_struct.prescale = 1 - 1; // 1KHz
  39. tmr_base_init_struct.period = 650 - 1; // 5Hz
  40. tmr_base_init(TMR3, &tmr_base_init_struct);
  41. tmr_pic_config(TMR3, timer3_isq, 0, TMR_IT_UPDATE, ENABLE);
  42. tmr_cmd(TMR3, ENABLE);
  43. gpio_init_typedef gpio_init_structure;
  44. gpio_init_structure.gpio_pin = GPIO_PIN_4;
  45. gpio_init_structure.gpio_dir = GPIO_DIR_OUTPUT;
  46. gpio_init_structure.gpio_fen = GPIO_FEN_GPIO;
  47. gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
  48. gpio_init_structure.gpio_drv = GPIO_DRV_6MA;
  49. gpio_init(GPIOA_REG, &gpio_init_structure);
  50. }
  51. bStatus_t tmos_init()
  52. {
  53. tmos_num = 0;
  54. memset((void*)tmosTask, 0, sizeof(tmosTask));
  55. toms_tick = 0;
  56. time_stamp = 0;
  57. timer3_650us_init();
  58. return 0;
  59. }
  60. bStatus_t tmos_set_event( tmosTaskID taskID, tmosEvents event )
  61. {
  62. tmosTask[taskID].event |= event;
  63. return 0;
  64. }
  65. bStatus_t tmos_start_task( tmosTaskID taskID, tmosEvents event, tmosTimer time )
  66. {
  67. uint8_t i;
  68. tmosTask[taskID].event |= event;
  69. for(i=0; i<TASK_EVENT_MAX; i++)
  70. {
  71. if((event >> i) & 0x01)
  72. {
  73. tmosTask[taskID].timer[i] = time ;
  74. break;
  75. }
  76. }
  77. return 0;
  78. }
  79. bStatus_t tmos_stop_task( tmosTaskID taskID, tmosEvents event )
  80. {
  81. uint8_t i;
  82. tmosTask[taskID].event &= ~event;
  83. for(i=0; i<TASK_EVENT_MAX; i++)
  84. {
  85. if((event >> i) & 0x01)
  86. {
  87. tmosTask[taskID].timer[i] = 0;
  88. break;
  89. }
  90. }
  91. return 0;
  92. }
  93. void TMOS_SystemProcess( void )
  94. {
  95. uint8_t i,j,tick = 0;
  96. tmosEvents event;
  97. if(toms_tick==time_stamp)
  98. return;
  99. tick = toms_tick - time_stamp;
  100. time_stamp = toms_tick;
  101. for(i = 0; i<tmos_num; i++)
  102. {
  103. if(tmosTask[i].event == 0)
  104. {
  105. continue;
  106. }
  107. else
  108. {
  109. //PRINT("task_id=%d\n", i);
  110. for(j=0; j<TASK_EVENT_MAX; j++)
  111. {
  112. event = 1L<<j;
  113. if(tmosTask[i].event & event)
  114. {
  115. //PRINT("task_event=%d\n", j);
  116. if(tmosTask[i].timer[j] > tick)
  117. {
  118. //PRINT("timer=%d\n", tmosTask[i].timer[j]);
  119. tmosTask[i].timer[j]-=tick;
  120. }
  121. else if(tmosTask[i].timer[j] <= tick)
  122. {
  123. //PRINT("timer=%d\n", tmosTask[i].timer[j]);
  124. tmosTask[i].timer[j] = 0;
  125. tmosTask[i].event &= ~event;
  126. tmosTask[i].TaskEventHandlerFn((tmosTaskID)i, event);
  127. }
  128. }
  129. }
  130. }
  131. }
  132. }
  133. tmosTaskID TMOS_ProcessEventRegister( pTaskEventHandlerFn eventCb )
  134. {
  135. if(tmos_num >= TASK_ID_MAX)
  136. {
  137. return INVALID_TASK_ID;
  138. }
  139. else
  140. {
  141. tmosTask[tmos_num++].TaskEventHandlerFn = eventCb;
  142. }
  143. return tmos_num - 1;
  144. }