### Introduction
The central part of an MCU+ SDK multi-core application is the **System Project**. In this module, you will learn how to use the System Project and how to add it to your application to help with multi-core development.
A System Project is a CCS project that has a special file: the `system.xml` file. The `system.xml` file opens up the **Systems Settings Editor** which is the one central place where much of the system configuration and settings are kept. It allows the user to map single-core projects to device cores, to define the relationships between single-core CCS projects, and to specify system-wide pre-build and post-build steps.
In this module we will be starting with single-core Empty template projects and creating a system project.
### Import the Empty Example Projects
First, let's import the 2 Empty example projects to use as part of the system project.
#### a. In CCS, go to *View → Resource Explorer* to open Resource Explorer
#### b. Go to *MCU+ SDK for {Device} → Examples → {Board} → empty → r5fss0-0_nortos → empty*
#### c. Click the **Import** icon at the top-right to import the project to CCS
#### d. Go to *MCU+ SDK for {Device} → Examples → {Board} → empty → r5fss1-0_nortos → empty*
#### e. Click the **Import** icon at the top-right to import the project to CCS
### Create a New System Project
#### **Step 1:** Open the New CCS Project wizard and select your device - the same device as the single-core projects.
#### **Step 2:** Specify the **Project name**
#### **Step 3:** Set the Output type as **System**
#### **Step 4:** Click **Finish**
![New System Project](./resources/system_new_project.png)
#### Once the project is created, the **System Settings Editor** will automatically appear
### Exploring the System Settings Editor
Now that the Empty system project and the dependent single-core Empty projects are in your workspace, let's take a look at the System Settings Editor.
Open (double-click) the `system.xml` file to open the System Settings Editor.
The System Settings Editor contains three views: **System Settings**, **Build Settings**, and **Source**
#### System Settings View
The **System Settings** tab shows all cores present on the device and allows you to map single-core CCS projects to each core.
![System Settings Editor](./resources/system_editor.png)
#### Build Settings View
The **Build Settings** tab allows you to specify system-wide pre-build and post-build steps. The pre-build and post-build steps that are defined here will be applied to each single-core project that is mapped in the **System Settings** view.
![System Build Settings](./resources/system_build_settings.png)
#### Source View
The **Source** view contains the source of the system settings and build settings. The user is not expected to modify this view directly.
![System Source View](./resources/system_source_view.png)
### Map Projects to Cores
#### **Step 1:** In the System Settings Editor, select a core from the **Device Cores** view
#### **Step 2:** Select a project from the dropdown menu of the **Project Configuration** view to map it to the selected core
**Note:** The single-core project and system project need to be the same device variant for the project to show up in the drop-down menu.
![System Build Settings](./resources/system_map_core.png)
#### **(Optional)** You can also create a new CCS project using the **New CCS Project Wizard** by clicking "New..." instead of mapping to an existing project
#### When a project is mapped to a core, the project name will appear to the right of the core in the System Settings Editor.
![Mapped Projects](./resources/mapped_projects.png)
### Configuring Shared Memory
When working with a multi-core application that is loaded into shared RAM, you will need to ensure the applications' memory placement does not overlap. This can be done in each project's linker command file.
For example, the R5 linker command files of the Empty multi-core example each reserve their own unique 256KB section of MSRAM as shown in the code snippets below.
```c
/* when using multi-core applications make sure
* this memory does not overlap with other R5F's
*/
MSRAM : ORIGIN = 0x70080000 , LENGTH = 0x40000
```
```c
/* when using multi-core applications, make sure
* this memory does not overlap with other R5F's
*/
MSRAM : ORIGIN = 0x700C0000 , LENGTH = 0x40000
```
```c
/* when using multi-core applications, make sure
* this memory does not overlap with other R5F's
*/
MSRAM : ORIGIN = 0x70100000 , LENGTH = 0x40000
```
```c
/* when using multi-core applications, make sure
* this memory does not overlap with other R5F's
*/
MSRAM : ORIGIN = 0x70140000 , LENGTH = 0x40000
```
### System Projects and SysConfig
When you map two or more projects in the **System Settings Editor**, the SysConfig GUI of a mapped project will display a tab for each core of that system. The SysConfig solver will also solve and report resource conflicts for the entire system.
![System Build Settings](./resources/syscfg_multicore_tabs.gif)
### Building and Running a System Project
#### **Step 1:** Select the system project and click **Debug**. CCS will build all of the projects in the system and load them onto the cores.
#### **Step 2:** Select a core and click **Resume (F8)** to run the program. Repeat for other cores in the system.
### []{ } Knowledge Check
**1. Select all that apply:** The `system.xml` file allows users to
[quiz_multi]
v map projects to specific cores of a device --> Correct!
x manage shared memory placement --> Incorrect
v apply system-wide pre- and post-build steps --> Correct!
[quiz_multi]
**2. True or False:** A system project can map projects to cores on a different device.
[quiz]
x True --> Incorrect
v False --> Correct!
[quiz]
**3. True or False:** When importing a system project, the dependent single-core projects are also imported.
[quiz]
v True --> Correct!
x False --> Incorrect
[quiz]
{{r> [Back to Home](../overview.html)}}
{{r **Was this helpful? Let us know here:** [mcu_plus_academy_feedback@list.ti.com](mailto:mcu_plus_academy_feedback@list.ti.com)}}