add a set of dyn(create / destroy) interface

1. tos_ring_q_create_dyn
2. tos_chr_fifo_create_dyn
3. tos_msg_q_create_dyn
4. tos_mail_q_create_dyn
5. tos_bin_heap_create_dyn
6. tos_prio_q_create_dyn
7. tos_prio_msg_q_create_dyn
8. tos_prio_mail_q_create_dyn
This commit is contained in:
daishengdong
2019-10-29 16:57:43 +08:00
parent 3615aaf3f4
commit c411ed1eec
92 changed files with 1800 additions and 86333 deletions

View File

@@ -24,6 +24,8 @@ __STATIC_INLINE__ void task_reset(k_task_t *task)
#endif
#if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u
knl_object_alloc_reset(&task->knl_obj);
tos_list_init(&task->dead_list);
#endif
tos_list_init(&task->stat_list);
@@ -117,6 +119,10 @@ __API__ k_err_t tos_task_create(k_task_t *task,
knl_object_init(&task->knl_obj, KNL_OBJ_TYPE_TASK);
#endif
#if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u
knl_object_alloc_set_static(&task->knl_obj);
#endif
task->sp = cpu_task_stk_init((void *)entry, arg, (void *)task_exit, stk_base, stk_size);
task->entry = entry;
task->arg = arg;
@@ -193,13 +199,15 @@ __API__ k_err_t tos_task_destroy(k_task_t *task)
task = k_curr_task;
}
TOS_OBJ_VERIFY(task, KNL_OBJ_TYPE_TASK);
if (knl_is_self(task) && knl_is_sched_locked()) {
return K_ERR_SCHED_LOCKED;
}
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
if (!knl_object_verify(&task->knl_obj, KNL_OBJ_TYPE_TASK)) {
return K_ERR_OBJ_INVALID;
#if TOS_CFG_TASK_DYNAMIC_CREATE_EN
if (!knl_object_alloc_is_static(&task->knl_obj)) {
return K_ERR_OBJ_INVALID_ALLOC_TYPE;
}
#endif
@@ -271,16 +279,14 @@ __API__ k_err_t tos_task_create_dyn(k_task_t **task,
return K_ERR_TASK_OUT_OF_MEMORY;
}
the_task->stk_base = stk_base;
err = tos_task_create(the_task, name, entry, arg, prio, stk_base, stk_size, timeslice);
if (err != K_ERR_NONE) {
tos_mmheap_free(stk_base);
tos_mmheap_free(the_task);
task_free(the_task);
return err;
}
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
knl_object_init(&the_task->knl_obj, KNL_OBJ_TYPE_TASK_DYN);
#endif
knl_object_alloc_set_dynamic(&the_task->knl_obj);
*task = the_task;
@@ -297,15 +303,15 @@ __API__ k_err_t tos_task_destroy_dyn(k_task_t *task)
task = k_curr_task;
}
TOS_OBJ_VERIFY(task, KNL_OBJ_TYPE_TASK);
if (knl_is_self(task) && knl_is_sched_locked()) {
return K_ERR_SCHED_LOCKED;
}
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
if (!knl_object_verify(&task->knl_obj, KNL_OBJ_TYPE_TASK_DYN)) {
return K_ERR_OBJ_INVALID;
if (!knl_object_alloc_is_dynamic(&task->knl_obj)) {
return K_ERR_OBJ_INVALID_ALLOC_TYPE;
}
#endif
tos_knl_sched_lock();
@@ -355,15 +361,9 @@ __API__ k_err_t tos_task_prio_change(k_task_t *task, k_prio_t prio_new)
#endif
TOS_PTR_SANITY_CHECK(task);
TOS_OBJ_VERIFY(task, KNL_OBJ_TYPE_TASK);
TOS_IN_IRQ_CHECK();
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
if (!knl_object_verify(&task->knl_obj, KNL_OBJ_TYPE_TASK) &&
!knl_object_verify(&task->knl_obj, KNL_OBJ_TYPE_TASK_DYN)) {
return K_ERR_OBJ_INVALID;
}
#endif
if (unlikely(prio_new >= K_TASK_PRIO_IDLE)) {
return K_ERR_TASK_PRIO_INVALID;
}
@@ -420,12 +420,7 @@ __API__ k_err_t tos_task_suspend(k_task_t *task)
task = k_curr_task;
}
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
if (!knl_object_verify(&task->knl_obj, KNL_OBJ_TYPE_TASK) &&
!knl_object_verify(&task->knl_obj, KNL_OBJ_TYPE_TASK_DYN)) {
return K_ERR_OBJ_INVALID;
}
#endif
TOS_OBJ_VERIFY(task, KNL_OBJ_TYPE_TASK);
if (knl_is_idle(task)) {
return K_ERR_TASK_SUSPEND_IDLE;
@@ -453,13 +448,7 @@ __API__ k_err_t tos_task_resume(k_task_t *task)
TOS_CPU_CPSR_ALLOC();
TOS_PTR_SANITY_CHECK(task);
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
if (!knl_object_verify(&task->knl_obj, KNL_OBJ_TYPE_TASK) &&
!knl_object_verify(&task->knl_obj, KNL_OBJ_TYPE_TASK_DYN)) {
return K_ERR_OBJ_INVALID;
}
#endif
TOS_OBJ_VERIFY(task, KNL_OBJ_TYPE_TASK);
if (unlikely(knl_is_self(task))) {
return K_ERR_TASK_RESUME_SELF;
@@ -520,15 +509,9 @@ __API__ k_err_t tos_task_delay_abort(k_task_t *task)
TOS_CPU_CPSR_ALLOC();
TOS_PTR_SANITY_CHECK(task);
TOS_OBJ_VERIFY(task, KNL_OBJ_TYPE_TASK);
TOS_IN_IRQ_CHECK();
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
if (!knl_object_verify(&task->knl_obj, KNL_OBJ_TYPE_TASK) &&
!knl_object_verify(&task->knl_obj, KNL_OBJ_TYPE_TASK_DYN)) {
return K_ERR_OBJ_INVALID;
}
#endif
TOS_CPU_INT_DISABLE();
if (knl_is_self(task) || !task_state_is_sleeping(task)) {
@@ -602,12 +585,7 @@ __API__ k_err_t tos_task_stack_draught_depth(k_task_t *task, int *depth)
task = k_curr_task;
}
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
if (!knl_object_verify(&task->knl_obj, KNL_OBJ_TYPE_TASK) &&
!knl_object_verify(&task->knl_obj, KNL_OBJ_TYPE_TASK_DYN)) {
return K_ERR_OBJ_INVALID;
}
#endif
TOS_OBJ_VERIFY(task, KNL_OBJ_TYPE_TASK);
TOS_CPU_INT_DISABLE();
rc = cpu_task_stack_draught_depth(task->stk_base, task->stk_size, depth);