task.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include "task.h"
  2. #include <stdlib.h>
  3. //define the task node structure in the system task scheduler
  4. typedef struct task_node {
  5. task *ptask;
  6. struct task_node *pre;
  7. struct task_node *next;
  8. }task_node;
  9. //declare the task head in the task queue
  10. task_node *g_task_head = NULL;
  11. /******************************************************************************
  12. * FunctionName : new_task
  13. * Description : new a empty task
  14. * Parameters : none
  15. * Returns : the created task
  16. *******************************************************************************/
  17. task * new_task(void)
  18. {
  19. return (task *)malloc(sizeof(task));
  20. }
  21. /******************************************************************************
  22. * FunctionName : add_task
  23. * Description : add a new task to the system
  24. * Parameters : the task to be added
  25. * Returns : the add operation result
  26. *******************************************************************************/
  27. int8_t add_task(task *ptask)
  28. {
  29. task_node *cur_task_tail;
  30. task_node *new_task_node;
  31. new_task_node = (task_node *)malloc(sizeof(task_node));
  32. if(new_task_node == NULL)
  33. {
  34. return -1;
  35. }
  36. new_task_node->pre = NULL;
  37. new_task_node->next = NULL;
  38. new_task_node->ptask = ptask;
  39. if(g_task_head == NULL)
  40. {
  41. g_task_head = new_task_node;
  42. return 0;
  43. }
  44. if(g_task_head->next == NULL)
  45. {
  46. cur_task_tail = g_task_head;
  47. }
  48. else
  49. {
  50. cur_task_tail = g_task_head->next;
  51. }
  52. while(cur_task_tail->next != NULL)
  53. {
  54. cur_task_tail = cur_task_tail->next;
  55. }
  56. cur_task_tail->next = new_task_node;
  57. new_task_node->pre = cur_task_tail;
  58. new_task_node->next = NULL;
  59. return 0;
  60. }
  61. /******************************************************************************
  62. * FunctionName : pop_task
  63. * Description : pop a task from the system
  64. * Parameters : none
  65. * Returns : the task
  66. *******************************************************************************/
  67. task* pop_task(void)
  68. {
  69. task_node *cur_task_head = g_task_head;
  70. task_node *next_task_node;
  71. task *ptask;
  72. if(cur_task_head == NULL)
  73. {
  74. return NULL;
  75. }
  76. next_task_node = cur_task_head->next;
  77. if(next_task_node == NULL)
  78. {
  79. ptask = cur_task_head->ptask;
  80. g_task_head = NULL;
  81. free(cur_task_head);
  82. return ptask;
  83. }
  84. ptask = cur_task_head->ptask;
  85. g_task_head = next_task_node;
  86. g_task_head->pre = NULL;
  87. cur_task_head->next = NULL;
  88. free(cur_task_head);
  89. return ptask;
  90. }
  91. /******************************************************************************
  92. * FunctionName : delete_task
  93. * Description : delete a task
  94. * Parameters : the task to be deleted
  95. * Returns : none
  96. *******************************************************************************/
  97. void delete_task(task *ptask)
  98. {
  99. if(ptask == NULL)
  100. {
  101. return;
  102. }
  103. if(ptask->pdata != NULL)
  104. {
  105. free(ptask->pdata);
  106. ptask->pdata=NULL;
  107. }
  108. free(ptask);
  109. ptask=NULL;
  110. }