Merge branch 'bugfix/fix_atomics_incompatibility_cpp' into 'main'

fix: atomics incompatibility cpp

See merge request idf/esp-modbus!169
This commit is contained in:
Alex Lisitsyn
2026-04-08 08:57:18 +01:00
3 changed files with 22 additions and 3 deletions
+1 -1
View File
@@ -13,7 +13,7 @@
#endif
// Workaround for atomics incompatibility issue under CPP.
#if defined(__cplusplus) && (ESP_IDF_VERSION <= ESP_IDF_VERSION_VAL(5, 0, 0))
#if defined(__cplusplus)
#include <atomic>
#define _Atomic(T) std::atomic<T>
#define atomic_int int
@@ -1,9 +1,12 @@
set(PROJECT_NAME "mb_serial_cpp")
idf_component_register(SRCS "serial_test.cpp"
REQUIRES esp-modbus nvs_flash esp_event esp_timer lwip
REQUIRES esp-modbus esp_common nvs_flash esp_event esp_timer lwip
INCLUDE_DIRS ".")
# Explicitly use C++17 so we can get std::atomic support for the workaround in mb_port_types.h
target_compile_features(${COMPONENT_LIB} PUBLIC cxx_std_17)
# Workaround to avoid static analysis false positives for some components.
if(CONFIG_FMB_COMPILER_STATIC_ANALYZER_ENABLE AND CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_compile_options(${COMPONENT_LIB} PRIVATE "-fanalyzer")
@@ -1,13 +1,17 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "esp_log.h"
#include "esp_system.h"
#include "sdkconfig.h"
#include "mbcontroller.h"
#include "esp_idf_version.h"
#include "mb_port_types.h" // atomic layout and C++ compatibility
#define TEST_PORT_NUM (uart_port_t)1
#define TEST_SPEED 115200
@@ -167,8 +171,20 @@ static_assert(
"CPP atomic int types are not layout compatible with int"
);
static int check_atomic_cpp_instantiation(void)
{
// Check atomic support: mb_uid_info_t.state is _Atomic(int) in C, std::atomic<int> in C++
mb_uid_info_t addr_info = {};
addr_info.index = 1;
atomic_store(&(addr_info.state), 23);
return atomic_load(&addr_info.state);
}
extern "C" void app_main(void)
{
ESP_LOGI(TAG, "mb_port_types.h C++ atomics test passed (IDF compatible), %d, %d, %s",
check_atomic_cpp_instantiation(), (int)ESP_IDF_VERSION, esp_get_idf_version());
// Initialization of device peripheral and objects
ESP_LOGI(TAG, "Setup master cpp....");
ESP_ERROR_CHECK(master_serial_init(&pmaster_handle));