Multicore and OpenAMP

By Colin Walls

Embedded Software Technologist

January 27, 2021


Multicore and OpenAMP

Every embedded system is different. And so, as multicore designs become increasingly common, almost to the point of being mainstream, different hardware and software architectures are evolving.

From the software perspective, there are broadly two options: Symmetrical MultiProcessing (SMP) and Asymmetrical MultiProcessing (AMP).

An SMP system can only be implemented on a homogeneous multicore platform (i.e., all the cores are identical). A single instance of an operating system runs across all the cores. This OS needs to be a specific variant that supports SMP operation. SMP is supported by Linux and a number of real-time operating system products. Tasks are distributed across the cores automatically. However, there may be an option to lock tasks to specific cores, if that is required for a particular application. The objective of SMP is to increase available processing performance in a power-efficient manner and is very commonly found on desktop and laptop computers.

For embedded applications, AMP provides more flexibility and is, hence, much more common. In an AMP system, each core runs its own operating system (or may run no OS at all – “bare metal”). There is no requirement for the OSes to be identical. Each OS may be selected according to the intended functionality of the core and it does not need to be a special, “multicore-enabled” version. Unlike SMP, AMP does not require all the cores to be identical; it may be implemented on a heterogeneous multicore platform. Most multicore system-on-chip devices include a variety of core architectures. Different core architectures may be suitable for different parts of the application.

There are two matters that need to be resolved in an AMP design: life-cycle management (boot sequence etc.) and inter-core communications. These issues do not arise in an SMP system as the OS has control over which tasks run where and when and inter-task communication uses the standard OS APIs – the tasks do not need to “know” they are running in a multicore context. In an AMP system, each OS is unaware of the existence of the others, so specific provision must be made.

The best way to configure an AMP system is to use some kind of multicore framework to address the control and communication requirements. OpenAMP is a standard that defines the architecture of such a framework; implementations of OpenAMP are available from a number of vendors.


An instance of the framework runs on each core. Life-cycle management is provided by using Remoteproc, where one core is designated as the “master”. Inter-core communication is managed using RPMsg which provides a channel-based bidirectional communication link between cores.

An alternative to using a multicore framework is to deploy a hypervisor. This is a powerful option but is limited by its requirement that all CPUs are identical and, hence, it can only be used on a homogeneous multicore platform. However, in a complex multicore system, there may be groups of identical cores that can be managed using an SMP operating system or a hypervisor, linked to the rest of the system using a multicore framework.

My work in the electronics industry spans nearly 40 years, almost exclusively with embedded software. I began developing software and managing teams of developers.Then, I moved to customer roles, including pre-and-post sales technical support, sales management and marketing. I have presented at numerous conferences, including Design West, Design East, Embedded World, ARM TechCon, and my work frequently appears on

More from Colin