zephyr/samples/application_development/code_relocation_nocopy/README.rst

47 lines
1.6 KiB
ReStructuredText
Raw Normal View History

code_relocation: Add NOCOPY feature * Use case of interest: Some platforms are shipping in parallel to the internal FLASH some other storage / external FLASH (usually a QSPI FLASH) that can be used to execute (XIP) code from. The content of this external FLASH can usually be written at flash time using proper tools (see for example the case of the external FLASH on the nRF5340DK that can be written at flash time using nrfjprog). The external FLASH is a nice addition that is extremely useful when a large application code doesn't entirely fit on the internal FLASH so that we could want to move part of it in the auxiliary FLASH to XIP the code from there. * The problem: Right now Zephyr doesn't have a formal and generic way to move at build time part of the code to a different memory region. * The current status: Zephyr is indeed shipping a code_relocation feature but that doesn't entirely match our needs. When XIP is enabled, the code_relocation feature is used in Zephyr to move the selected code (that is to copy text section, to initialize data and zero bss) from FLASH to SRAM at run time and execute code from SRAM. The relocation is done by a generated snippet of code that is memcpy()-ing the right content to the destination region also using some build-time generated portions of linker script to retrieve start and destination addresses and regions. * This patch: This patch is leveraging the code_relocation code and adding a NOCOPY feature. This feature is using the code_relocation feature to dynamically build the linker script snippets but entirely skipping the run-time code relocation so that the code can be XIP-ed from the destination region. * Example: Let's say that we have a big file called `huge_file.c` that we want to XIP from the external FLASH that is mapped in an EXTFLASH region. In this case we should enable `CONFIG_XIP` and `CONFIG_CODE_DATA_RELOCATION` and instruct cmake as follows: zephyr_code_relocate(src/huge_file.c EXTFLASH_TEXT NOCOPY) zephyr_code_relocate(src/huge_file.c SRAM_DATA) this means that: - The .text section of the `huge_file.c` must reside in the EXTFLASH memory region and we do not need to copy the section there because we are going to XIP it (and we assume that the file is going to be placed in the external FLASH at flash time). - The .data section of the `huge_file.c` must still reside in the SRAM memory region. * TODOs: It's desirable to have the possibility to relocate libraries and pre-build files instead of source code files. Signed-off-by: Carlo Caione <ccaione@baylibre.com>
2022-02-16 04:18:50 +08:00
.. _code_relocation_nocopy:
Code relocation nocopy
######################
Overview
********
A simple example that demonstrates how relocation of code, data or bss sections
using a custom linker script.
Differently from the code relocation sample, this sample is relocating the
content of the ext_code.c file to a different FLASH section and the code is XIP
directly from there without the need to copy / relocate the code.
nRF5340dk platform instructions
*******************************
The nRF5340 PDK has a 64 Mb external flash memory supporting Quad SPI. It is
possible to do XIP from the external flash memory.
The external flash memory is mapped to 0x10000000.
In this sample we relocate some of the code to the external flash memory with
the remaining Zephyr kernel in the internal flash.
Compile the code:
$ west build -b nrf5340dk_nrf5340_cpuapp samples/application_development/code_relocation_nocopy --pristine
Get the HEX file from the ELF:
$ arm-linux-gnueabihf-objcopy -O ihex build/zephyr/zephyr.elf zephyr.hex
Erase the external FLASH (just to be sure):
$ nrfjprog --qspicustominit --qspieraseall
Write the HEX to internal and external FLASH:
$ nrfjprog --coprocessor CP_APPLICATION --sectorerase --qspisectorerase --program zephyr.hex
Execution output:
*** Booting Zephyr OS build v3.0.0-rc3-25-g0df32cec1ff2 ***
Address of main function 0x4f9
Address of function_in_ext_flash 0x10000001
Address of var_ext_sram_data 0x200000a0 (10)
Address of function_in_sram 0x20000001
Address of var_sram_data 0x200000a4 (10)
Hello World! nrf5340dk_nrf5340_cpuapp