Initially, ESP-IDF used the do_global_ctors() function to run global
constructors. This was done to accommodate Xtensa targets that emit
.ctors.* sections, which are ordered in descending order.
For RISC-V, compilation used .init_array.* sections, which are designed
to have ascending order. Priority constructors in .init_array.* sections
were correctly processed in ascending order. However, non-priority
.init_array section was processed in descending order, as it was done
for Xtensa .ctors.
Starting with ESP-IDF v6.0, the implementation switched to the standard
LibC behavior (__libc_init_array()), which processes both priority and
non-priority constructors in ascending order.
To achieve this, a breaking changes were introduced:
- Xtensa .ctors.* priority entries converted to .init_array.* format
(ascending), to be passed to __libc_init_array().
- Processing order of non-priority .init_array and .ctors sections was
changed from descending to ascending.
Also, this change introduces .preinit_array for linking. This may be
needed for some C++ or sanitizer features.
Related to https://github.com/espressif/esp-idf/issues/15529
Examples
This directory contains a range of example ESP-IDF projects. These examples are intended to demonstrate parts of the ESP-IDF functionality, and to provide code that you can copy and adapt into your own projects.
Example Layout
The examples are grouped into subdirectories by category. Each category directory contains one or more example projects:
bluetooth/bluedroidClassic BT, BLE and coex examples using default Bluedroid host stack.bluetooth/nimbleBLE examples using NimBLE host stack.bluetooth/esp_ble_meshESP BLE Mesh examples.bluetooth/hciHCI transport (VHCI and HCI UART) examples.build_systemExamples of build system features.cxxC++ language utilization examples and experimental components.ethernetEthernet network examples.get-startedSimple examples with minimal functionality. Good start point for beginners.ieee802154IEEE802.15.4 examples.meshWi-Fi Mesh examples.networkExamples related to general network environment, test & analysis.openthreadOpenThread examples.peripheralsExamples showing driver functionality for the various onboard ESP32 peripherals.protocolsExamples showing network protocol interactions.provisioningWi-Fi provisioning examples.securityExamples about security features.storageExamples showing data storage methods using SPI flash, external storage like the SD/MMC interface and flash partitioning.systemDemonstrates some internal chip features, or debugging & development tools.wifiAdvanced Wi-Fi features (For network protocol examples, seeprotocolsinstead.)ZigbeeZigbee network and device examples.
In addition to these examples, commmon_components directory contains code shared by several examples.
Using Examples
Before building an example, follow the ESP-IDF Getting Started to ensure you have the required development environment.
Set Chip Target
First of all, your target must be supported by both:
- By your ESP-IDF version: For the full list of supported targets, run:
idf.py --list-targets - By this example: For the full list of supported targets, refer to the supported targets table at the top of this README.
After you make sure that your target is supported, go to your example project directory and set the chip target:
idf.py set-target <target>
For example, to set esp32 as the chip target, run:
idf.py set-target esp32
Configure the Project
For information about Kconfig options, see Project Configuration.
To conveniently check or modify Kconfig options for this example in a project configuration menu, run:
idf.py menuconfig
Build and Flash
Execute the following command to build the project, flash it to your development board, and run the monitor tool to view the serial output:
idf.py build flash monitor
This command can be reduced to idf.py flash monitor.
If the above command fails, check the log on the serial monitor which usually provides information on the possible cause of the issue.
To exit the serial monitor, use Ctrl + ].
Running Test Python Script (pytest)
Some of the examples have pytest_....py scripts that are using the pytest as the test framework. For detailed information, please refer to the "Run the Tests Locally" Section under ESP-IDF tests in Pytest documentation
Using pytest is the recommended way to write new tests. We will migrate all the example test scripts to this new framework soon.
Copying Examples
Each example is a standalone project. The examples do not have to be inside the esp-idf directory. You can copy an example directory to anywhere on your computer in order to make a copy that you can modify and work with.
The IDF_PATH environment variable is the only thing that connects the example to the rest of ESP-IDF.
If you're looking for a more bare-bones project to start from, try esp-idf-template.
Further Development
For further steps on how to develop a project, see the following:
- Managing the project:
- IDF Frontend document
- ESP-IDF Getting Started video (YouTube, bilibili)
- Overview of an example project
- Build System document
- Writing code:
- Write your own code following the API references
Contributing Examples
If you have a new example you think we'd like, please consider sending it to us as a Pull Request.
In the ESP-IDF documentation, you can find a "Creating Examples" page which lays out the steps to creating a top quality example.