You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/07/12 02:44:50 UTC
[incubator-nuttx] 02/04: nx_start: Simplify and unify the partial
initialization process
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit bb867a38fc55f3437d67e2e6d6529b031cb2b47f
Author: Jiuzhu Dong <do...@xiaomi.com>
AuthorDate: Sat Jul 10 09:01:20 2021 +0800
nx_start: Simplify and unify the partial initialization process
for both SMP and non-SMP
Change-Id: I0fea8b4f59fc27d253a2ef9b7503acbb7410cc14
Signed-off-by: Jiuzhu Dong <do...@xiaomi.com>
---
sched/init/nx_start.c | 110 ++++++++++++++++++++++----------------------------
1 file changed, 48 insertions(+), 62 deletions(-)
diff --git a/sched/init/nx_start.c b/sched/init/nx_start.c
index 7715220..d2ff3c7 100644
--- a/sched/init/nx_start.c
+++ b/sched/init/nx_start.c
@@ -63,6 +63,10 @@
* Pre-processor Definitions
****************************************************************************/
+#ifndef CONFIG_SMP_NCPUS
+# define CONFIG_SMP_NCPUS 1
+#endif
+
#ifdef CONFIG_SMP
/* This set of all CPUs */
@@ -92,7 +96,6 @@
volatile dq_queue_t g_readytorun;
-#ifdef CONFIG_SMP
/* In order to support SMP, the function of the g_readytorun list changes,
* The g_readytorun is still used but in the SMP case it will contain only:
*
@@ -123,7 +126,9 @@ volatile dq_queue_t g_readytorun;
* always the CPU's IDLE task.
*/
+#ifdef CONFIG_SMP
volatile dq_queue_t g_assignedtasks[CONFIG_SMP_NCPUS];
+#endif
/* g_running_tasks[] holds a references to the running task for each cpu.
* It is valid only when up_interrupt_context() returns true.
@@ -131,12 +136,6 @@ volatile dq_queue_t g_assignedtasks[CONFIG_SMP_NCPUS];
FAR struct tcb_s *g_running_tasks[CONFIG_SMP_NCPUS];
-#else
-
-FAR struct tcb_s *g_running_tasks[1];
-
-#endif
-
/* This is the list of all tasks that are ready-to-run, but cannot be placed
* in the g_readytorun list because: (1) They are higher priority than the
* currently active task at the head of the g_readytorun list, and (2) the
@@ -303,11 +302,7 @@ uint8_t g_nx_initstate; /* See enum nx_initstate_e */
* bringing up the rest of the system.
*/
-#ifdef CONFIG_SMP
static struct task_tcb_s g_idletcb[CONFIG_SMP_NCPUS];
-#else
-static struct task_tcb_s g_idletcb[1];
-#endif
/* This is the name of the idle task */
@@ -324,11 +319,7 @@ static const char g_idlename[] = "Idle Task";
* do things s little differently here for the IDLE tasks.
*/
-#ifdef CONFIG_SMP
static FAR char *g_idleargv[CONFIG_SMP_NCPUS][2];
-#else
-static FAR char *g_idleargv[1][2];
-#endif
/****************************************************************************
* Public Functions
@@ -352,7 +343,6 @@ static FAR char *g_idleargv[1][2];
void nx_start(void)
{
- int cpu = 0;
int i;
sinfo("Entry\n");
@@ -399,18 +389,16 @@ void nx_start(void)
/* Initialize the IDLE task TCB *******************************************/
-#ifdef CONFIG_SMP
- for (cpu = 0; cpu < CONFIG_SMP_NCPUS; cpu++, g_lastpid++)
-#endif
+ for (i = 0; i < CONFIG_SMP_NCPUS; i++)
{
FAR dq_queue_t *tasklist;
int hashndx;
/* Assign the process ID(s) of ZERO to the idle task(s) */
- hashndx = PIDHASH(g_lastpid);
- g_pidhash[hashndx].tcb = &g_idletcb[cpu].cmn;
- g_pidhash[hashndx].pid = g_lastpid;
+ hashndx = PIDHASH(i);
+ g_pidhash[hashndx].tcb = &g_idletcb[i].cmn;
+ g_pidhash[hashndx].pid = i;
/* Initialize a TCB for this thread of execution. NOTE: The default
* value for most components of the g_idletcb are zero. The entire
@@ -419,9 +407,9 @@ void nx_start(void)
* that has pid == 0 and sched_priority == 0.
*/
- memset((void *)&g_idletcb[cpu], 0, sizeof(struct task_tcb_s));
- g_idletcb[cpu].cmn.pid = g_lastpid;
- g_idletcb[cpu].cmn.task_state = TSTATE_TASK_RUNNING;
+ memset((void *)&g_idletcb[i], 0, sizeof(struct task_tcb_s));
+ g_idletcb[i].cmn.pid = i;
+ g_idletcb[i].cmn.task_state = TSTATE_TASK_RUNNING;
/* Set the entry point. This is only for debug purposes. NOTE: that
* the start_t entry point is not saved. That is acceptable, however,
@@ -430,16 +418,16 @@ void nx_start(void)
*/
#ifdef CONFIG_SMP
- if (cpu > 0)
+ if (i > 0)
{
- g_idletcb[cpu].cmn.start = nx_idle_trampoline;
- g_idletcb[cpu].cmn.entry.main = (main_t)nx_idle_trampoline;
+ g_idletcb[i].cmn.start = nx_idle_trampoline;
+ g_idletcb[i].cmn.entry.main = (main_t)nx_idle_trampoline;
}
else
#endif
{
- g_idletcb[cpu].cmn.start = nx_start;
- g_idletcb[cpu].cmn.entry.main = (main_t)nx_start;
+ g_idletcb[i].cmn.start = nx_start;
+ g_idletcb[i].cmn.entry.main = (main_t)nx_start;
}
/* Set the task flags to indicate that this is a kernel thread and, if
@@ -447,13 +435,13 @@ void nx_start(void)
*/
#ifdef CONFIG_SMP
- g_idletcb[cpu].cmn.flags = (TCB_FLAG_TTYPE_KERNEL |
- TCB_FLAG_NONCANCELABLE |
- TCB_FLAG_CPU_LOCKED);
- g_idletcb[cpu].cmn.cpu = cpu;
+ g_idletcb[i].cmn.flags = (TCB_FLAG_TTYPE_KERNEL |
+ TCB_FLAG_NONCANCELABLE |
+ TCB_FLAG_CPU_LOCKED);
+ g_idletcb[i].cmn.cpu = i;
#else
- g_idletcb[cpu].cmn.flags = (TCB_FLAG_TTYPE_KERNEL |
- TCB_FLAG_NONCANCELABLE);
+ g_idletcb[i].cmn.flags = (TCB_FLAG_TTYPE_KERNEL |
+ TCB_FLAG_NONCANCELABLE);
#endif
#ifdef CONFIG_SMP
@@ -465,18 +453,18 @@ void nx_start(void)
* the IDLE task.
*/
- g_idletcb[cpu].cmn.affinity = SCHED_ALL_CPUS;
+ g_idletcb[i].cmn.affinity = SCHED_ALL_CPUS;
#endif
#if CONFIG_TASK_NAME_SIZE > 0
/* Set the IDLE task name */
# ifdef CONFIG_SMP
- snprintf(g_idletcb[cpu].cmn.name, CONFIG_TASK_NAME_SIZE, "CPU%d IDLE",
- cpu);
+ snprintf(g_idletcb[i].cmn.name, CONFIG_TASK_NAME_SIZE, "CPU%d IDLE",
+ i);
# else
- strncpy(g_idletcb[cpu].cmn.name, g_idlename, CONFIG_TASK_NAME_SIZE);
- g_idletcb[cpu].cmn.name[CONFIG_TASK_NAME_SIZE] = '\0';
+ strncpy(g_idletcb[i].cmn.name, g_idlename, CONFIG_TASK_NAME_SIZE);
+ g_idletcb[i].cmn.name[CONFIG_TASK_NAME_SIZE] = '\0';
# endif
#endif
@@ -489,39 +477,41 @@ void nx_start(void)
*/
#if CONFIG_TASK_NAME_SIZE > 0
- g_idleargv[cpu][0] = g_idletcb[cpu].cmn.name;
+ g_idleargv[i][0] = g_idletcb[i].cmn.name;
#else
- g_idleargv[cpu][0] = (FAR char *)g_idlename;
+ g_idleargv[i][0] = (FAR char *)g_idlename;
#endif /* CONFIG_TASK_NAME_SIZE */
- g_idleargv[cpu][1] = NULL;
- g_idletcb[cpu].argv = &g_idleargv[cpu][0];
+ g_idleargv[i][1] = NULL;
+ g_idletcb[i].argv = &g_idleargv[i][0];
/* Then add the idle task's TCB to the head of the current ready to
* run list.
*/
#ifdef CONFIG_SMP
- tasklist = TLIST_HEAD(TSTATE_TASK_RUNNING, cpu);
+ tasklist = TLIST_HEAD(TSTATE_TASK_RUNNING, i);
#else
tasklist = TLIST_HEAD(TSTATE_TASK_RUNNING);
#endif
- dq_addfirst((FAR dq_entry_t *)&g_idletcb[cpu], tasklist);
+ dq_addfirst((FAR dq_entry_t *)&g_idletcb[i], tasklist);
/* Mark the idle task as the running task */
- g_running_tasks[cpu] = &g_idletcb[cpu].cmn;
+ g_running_tasks[i] = &g_idletcb[i].cmn;
/* Initialize the 1st processor-specific portion of the TCB
* Note: other idle thread get initialized in nx_smpstart
*/
- if (cpu == 0)
+ if (i == 0)
{
- up_initial_state(&g_idletcb[cpu].cmn);
- up_stack_frame(&g_idletcb[cpu].cmn, sizeof(struct task_info_s));
+ up_initial_state(&g_idletcb[i].cmn);
+ up_stack_frame(&g_idletcb[i].cmn, sizeof(struct task_info_s));
}
}
+ g_lastpid = CONFIG_SMP_NCPUS - 1;
+
/* Task lists are initialized */
g_nx_initstate = OSINIT_TASKLISTS;
@@ -714,40 +704,36 @@ void nx_start(void)
sched_note_start(&g_idletcb[0].cmn);
-#ifdef CONFIG_SMP
/* Initialize the IDLE group for the IDLE task of each CPU */
- for (cpu = 0; cpu < CONFIG_SMP_NCPUS; cpu++)
-#endif
+ for (i = 0; i < CONFIG_SMP_NCPUS; i++)
{
/* Allocate the IDLE group */
- DEBUGVERIFY(group_allocate(&g_idletcb[cpu], g_idletcb[cpu].cmn.flags));
+ DEBUGVERIFY(group_allocate(&g_idletcb[i], g_idletcb[i].cmn.flags));
-#ifdef CONFIG_SMP
- if (cpu > 0)
+ if (i > 0)
{
/* Clone stdout, stderr, stdin from the CPU0 IDLE task. */
- DEBUGVERIFY(group_setuptaskfiles(&g_idletcb[cpu]));
+ DEBUGVERIFY(group_setuptaskfiles(&g_idletcb[i]));
}
else
-#endif
{
/* Create stdout, stderr, stdin on the CPU0 IDLE task. These
* will be inherited by all of the threads created by the CPU0
* IDLE task.
*/
- DEBUGVERIFY(group_setupidlefiles(&g_idletcb[cpu]));
+ DEBUGVERIFY(group_setupidlefiles(&g_idletcb[i]));
}
/* Complete initialization of the IDLE group. Suppress retention
* of child status in the IDLE group.
*/
- DEBUGVERIFY(group_initialize(&g_idletcb[cpu]));
- g_idletcb[cpu].cmn.group->tg_flags = GROUP_FLAG_NOCLDWAIT;
+ DEBUGVERIFY(group_initialize(&g_idletcb[i]));
+ g_idletcb[i].cmn.group->tg_flags = GROUP_FLAG_NOCLDWAIT;
}
/* Start SYSLOG ***********************************************************/