Symmetric Multiprocessing (SMP) Application

According to Wikipedia: “Symmetric multiprocessing (SMP) involves a symmetric multiprocessor system hardware and software architecture where two or more identical processors connect to a single, shared main memory, have full access to all I/O devices, and are controlled by a single operating system instance that treats all processors equally, reserving none for special purposes. Most multiprocessor systems today use an SMP architecture. In the case of multi-core processors, the SMP architecture applies to the cores, treating them as separate processors.

“SMP systems are tightly coupled multiprocessor systems with a pool of homogeneous processors running independently, each processor executing different programs and working on different data and with capability of sharing common resources (memory, I/O device, interrupt system and so on) and connected using a system bus or a crossbar.”

For a technical description of the NuttX implementation of SMP, see the NuttX SMP Wiki Page.

spinlock_t up_testset(FAR volatile spinlock_t *lock)

Perform and atomic test and set operation on the provided spinlock.

Parameters:
  • lock – The address of spinlock object.

Returns:

The spinlock is always locked upon return. The value of previous value of the spinlock variable is returned, either SP_LOCKED if the spinlock was previously locked (meaning that the test-and-set operation failed to obtain the lock) or SP_UNLOCKED if the spinlock was previously unlocked (meaning that we successfully obtained the lock)

int up_cpu_index(void)

Return an index in the range of 0 through (CONFIG_SMP_NCPUS-1) that corresponds to the currently executing CPU.

Returns:

An integer index in the range of 0 through (CONFIG_SMP_NCPUS-1) that corresponds to the currently executing CPU.

int up_cpu_start(int cpu)

In an SMP configuration, 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 allocated and initialized.

The OS initialization logic calls this function repeatedly until each CPU has been started, 1 through (CONFIG_SMP_NCPUS-1).

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).

Returns:

Zero (OK) is returned on success; a negated errno value on failure.

int up_cpu_pause(int cpu)

Save the state of the current task at the head of the g_assignedtasks[cpu] task list and then pause task execution on the CPU.

This function is called by the OS when the logic executing on one CPU needs to modify the state of the g_assignedtasks[cpu] list for another CPU.

Parameters:
  • cpu – The index of the CPU to be paused. This will not be the index of the currently executing CPU.

Returns:

Zero (OK) is returned on success; a negated errno value on failure.

int up_cpu_resume(int cpu)

Restart the cpu after it was paused via up_cpu_pause(), restoring the state of the task at the head of the g_assignedtasks[cpu] list, and resume normal tasking.

This function is called after up_cpu_pause() in order resume operation of the CPU after modifying its g_assignedtasks[cpu] list.

Parameters:
  • cpu – The index of the CPU being resumed. This will not be the index of the currently executing CPU.

Returns:

Zero (OK) is returned on success; a negated errno value on failure.