Frantisek Hrbata 1c92945f59 change(examples): switch examples to use a minimal build
Currently, several example dependencies rely on the fact that all
registered components are added to the build, along with components
specified in common requirements. This results in longer build times
because even unused components must be built. Switch all examples to use
idf_minimal_build to compile only the components actually required by
the example.

Signed-off-by: Frantisek Hrbata <frantisek.hrbata@espressif.com>
2024-11-20 20:14:40 +01:00
..

Supported Targets ESP32 ESP32-S3

IPC ISR Example

This example demonstrates how to use the IPC ISR feature (which allows an IPC to run in the context of a High Priority Interrupt). The level of the IPC ISR interrupt depends on the CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL option. The IPC ISR feature can be useful in cases where users need to quickly get the state of the other CPU (consult the IPC documentation). The asm_funcs.S file contains the callback that will be run on the other core. The callback should be fairly simple and must be entirely in assembly.

The first assembly callback get_ps_other_cpu() demonstrates a callback that simply returns the PS register of other core.

The second assembly callback extended_ipc_isr_asm() demonstrates a more complex callback that uses a buffer (provided as the callback's argument) to save some registers and return multiple values from the callback. The callback's void *arg points to a buffer containing the following:

  • uint32_t regs[]; that gives the callback an area to save some of the CPUs registers. Saving the registers gives the callback more scratch registers to use.
  • uint32_t in[]; that gives the callback multiple input arguments
  • uint32_t out[]; that gives the callback multiple output arguments

The extended_ipc_isr_asm() callback will simply save/restore registers to/from regs[], then use the arguments passed by in[] to do some work, then write the results to out[].

How to use example

Hardware Required

Example should be able to run on any commonly available ESP32 development board. The chip should have two cores.

Configure the project

  • CONFIG_FREERTOS_UNICORE - disabled,
  • CONFIG_ESP_IPC_ISR_ENABLE - enabled.
idf.py menuconfig

Build and Flash

idf.py build flash monitor

(To exit the serial monitor, type Ctrl-].)

See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects.

Example output

I (304) example: Start
I (304) example: call get_ps_other_cpu
I (314) example: PS_INTLEVEL = 0x5
I (314) example: PS_EXCM = 0x0
I (324) example: PS_UM = 0x1
I (324) example: call extended_ipc_isr_asm
I (324) example: in[0] = 0x1
I (334) example: in[1] = 0x2
I (334) example: in[2] = 0x3
I (334) example: out[0] = (in[0] | in[1] | in[2]) = 0x3
I (344) example: out[1] = (in[0] + in[1] + in[2]) = 0x6
I (354) example: out[2] = in[2] = 0x3
I (354) example: out[3] = PS of other cpu = 0x25
I (364) example: End