| .. _mem_domain_apis_test: |
| |
| Memory Domain APIs Test |
| ####################### |
| |
| Overview |
| ******** |
| |
| This is a simple application that demonstrates the usage of Memory Domain APIs. |
| Two memory domains (app0_domain and app1_domain) and three application threads |
| (app thread 0, 1, 2) are created by the main thread. |
| These threads will yield their execution alternately and we can observe the |
| changes of domain partition regions during context switch via the serial console. |
| |
| Building and Running |
| ******************** |
| |
| This project can be built and executed as follows: |
| |
| .. code-block:: console |
| |
| $ cd samples/mpu/mem_domain_apis_test |
| $ make BOARD=frdm_k64f |
| |
| Connect the board to your host computer using the USB port. |
| Flash the generated zephyr.bin on the board. |
| Reset the board and you will see messages on the corresponding |
| Serial Port. |
| |
| Sample Output |
| ============= |
| |
| In the beginning, main thread adds app threads into specific memory domains. |
| |
| .. code-block:: console |
| |
| ***** BOOTING ZEPHYR OS v1.9.0 - BUILD: Sep 20 2017 11:07:53 ***** |
| initialize memory domains |
| add app thread 0 (0x20000280) into app0_domain. |
| add app thread 1 (0x200002f8) into app1_domain. |
| add app thread 2 (0x20000370) into app0_domain. |
| |
| After main thread yields its execution, we can see app thread 0 starts and the |
| domain partition regions are set according to the memory partitions of app0_domain. |
| |
| .. code-block:: console |
| |
| main thread (0x200000c0) yields. |
| [general] [DBG] arm_core_mpu_configure: Region info: 0x20000600 0x400 |
| [general] [DBG] _region_init: [4] 0x20000000 0x200005ff 0x0079e79e 0x00000001 |
| [general] [DBG] _region_init: [7] 0x20000600 0x2000061f 0x0071c71c 0x00000001 |
| [general] [DBG] _region_init: [11] 0x20000620 0x2002ffff 0x0079e79e 0x00000001 |
| [general] [DBG] configure_mpu_mem_domain: configure thread 0x20000280's domain |
| [general] [DBG] arm_core_mpu_configure_mem_domain: configure domain: 0x20000440 |
| [general] [DBG] arm_core_mpu_configure_mem_domain: set region 0x8 0x20000420 0x20 |
| [general] [DBG] _region_init: [8] 0x20000420 0x2000043f 0x0079e79e 0x00000001 |
| [general] [DBG] arm_core_mpu_configure_mem_domain: set region 0x9 0x20000400 0x20 |
| [general] [DBG] _region_init: [9] 0x20000400 0x2000041f 0x00514514 0x00000001 |
| [general] [DBG] arm_core_mpu_configure_mem_domain: disable region 0xa |
| app thread 0 (0x20000280) starts. |
| |
| Then, app thread 0 yields its execution and app thread 1 is going to be switched in. |
| We can see the domain partition regions are set according to the memory partitions of |
| app1_domain. |
| |
| .. code-block:: console |
| |
| app thread 0 (0x20000280) yields. |
| [general] [DBG] arm_core_mpu_configure: Region info: 0x20000a20 0x400 |
| [general] [DBG] _region_init: [4] 0x20000000 0x20000a1f 0x0079e79e 0x00000001 |
| [general] [DBG] _region_init: [7] 0x20000a20 0x20000a3f 0x0071c71c 0x00000001 |
| [general] [DBG] _region_init: [11] 0x20000a40 0x2002ffff 0x0079e79e 0x00000001 |
| [general] [DBG] configure_mpu_mem_domain: configure thread 0x200002f8's domain |
| [general] [DBG] arm_core_mpu_configure_mem_domain: configure domain: 0x2000050c |
| [general] [DBG] arm_core_mpu_configure_mem_domain: set region 0x8 0x20000400 0x20 |
| [general] [DBG] _region_init: [8] 0x20000400 0x2000041f 0x0079e79e 0x00000001 |
| [general] [DBG] arm_core_mpu_configure_mem_domain: set region 0x9 0x20000420 0x20 |
| [general] [DBG] _region_init: [9] 0x20000420 0x2000043f 0x00514514 0x00000001 |
| [general] [DBG] arm_core_mpu_configure_mem_domain: disable region 0xa |
| app thread 1 (0x200002f8) starts. |