On 20/02/2014 12:42 am, Sebastian Huber wrote:
+/**
+ * @brief State of a processor.
+ *
+ * @dot
+ * digraph states {
+ *   bi [label="PER_CPU_STATE_BEFORE_INITIALIZATION"];
+ *   rsm [label="PER_CPU_STATE_READY_TO_START_MULTITASKING"];
+ *   sm [label="PER_CPU_STATE_START_MULTITASKING"];
+ *   ds [label="PER_CPU_STATE_DO_SHUTDOWN"];
+ *   u [label="PER_CPU_STATE_UP"];
+ *   s [label="PER_CPU_STATE_SHUTDOWN"];
+ *   bi -> rsm [label="secondary processor\ncompleted initialization"];
+ *   bi -> u [label="main processor\nstarts multitasking"];
+ *   rsm -> sm [label="main processor\ncompleted initialization"];
+ *   rsm -> ds [label="a fatal error occurred"];
+ *   ds -> s [label="do shutdown\nstate observed"];
+ *   sm -> u [label="secondary processor\nstarts multitasking"];
+ *   u -> s [label="shutdown initiated"];
+ * }
+ * @enddot

I do not see sm to ds if the main core goes to s after going from bi to u ?

I also see u to s and not to ds; why as the state is called "do shutdown" ? Should this state be PER_CPU_STATE_SHUTTING_DOWN ?

I do not see why we have main and secondary processors ? This is symmetric multiprocessing which means each core is the same therefore capable of completing any required task. I understand there are paths which need to complete so if we have states for these phases as gates then any processor that arrives should be able to enter the gate (spinning lock for those that need to wait) and complete the work. This means a degraded state can exist and things at least start. The application would need to detect and manage the degraded state and so RTEMS should not be concerned with this condition other than doing its best to run where possible.

I assume if we have n cores where n is 1..cpus available we enter the static constructors once and 'main' [1] once and this independent of the number of defined and/or operating cores. If an application's static constructor starts further threads it needs to manage the concurrency issues and main is only entered once.

[1] I am not concerned with the Classic API init task tables with more than one init task and what happens with static constructors as this is not defined by any standard. I will never directly use init task tables because it is not portable. All we can do is make sure static constructors and destructors are only called once.

+ *
+ * The values are chosen to stop the wait for change in case an alternative
 ... to and wait ... ?
+ * state change occurs during _Per_CPU_Wait_for_state().

Chris
_______________________________________________
rtems-devel mailing list
rtems-devel@rtems.org
http://www.rtems.org/mailman/listinfo/rtems-devel

Reply via email to