57 lines
2.7 KiB
Markdown
57 lines
2.7 KiB
Markdown
| Supported Targets | ESP32 | ESP32-C5 | ESP32-C61 | ESP32-H4 | ESP32-P4 | ESP32-S2 | ESP32-S3 | ESP32-S31 |
|
|
| ----------------- | ----- | -------- | --------- | -------- | -------- | -------- | -------- | --------- |
|
|
|
|
# FreeRTOS PSRAM Stack Example
|
|
|
|
(See the README.md file in the upper level `examples` directory for more information about examples.)
|
|
|
|
This example demonstrates `CONFIG_FREERTOS_PLACE_TASK_STACKS_IN_EXT_RAM`, which causes `xTaskCreate()` and `xTaskCreatePinnedToCore()` to allocate task stacks from PSRAM by default (with internal RAM as a fallback). TCBs are always kept in internal DRAM.
|
|
|
|
It also shows how to use the `esp_flash_dispatcher` component so that flash operations called from PSRAM-stacked tasks remain safe.
|
|
|
|
Any code path that disables the cache (flash erase/write, OTA, NVS) must run on a task whose stack is in internal RAM, or must go through `esp_flash_dispatcher`.
|
|
|
|
## What is being demonstrated
|
|
|
|
1. Three worker tasks are created with `xTaskCreate()`. Each task prints the address of a local variable to confirm its stack resides in PSRAM.
|
|
2. Each worker calls `esp_partition_read()` from its PSRAM stack. The `esp_flash_dispatcher` component intercepts the call and executes it on a dedicated internal-RAM task, avoiding a crash when the cache is temporarily disabled.
|
|
|
|
## How to use example
|
|
|
|
### Hardware Required
|
|
|
|
A board with a PSRAM-capable SoC: ESP32-S2, ESP32-S3, or ESP32-P4.
|
|
|
|
### Configure the project
|
|
|
|
```
|
|
idf.py menuconfig
|
|
```
|
|
|
|
The `sdkconfig.defaults` already enables `CONFIG_SPIRAM`, `CONFIG_FREERTOS_TASK_CREATE_ALLOW_EXT_MEM`, and `CONFIG_FREERTOS_PLACE_TASK_STACKS_IN_EXT_RAM`. No additional configuration is required.
|
|
|
|
### Build and Flash
|
|
|
|
```
|
|
idf.py build flash monitor
|
|
```
|
|
|
|
### Example output
|
|
|
|
```
|
|
I (xxx) psram_stack: Initialising flash dispatcher (routes flash ops off PSRAM-stacked tasks)
|
|
I (xxx) psram_stack: worker[0]: stack @ 0x3c0xxxxx -> PSRAM
|
|
I (xxx) psram_stack: worker[0]: flash read OK (first bytes: e9 04 ...)
|
|
I (xxx) psram_stack: worker[1]: stack @ 0x3c0xxxxx -> PSRAM
|
|
I (xxx) psram_stack: worker[1]: flash read OK (first bytes: e9 04 ...)
|
|
I (xxx) psram_stack: worker[2]: stack @ 0x3c0xxxxx -> PSRAM
|
|
I (xxx) psram_stack: worker[2]: flash read OK (first bytes: e9 04 ...)
|
|
I (xxx) psram_stack: Example complete
|
|
```
|
|
|
|
## Further reading
|
|
|
|
- `CONFIG_FREERTOS_PLACE_TASK_STACKS_IN_EXT_RAM` in `menuconfig → Component config → FreeRTOS → Extra`
|
|
- [External RAM](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-guides/external-ram.html) — limitations of tasks with PSRAM stacks
|
|
- `espressif/esp_flash_dispatcher` on the [ESP Component Registry](https://components.espressif.com/components/espressif/esp_flash_dispatcher)
|