Understanding FreeRTOS RAM Architecture and Demo Application Print

 

The STM32H7 BSP comes with a demo FreeRTOS application, specially developed for the STM32H7 SOM and Starter Kit. This application note explains the architecture and use of the demo application.

FreeRTOS BSP


FreeRTOS Version

Emcraft provides a FreeRTOS BSP specifically ported, optimized and otherwise enhanced for the STM32H750 system-on-module. The FreeRTOS BSP is based on FreeRTOS V10.3.1. This version of FreeRTOS is available for download from the following location: https://github.com/FreeRTOS/FreeRTOS/tree/V10.3.1. FreeRTOS source files are located in the following sub-tree: Middlewares/Third_Party/FreeRTOS.


STM32Cube HAL

The integral part of the FreeRTOS BSP is the ST's STM32CubeH7 software, which is integrated (linked together) with the FreeRTOS BSP build. STM32CubeH7 provides a HAL (Hardware Abstraction Layer) as well as device drivers and software APIs for various I/O interfaces of the STM32H7.

In the FreeRTOS source tree, the STM32CubeH7 HAL component resides in the following sub-tree:Drivers/STM32H7xx_HAL_Driver.


FreeRTOS Demo Application


FreeRTOS Demo App Source Files

The FreeRTOS BSP comes with a FreeRTOS demo application illustrating and validating the software features supported by the BSP. The FreeRTOS demo application is integrated (linked together) with the FreeRTOS BSP build.

In the FreeRTOS source tree, the FreeRTOS demo application resides in the following sub-tree: Projects/STM32H7_SOM/Applications/FreeRTOS/freertos_stm32h750.


FreeRTOS Demo App Tasks

The FreeRTOS demo application implements several threads (FreeRTOS tasks) running in parallel. These threads are as follows:

Thread Location in Source Tree Comments
Main Thread freertos_stm32h750/Src/main.c, vCommandConsoleTask() Main FreeRTOS thread, which starts the other threads, and then runs the FreeRTOS CLI (Command Line Interface) on the serial console
WDT Thread freertos_stm32h750/Src/wdt_test.c, wdt_task() Strobes the WDT
LED Thread freertos_stm32h750/Src/gpio_test.c, gpio_test_led() Blinks the on-module and on-carrier LEDs
Push-Buttons Thread freertos_stm32h750/Src/gpio_test.c, gpio_test_buttons() Monitors the on-carrier user buttons; when a button has been pressed or released, reports the push-button state change
Timer Thread freertos_stm32h750/Src/tim_test.c, tim_task() Counting number of Timer interrupts
GUI Thread freertos_stm32h750/Src/gui.c, gui_ts_main() Implements a GUI interface on the LCD display, with touch screen, using the UI stack
WiFi Thread freertos_stm32h750/Src/wifiesp_click_test.c, wifiesp_task() Implements a sample TCP server utilizing the WiFi ESP Click board, using the WiFi ESP Click driver


FreeRTOS Boot Up

The U-Boot loader makes use of the bootcmd environment variable to automatically execute commands during startup. The default value of bootcmd is implemented in such a way that the FreeRTOS application image is loaded from QSPIFlash and started by calling the FreeRTOS app entry point.


FreeRTOS Memory Architecture


Running FreeRTOS BSP from External SDRAM

The default configuration of the FreeRTOS BSP is to run from external SDRAM of the STM32H7 module. To achieve that, the FreeRTOS BSP must be be linked using the freertos_stm32h750_sdram.ld script.

In this configuration, the FreeRTOS BSP makes use of external SDRAM, as follows:

Section Cache Attribute Location and Size
Display frame buffer Non-cached 0xD0000000, 4MB

Reserved SDRAM storage Cached 0xD0400000, 2MB

FreeRTOS run-time memory Cached 0xD0600000, 24MB or 56MB, for 32MB and 64MB SDRAM configurations, respectively
U-Boot (callable by FreeRTOS for UBI/UBIFS services) Cached Last 2MB of SDRAM


Allocation of the logical FreeRTOS software sections in SDRAM is as follows:

Section Description Location and Size
.text FreeRTOS code SDRAM, size is defined by a specific FreeRTOS application
.rodata FreeRTOS read-only data SDRAM, size is defined by a specific FreeRTOS application
.data FreeRTOS initialized read-write data SDRAM, size is defined by a specific FreeRTOS application
.bss FreeRTOS non-initialized read-write data SDRAM, size is defined by a specific FreeRTOS application
Stack FreeRTOS stack DTCMRAM, size is 0x400, grows upwards
Task Stack FreeRTOS task stack SDRAM, size is defined by a specific FreeRTOS application
Heap FreeRTOS heap SDRAM, size is defined at build time as configTOTAL_HEAP_SIZE
UBIFS ABI table Table of UBI/UBIFS ABI entry points provided by U-Boot for RTOS ICTM, 0x00000000, 1KB


Running FreeRTOS BSP from Internal SRAM

Another supported option is to run the FreeRTOS BSP out of internal SRAM. In this option, the FreeRTOS BSP and demo application make use of the internal SRAM of the STM32H7 to perform critical OS code and store OS data. The internal SRAM has L1-cache level performance, it is the fastest memory that is available on the STM32H750 System-on-Module. To achieve this option, the FreeRTOS BSP must be be linked using the freertos_stm32h750_sram.ld script.

The FreeRTOS BSP makes use of the following SRAM regions:

DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
RAM_D1 (xrw) : ORIGIN = 0x24000000, LENGTH = 512K

Allocation of the logical FreeRTOS software sections in SRAM is as follows:

Section Description Location and Size
.text FreeRTOS code RAM_D1, size is defined by a specific FreeRTOS application
.rodata FreeRTOS read-only data RAM_D1, size is defined by a specific FreeRTOS application
.data FreeRTOS initialized read-write data DTCMRAM, size is defined by a specific FreeRTOS application
.bss FreeRTOS non-initialized read-write data RAM_D1, size is defined by a specific FreeRTOS application
Stack FreeRTOS stack DTCMRAM, size is 0x400, grows upwards
Task Stack FreeRTOS task stack RAM_D1, size is defined by a specific FreeRTOS application
Heap FreeRTOS heap RAM_D1, size is defined at build time as configTOTAL_HEAP_SIZE
UBIFS ABI table Table of UBI/UBIFS ABI entry points provided by U-Boot for RTOS ICTM, 0x00000000, 1KB


Additionally, the FreeRTOS BSP makes use of external SDRAM, as follows:

Section Cache Attribute Location and Size
Display frame buffer Non-cached 0xD0000000, 4MB
General SDRAM storage (used for graphical assets, large application code, etc) Cached 0xD0400000, 26MB or 58MB, for 32MB and 64MB SDRAM configurations of the System-on-Module, respectively
U-Boot (callable by FreeRTOS for UBI/UBIFS services) Cached Last 2MB of SDRAM


SDRAM CLI Commands

The FreeRTOS demo application implements the following SDRAM related CLI command:

Command Description Comments
sdram_test <ptrn> <size> Write a certain ptrn to a size region in SDRAM, starting at 4MB offset, validate that the read-back data matches the pattern written. Command completes silently, unless an error is detected.