You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ma...@apache.org on 2021/07/15 23:38:05 UTC
[incubator-nuttx] 03/03: arch/sim: Initialize the idle thread stack
info correctly
This is an automated email from the ASF dual-hosted git repository.
masayuki pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit cee43ce280cfe1e704a16d860cf5087a8e014838
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Fri Jul 16 02:23:59 2021 +0800
arch/sim: Initialize the idle thread stack info correctly
and change the default value of IDLETHREAD_STACKSIZE to 65536
Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
Change-Id: Ia54efbbca4b69706150bc4178844b316688a104e
---
arch/sim/src/sim/up_cpuidlestack.c | 7 +------
arch/sim/src/sim/up_internal.h | 5 ++---
arch/sim/src/sim/up_simsmp.c | 15 ++++++---------
arch/sim/src/sim/up_smpsignal.c | 35 +++++++++++++++++++++++++++++++----
sched/Kconfig | 1 +
5 files changed, 41 insertions(+), 22 deletions(-)
diff --git a/arch/sim/src/sim/up_cpuidlestack.c b/arch/sim/src/sim/up_cpuidlestack.c
index 981fbc9..c9effa7 100644
--- a/arch/sim/src/sim/up_cpuidlestack.c
+++ b/arch/sim/src/sim/up_cpuidlestack.c
@@ -78,10 +78,5 @@
int up_cpu_idlestack(int cpu, FAR struct tcb_s *tcb, size_t stack_size)
{
- /* REVISIT: I don't think anything is needed here */
-
- tcb->adj_stack_size = 0;
- tcb->stack_alloc_ptr = NULL;
- tcb->stack_base_ptr = NULL;
- return OK;
+ return up_create_stack(tcb, stack_size, TCB_FLAG_TTYPE_KERNEL);
}
diff --git a/arch/sim/src/sim/up_internal.h b/arch/sim/src/sim/up_internal.h
index 307d7aa..7506d19 100644
--- a/arch/sim/src/sim/up_internal.h
+++ b/arch/sim/src/sim/up_internal.h
@@ -165,16 +165,15 @@ void sim_sigdeliver(void);
#ifdef CONFIG_SMP
void sim_cpu0_start(void);
+int sim_cpu_start(int cpu, void *stack, size_t size);
+void sim_send_ipi(int cpu);
#endif
/* up_smpsignal.c ***********************************************************/
#ifdef CONFIG_SMP
void up_cpu_started(void);
-int up_cpu_paused(int cpu);
-struct tcb_s *up_this_task(void);
int up_cpu_set_pause_handler(int irq);
-void sim_send_ipi(int cpu);
#endif
/* up_oneshot.c *************************************************************/
diff --git a/arch/sim/src/sim/up_simsmp.c b/arch/sim/src/sim/up_simsmp.c
index 90ff1cb..e91917f 100644
--- a/arch/sim/src/sim/up_simsmp.c
+++ b/arch/sim/src/sim/up_simsmp.c
@@ -260,17 +260,12 @@ int up_cpu_index(void)
*
****************************************************************************/
-int up_cpu_start(int cpu)
+int sim_cpu_start(int cpu, void *stack, size_t size)
{
struct sim_cpuinfo_s cpuinfo;
+ pthread_attr_t attr;
int ret;
-#ifdef CONFIG_SCHED_INSTRUMENTATION
- /* Notify of the start event */
-
- sched_note_cpu_start(up_this_task(), cpu);
-#endif
-
/* Initialize the CPU info */
cpuinfo.cpu = cpu;
@@ -283,11 +278,13 @@ int up_cpu_start(int cpu)
* in a multi-CPU hardware model.
*/
+ pthread_attr_init(&attr);
+ pthread_attr_setstack(&attr, stack, size);
ret = pthread_create(&g_cpu_thread[cpu],
- NULL, sim_idle_trampoline, &cpuinfo);
+ &attr, sim_idle_trampoline, &cpuinfo);
+ pthread_attr_destroy(&attr);
if (ret != 0)
{
- ret = -ret; /* REVISIT: That is a host errno value. */
goto errout_with_cond;
}
diff --git a/arch/sim/src/sim/up_smpsignal.c b/arch/sim/src/sim/up_smpsignal.c
index cad6cca..249bbc6 100644
--- a/arch/sim/src/sim/up_smpsignal.c
+++ b/arch/sim/src/sim/up_smpsignal.c
@@ -233,16 +233,43 @@ void up_cpu_started(void)
}
/****************************************************************************
- * Name: up_this_task
+ * Name: up_cpu_start
*
* Description:
- * Return the currrent task tcb.
+ * In an SMP configution, only one CPU is initially active (CPU 0). System
+ * initialization occurs on that single thread. At the completion of the
+ * initialization of the OS, just before beginning normal multitasking,
+ * the additional CPUs would be started by calling this function.
+ *
+ * Each CPU is provided the entry point to is IDLE task when started. A
+ * TCB for each CPU's IDLE task has been initialized and placed in the
+ * CPU's g_assignedtasks[cpu] list. A stack has also been allocateded and
+ * initialized.
+ *
+ * The OS initialization logic calls this function repeatedly until each
+ * CPU has been started, 1 through (CONFIG_SMP_NCPUS-1).
+ *
+ * Input Parameters:
+ * cpu - The index of the CPU being started. This will be a numeric
+ * value in the range of from one to (CONFIG_SMP_NCPUS-1). (CPU
+ * 0 is already active)
+ *
+ * Returned Value:
+ * Zero on success; a negated errno value on failure.
*
****************************************************************************/
-struct tcb_s *up_this_task(void)
+int up_cpu_start(int cpu)
{
- return this_task();
+ FAR struct tcb_s *tcb = current_task(cpu);
+
+#ifdef CONFIG_SCHED_INSTRUMENTATION
+ /* Notify of the start event */
+
+ sched_note_cpu_start(this_task(), cpu);
+#endif
+
+ return sim_cpu_start(cpu, tcb->stack_base_ptr, tcb->adj_stack_size);
}
/****************************************************************************
diff --git a/sched/Kconfig b/sched/Kconfig
index 4f694be..c14a088 100644
--- a/sched/Kconfig
+++ b/sched/Kconfig
@@ -1800,6 +1800,7 @@ config DEFAULT_TASK_STACKSIZE
config IDLETHREAD_STACKSIZE
int "Idle thread stack size"
+ default DEFAULT_TASK_STACKSIZE if ARCH_SIM
default 1024
---help---
The size of the initial stack used by the IDLE thread. The IDLE thread