sched: Add kthread_create_with_stack

let caller customize the stack buffer

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
Change-Id: I878818ec1ce5650165dbbe2d72a4618cb2e6a094
This commit is contained in:
Xiang Xiao 2021-06-26 02:31:34 +08:00 committed by Alan Carvalho de Assis
parent 3d7e0becfb
commit 13780dada3
2 changed files with 69 additions and 7 deletions

View File

@ -90,6 +90,35 @@ extern "C"
int nxtask_create(FAR const char *name, int priority,
int stack_size, main_t entry, FAR char * const argv[]);
/****************************************************************************
* Name: kthread_create_with_stack
*
* Description:
* This function creates and activates a kernel thread task with
* kernel-mode privileges. It is identical to kthread_create() except
* that it get the stack memory from caller.
*
* Input Parameters:
* name - Name of the new task
* priority - Priority of the new task
* stack_ptr - Stack buffer of the new task
* stack_size - Stack size of the new task
* entry - Entry point of a new task
* arg - A pointer to an array of input parameters. The array
* should be terminated with a NULL argv[] value. If no
* parameters are required, argv may be NULL.
*
* Returned Value:
* Returns the positive, non-zero process ID of the new task or a negated
* errno value to indicate the nature of any failure. If memory is
* insufficient or the task cannot be created -ENOMEM will be returned.
*
****************************************************************************/
int kthread_create_with_stack(FAR const char *name, int priority,
FAR void *stack_ptr, int stack_size,
main_t entry, FAR char * const argv[]);
/****************************************************************************
* Name: kthread_create
*

View File

@ -69,8 +69,8 @@
****************************************************************************/
static int nxthread_create(FAR const char *name, uint8_t ttype,
int priority, int stack_size, main_t entry,
FAR char * const argv[])
int priority, FAR void *stack_ptr, int stack_size,
main_t entry, FAR char * const argv[])
{
FAR struct task_tcb_s *tcb;
pid_t pid;
@ -91,7 +91,7 @@ static int nxthread_create(FAR const char *name, uint8_t ttype,
/* Initialize the task */
ret = nxtask_init(tcb, name, priority, NULL, stack_size, entry, argv);
ret = nxtask_init(tcb, name, priority, stack_ptr, stack_size, entry, argv);
if (ret < OK)
{
kmm_free(tcb);
@ -154,8 +154,8 @@ static int nxthread_create(FAR const char *name, uint8_t ttype,
int nxtask_create(FAR const char *name, int priority,
int stack_size, main_t entry, FAR char * const argv[])
{
return nxthread_create(name, TCB_FLAG_TTYPE_TASK, priority, stack_size,
entry, argv);
return nxthread_create(name, TCB_FLAG_TTYPE_TASK, priority,
NULL, stack_size, entry, argv);
}
/****************************************************************************
@ -205,6 +205,39 @@ int task_create(FAR const char *name, int priority,
}
#endif
/****************************************************************************
* Name: kthread_create_with_stack
*
* Description:
* This function creates and activates a kernel thread task with
* kernel-mode privileges. It is identical to kthread_create() except
* that it get the stack memory from caller.
*
* Input Parameters:
* name - Name of the new task
* priority - Priority of the new task
* stack_ptr - Stack buffer of the new task
* stack_size - Stack size of the new task
* entry - Entry point of a new task
* arg - A pointer to an array of input parameters. The array
* should be terminated with a NULL argv[] value. If no
* parameters are required, argv may be NULL.
*
* Returned Value:
* Returns the positive, non-zero process ID of the new task or a negated
* errno value to indicate the nature of any failure. If memory is
* insufficient or the task cannot be created -ENOMEM will be returned.
*
****************************************************************************/
int kthread_create_with_stack(FAR const char *name, int priority,
FAR void *stack_ptr, int stack_size,
main_t entry, FAR char * const argv[])
{
return nxthread_create(name, TCB_FLAG_TTYPE_KERNEL, priority,
stack_ptr, stack_size, entry, argv);
}
/****************************************************************************
* Name: kthread_create
*
@ -232,6 +265,6 @@ int task_create(FAR const char *name, int priority,
int kthread_create(FAR const char *name, int priority,
int stack_size, main_t entry, FAR char * const argv[])
{
return nxthread_create(name, TCB_FLAG_TTYPE_KERNEL, priority, stack_size,
entry, argv);
return kthread_create_with_stack(name, priority,
NULL, stack_size, entry, argv);
}