Multicore and OpenAMP
January 27, 2021
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.