los_task.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. #include "los_base.h"
  2. #include "los_task.h"
  3. LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly(UINT32 *taskId, TSK_INIT_PARAM_S *initParam)
  4. {
  5. rt_thread_t thread = rt_thread_create(initParam->pcName,
  6. (void (*)(void *))initParam->pfnTaskEntry,
  7. initParam->pArgs,
  8. initParam->uwStackSize,
  9. initParam->usTaskPrio,
  10. 10);
  11. if (thread == RT_NULL)
  12. {
  13. return LOS_ERRNO_TSK_NOT_CREATED;
  14. }
  15. /* calculate priority attribute */
  16. #if RT_THREAD_PRIORITY_MAX > 32
  17. thread->number = thread->current_priority >> 3; /* 5bit */
  18. thread->number_mask = 1L << thread->number;
  19. thread->high_mask = 1L << (thread->current_priority & 0x07); /* 3bit */
  20. #else
  21. thread->number_mask = 1L << thread->current_priority;
  22. #endif /* RT_THREAD_PRIORITY_MAX > 32 */
  23. /* change thread stat */
  24. thread->stat = RT_THREAD_SUSPEND;
  25. *taskId = (UINT32)thread;
  26. return LOS_OK;
  27. }
  28. LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskId, TSK_INIT_PARAM_S *initParam)
  29. {
  30. UINT32 ret;
  31. ret = LOS_TaskCreateOnly(taskId, initParam);
  32. if (ret != LOS_OK)
  33. {
  34. return ret;
  35. }
  36. if (rt_thread_resume((rt_thread_t)*taskId) != RT_EOK)
  37. {
  38. return LOS_ERRNO_TSK_NOT_SUSPENDED;
  39. }
  40. if (rt_thread_self() != RT_NULL)
  41. {
  42. /* do a scheduling */
  43. rt_schedule();
  44. }
  45. return LOS_OK;
  46. }
  47. #ifdef LOSCFG_TASK_STATIC_ALLOCATION
  48. UINT32 LOS_TaskCreateOnlyStatic(UINT32 *taskId, TSK_INIT_PARAM_S *initParam, VOID *topStack)
  49. {
  50. rt_err_t result = RT_EOK;
  51. rt_thread_t thread;
  52. thread = (struct rt_thread *)rt_malloc(sizeof(struct rt_thread));
  53. if (thread == RT_NULL)
  54. {
  55. return LOS_ERRNO_TSK_NO_MEMORY;
  56. }
  57. result = rt_thread_init(thread,
  58. initParam->pcName,
  59. (void (*)(void *))initParam->pfnTaskEntry,
  60. initParam->pArgs,
  61. topStack, initParam->uwStackSize,
  62. initParam->usTaskPrio, 10);
  63. if (result != RT_EOK)
  64. {
  65. return LOS_ERRNO_TSK_NOT_CREATED;
  66. }
  67. /* calculate priority attribute */
  68. #if RT_THREAD_PRIORITY_MAX > 32
  69. thread->number = thread->current_priority >> 3; /* 5bit */
  70. thread->number_mask = 1L << thread->number;
  71. thread->high_mask = 1L << (thread->current_priority & 0x07); /* 3bit */
  72. #else
  73. thread->number_mask = 1L << thread->current_priority;
  74. #endif /* RT_THREAD_PRIORITY_MAX > 32 */
  75. /* change thread stat */
  76. thread->stat = RT_THREAD_SUSPEND;
  77. *taskId = (UINT32)thread;
  78. return LOS_OK;
  79. }
  80. UINT32 LOS_TaskCreateStatic(UINT32 *taskId, TSK_INIT_PARAM_S *initParam, VOID *topStack)
  81. {
  82. UINT32 ret;
  83. ret = LOS_TaskCreateOnlyStatic(taskId, initParam, topStack);
  84. if (ret != LOS_OK)
  85. {
  86. return ret;
  87. }
  88. if (rt_thread_resume((rt_thread_t)*taskId) != RT_EOK)
  89. {
  90. return LOS_ERRNO_TSK_NOT_SUSPENDED;
  91. }
  92. if (rt_thread_self() != RT_NULL)
  93. {
  94. /* do a scheduling */
  95. rt_schedule();
  96. }
  97. return LOS_OK;
  98. }
  99. #endif
  100. LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskId)
  101. {
  102. rt_thread_t thread = (rt_thread_t)taskId;
  103. if (rt_object_is_systemobject((rt_object_t)thread) == RT_TRUE)
  104. {
  105. rt_thread_detach(thread);
  106. }
  107. #ifdef RT_USING_HEAP
  108. else
  109. {
  110. rt_thread_delete(thread);
  111. }
  112. #endif /* RT_USING_HEAP */
  113. rt_schedule();
  114. return LOS_OK;
  115. }
  116. LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskId)
  117. {
  118. if (rt_thread_resume((rt_thread_t)taskId) != RT_EOK)
  119. {
  120. return LOS_ERRNO_TSK_NOT_SUSPENDED;
  121. }
  122. if (rt_thread_self() != RT_NULL)
  123. {
  124. /* do a scheduling */
  125. rt_schedule();
  126. }
  127. return LOS_OK;
  128. }
  129. LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskSuspend(UINT32 taskId)
  130. {
  131. if (rt_thread_suspend((rt_thread_t)taskId) != RT_EOK)
  132. {
  133. return LOS_ERRNO_TSK_ALREADY_SUSPENDED;
  134. }
  135. if (rt_thread_self() != RT_NULL)
  136. {
  137. /* do a scheduling */
  138. rt_schedule();
  139. }
  140. return LOS_OK;
  141. }
  142. LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick)
  143. {
  144. if (tick == 0)
  145. {
  146. rt_thread_yield();
  147. }
  148. else
  149. {
  150. rt_thread_delay(tick);
  151. }
  152. return LOS_OK;
  153. }
  154. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskYield(VOID)
  155. {
  156. rt_thread_yield();
  157. return LOS_OK;
  158. }
  159. LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskLock(VOID)
  160. {
  161. // rt_enter_critical();
  162. }
  163. LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskUnlock(VOID)
  164. {
  165. // rt_exit_critical();
  166. }
  167. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskId, UINT16 taskPrio)
  168. {
  169. if ((rt_thread_t)taskId == RT_NULL)
  170. {
  171. return LOS_ERRNO_TSK_ID_INVALID;
  172. }
  173. if (taskPrio > RT_THREAD_PRIORITY_MAX)
  174. {
  175. return LOS_ERRNO_TSK_PRIOR_ERROR;
  176. }
  177. rt_thread_control((rt_thread_t)taskId, RT_THREAD_CTRL_CHANGE_PRIORITY, &taskPrio);
  178. return LOS_OK;
  179. }
  180. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CurTaskPriSet(UINT16 taskPrio)
  181. {
  182. rt_thread_t thread = rt_thread_self();
  183. return LOS_TaskPriSet((UINT32)thread, taskPrio);
  184. }
  185. LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskPriGet(UINT32 taskId)
  186. {
  187. rt_thread_t thread = (rt_thread_t)taskId;
  188. return thread->current_priority;
  189. }
  190. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskCpuAffiSet(UINT32 taskId, UINT16 cpuAffiMask)
  191. {
  192. #ifdef LOSCFG_KERNEL_SMP
  193. rt_uint8_t cpu;
  194. for (int i = 0; i < 16; i++)
  195. {
  196. if ((1 << i) == cpuAffiMask)
  197. {
  198. cpu = i + 1;
  199. break;
  200. }
  201. }
  202. rt_thread_control((rt_thread_t)taskId, RT_THREAD_CTRL_BIND_CPU, cpuAffiMask);
  203. #endif
  204. return LOS_OK;
  205. }
  206. VOID LOS_TaskResRecycle(VOID)
  207. {
  208. rt_kprintf("not support\r\n");
  209. }
  210. LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID)
  211. {
  212. rt_thread_t thread = rt_thread_self();
  213. rt_kprintf("not support\r\n");
  214. return (UINT32)thread;
  215. }
  216. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskInfoGet(UINT32 taskId, TSK_INFO_S *taskInfo)
  217. {
  218. rt_thread_t thread = (rt_thread_t)taskId;
  219. rt_kprintf("not support\r\n");
  220. return (UINT32)thread;
  221. }
  222. LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskCpuAffiGet(UINT32 taskId)
  223. {
  224. #ifdef LOSCFG_KERNEL_SMP
  225. rt_thread_t thread = (rt_thread_t)taskId;
  226. return (1 << (thread->bind_cpu - 1));
  227. #endif
  228. return LOS_OK;
  229. }
  230. #ifdef LOSCFG_BASE_CORE_TSK_MONITOR
  231. LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskSwitchHookReg(TSKSWITCHHOOK hook)
  232. {
  233. rt_scheduler_sethook((void (*)(struct rt_thread *, struct rt_thread *))hook);
  234. }
  235. #endif /* LOSCFG_BASE_CORE_TSK_MONITOR */
  236. LITE_OS_SEC_TEXT_MINOR VOID LOS_LowpowerHookReg(LOWPOWERIDLEHOOK hook)
  237. {
  238. rt_kprintf("not support\r\n");
  239. }
  240. LITE_OS_SEC_TEXT_MINOR VOID LOS_IdleHandlerHookReg(IDLEHANDLERHOOK hook)
  241. {
  242. rt_thread_idle_sethook(hook);
  243. }