Understanding FreeRTOS RAM Architecture and Demo Application

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.

1. FreeRTOS BSP

1.1. 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.

1.2. 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.

2. FreeRTOS Demo Application

2.1. 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.

2.2. 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

3. 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.

4. FreeRTOS Memory Architecture

4.1. 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

4.2. 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

4.3. 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.