From cbd634a261ea046ead41acdd24ea164ecbdcb091 Mon Sep 17 00:00:00 2001 From: Alexander Bobkov Date: Tue, 5 Aug 2025 00:42:37 -0400 Subject: [PATCH] FreeRTOS --- .../I2C_MultiDevice/.devcontainer/Dockerfile | 13 ++++ .../.devcontainer/devcontainer.json | 21 +++++++ .../I2C_MultiDevice/CMakeLists.txt | 6 ++ ESP32-IDF_FreeRTOS/I2C_MultiDevice/README.md | 53 +++++++++++++++++ .../I2C_MultiDevice/main/CMakeLists.txt | 3 + .../I2C_MultiDevice/main/hello_world_main.c | 52 ++++++++++++++++ .../I2C_MultiDevice/pytest_hello_world.py | 59 +++++++++++++++++++ .../I2C_MultiDevice/sdkconfig.ci | 0 8 files changed, 207 insertions(+) create mode 100644 ESP32-IDF_FreeRTOS/I2C_MultiDevice/.devcontainer/Dockerfile create mode 100644 ESP32-IDF_FreeRTOS/I2C_MultiDevice/.devcontainer/devcontainer.json create mode 100644 ESP32-IDF_FreeRTOS/I2C_MultiDevice/CMakeLists.txt create mode 100644 ESP32-IDF_FreeRTOS/I2C_MultiDevice/README.md create mode 100644 ESP32-IDF_FreeRTOS/I2C_MultiDevice/main/CMakeLists.txt create mode 100644 ESP32-IDF_FreeRTOS/I2C_MultiDevice/main/hello_world_main.c create mode 100644 ESP32-IDF_FreeRTOS/I2C_MultiDevice/pytest_hello_world.py create mode 100644 ESP32-IDF_FreeRTOS/I2C_MultiDevice/sdkconfig.ci diff --git a/ESP32-IDF_FreeRTOS/I2C_MultiDevice/.devcontainer/Dockerfile b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/.devcontainer/Dockerfile new file mode 100644 index 000000000..dafb8adbb --- /dev/null +++ b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/.devcontainer/Dockerfile @@ -0,0 +1,13 @@ +ARG DOCKER_TAG=latest +FROM espressif/idf:${DOCKER_TAG} + +ENV LC_ALL=C.UTF-8 +ENV LANG=C.UTF-8 + +RUN apt-get update -y && apt-get install udev -y + +RUN echo "source /opt/esp/idf/export.sh > /dev/null 2>&1" >> ~/.bashrc + +ENTRYPOINT [ "/opt/esp/entrypoint.sh" ] + +CMD ["/bin/bash", "-c"] \ No newline at end of file diff --git a/ESP32-IDF_FreeRTOS/I2C_MultiDevice/.devcontainer/devcontainer.json b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/.devcontainer/devcontainer.json new file mode 100644 index 000000000..b80178618 --- /dev/null +++ b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/.devcontainer/devcontainer.json @@ -0,0 +1,21 @@ +{ + "name": "ESP-IDF QEMU", + "build": { + "dockerfile": "Dockerfile" + }, + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.defaultProfile.linux": "bash", + "idf.espIdfPath": "/opt/esp/idf", + "idf.toolsPath": "/opt/esp", + "idf.gitPath": "/usr/bin/git" + }, + "extensions": [ + "espressif.esp-idf-extension", + "espressif.esp-idf-web" + ] + } + }, + "runArgs": ["--privileged"] +} \ No newline at end of file diff --git a/ESP32-IDF_FreeRTOS/I2C_MultiDevice/CMakeLists.txt b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/CMakeLists.txt new file mode 100644 index 000000000..0ba749986 --- /dev/null +++ b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(I2C_MultiDevice) diff --git a/ESP32-IDF_FreeRTOS/I2C_MultiDevice/README.md b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/README.md new file mode 100644 index 000000000..c3e1ee394 --- /dev/null +++ b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/README.md @@ -0,0 +1,53 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | Linux | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | ----- | + +# Hello World Example + +Starts a FreeRTOS task to print "Hello World". + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +## How to use example + +Follow detailed instructions provided specifically for this example. + +Select the instructions depending on Espressif chip installed on your development board: + +- [ESP32 Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/stable/get-started/index.html) +- [ESP32-S2 Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/get-started/index.html) + + +## Example folder contents + +The project **hello_world** contains one source file in C language [hello_world_main.c](main/hello_world_main.c). The file is located in folder [main](main). + +ESP-IDF projects are built using CMake. The project build configuration is contained in `CMakeLists.txt` files that provide set of directives and instructions describing the project's source files and targets (executable, library, or both). + +Below is short explanation of remaining files in the project folder. + +``` +├── CMakeLists.txt +├── pytest_hello_world.py Python script used for automated testing +├── main +│ ├── CMakeLists.txt +│ └── hello_world_main.c +└── README.md This is the file you are currently reading +``` + +For more information on structure and contents of ESP-IDF projects, please refer to Section [Build System](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html) of the ESP-IDF Programming Guide. + +## Troubleshooting + +* Program upload failure + + * Hardware connection is not correct: run `idf.py -p PORT monitor`, and reboot your board to see if there are any output logs. + * The baud rate for downloading is too high: lower your baud rate in the `menuconfig` menu, and try again. + +## Technical support and feedback + +Please use the following feedback channels: + +* For technical queries, go to the [esp32.com](https://esp32.com/) forum +* For a feature request or bug report, create a [GitHub issue](https://github.com/espressif/esp-idf/issues) + +We will get back to you as soon as possible. diff --git a/ESP32-IDF_FreeRTOS/I2C_MultiDevice/main/CMakeLists.txt b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/main/CMakeLists.txt new file mode 100644 index 000000000..d1acf9e51 --- /dev/null +++ b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "hello_world_main.c" + PRIV_REQUIRES spi_flash + INCLUDE_DIRS "") diff --git a/ESP32-IDF_FreeRTOS/I2C_MultiDevice/main/hello_world_main.c b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/main/hello_world_main.c new file mode 100644 index 000000000..7010f3ef6 --- /dev/null +++ b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/main/hello_world_main.c @@ -0,0 +1,52 @@ +/* + * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include +#include +#include "sdkconfig.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_chip_info.h" +#include "esp_flash.h" +#include "esp_system.h" + +void app_main(void) +{ + printf("Hello world!\n"); + + /* Print chip information */ + esp_chip_info_t chip_info; + uint32_t flash_size; + esp_chip_info(&chip_info); + printf("This is %s chip with %d CPU core(s), %s%s%s%s, ", + CONFIG_IDF_TARGET, + chip_info.cores, + (chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "", + (chip_info.features & CHIP_FEATURE_BT) ? "BT" : "", + (chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "", + (chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4 (Zigbee/Thread)" : ""); + + unsigned major_rev = chip_info.revision / 100; + unsigned minor_rev = chip_info.revision % 100; + printf("silicon revision v%d.%d, ", major_rev, minor_rev); + if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) { + printf("Get flash size failed"); + return; + } + + printf("%" PRIu32 "MB %s flash\n", flash_size / (uint32_t)(1024 * 1024), + (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external"); + + printf("Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size()); + + for (int i = 10; i >= 0; i--) { + printf("Restarting in %d seconds...\n", i); + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + printf("Restarting now.\n"); + fflush(stdout); + esp_restart(); +} diff --git a/ESP32-IDF_FreeRTOS/I2C_MultiDevice/pytest_hello_world.py b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/pytest_hello_world.py new file mode 100644 index 000000000..3524fd949 --- /dev/null +++ b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/pytest_hello_world.py @@ -0,0 +1,59 @@ +# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 +import hashlib +import logging +from typing import Callable + +import pytest +from pytest_embedded_idf.dut import IdfDut +from pytest_embedded_qemu.app import QemuApp +from pytest_embedded_qemu.dut import QemuDut + + +@pytest.mark.supported_targets +@pytest.mark.preview_targets +@pytest.mark.generic +def test_hello_world( + dut: IdfDut, log_minimum_free_heap_size: Callable[..., None] +) -> None: + dut.expect('Hello world!') + log_minimum_free_heap_size() + + +@pytest.mark.linux +@pytest.mark.host_test +def test_hello_world_linux(dut: IdfDut) -> None: + dut.expect('Hello world!') + + +@pytest.mark.linux +@pytest.mark.host_test +@pytest.mark.macos_shell +def test_hello_world_macos(dut: IdfDut) -> None: + dut.expect('Hello world!') + + +def verify_elf_sha256_embedding(app: QemuApp, sha256_reported: str) -> None: + sha256 = hashlib.sha256() + with open(app.elf_file, 'rb') as f: + sha256.update(f.read()) + sha256_expected = sha256.hexdigest() + + logging.info(f'ELF file SHA256: {sha256_expected}') + logging.info(f'ELF file SHA256 (reported by the app): {sha256_reported}') + + # the app reports only the first several hex characters of the SHA256, check that they match + if not sha256_expected.startswith(sha256_reported): + raise ValueError('ELF file SHA256 mismatch') + + +@pytest.mark.esp32 # we only support qemu on esp32 for now +@pytest.mark.host_test +@pytest.mark.qemu +def test_hello_world_host(app: QemuApp, dut: QemuDut) -> None: + sha256_reported = ( + dut.expect(r'ELF file SHA256:\s+([a-f0-9]+)').group(1).decode('utf-8') + ) + verify_elf_sha256_embedding(app, sha256_reported) + + dut.expect('Hello world!') diff --git a/ESP32-IDF_FreeRTOS/I2C_MultiDevice/sdkconfig.ci b/ESP32-IDF_FreeRTOS/I2C_MultiDevice/sdkconfig.ci new file mode 100644 index 000000000..e69de29bb