From 22d25647d474ddc2175f62c932231af5ed13185c Mon Sep 17 00:00:00 2001 From: Alejandro Casanova Date: Tue, 19 May 2026 23:21:18 +0200 Subject: [PATCH 1/9] fix some typos and add alt text in chapter 10 examples --- examples/chapter10_08/readme.md | 11 ++++++----- examples/chapter10_08a/readme.md | 15 ++++++++------- examples/chapter10_09/readme.md | 10 +++++----- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/examples/chapter10_08/readme.md b/examples/chapter10_08/readme.md index 1947327e6..561157a86 100644 --- a/examples/chapter10_08/readme.md +++ b/examples/chapter10_08/readme.md @@ -1,9 +1,10 @@ # Example Chapter10_08 (advanced level) + ## External SPI RAM and Computing 10,001 Digits of Pi

- - + + godbolt

This advanced example extends available RAM via SPI SRAM chips. @@ -134,7 +135,7 @@ These 8-pin SRAM chips are straightforward to use. They are controlled with easy-to-understand commands that execute read/write operations in either single byte sequences or small page bursts. A lightweight communication class -called `mcal::memroy::sram::memory_sram_microchip_23lc1024` +called `mcal::memory::sram::memory_sram_microchip_23lc1024` that is used to control the SRAM chips can be found in the file [mcal_memory_sram_microchip_23lc1024.h](./src/mcal/avr/mcal_memory_sram_microchip_23lc1024.h) @@ -165,9 +166,9 @@ Pinning in this example is summarized in the table below. The hardware setup is pictured in the image below with an oscilloscope measurement in action. -![](./images/board10_08.jpg) +![Hardware Setup](./images/board10_08.jpg) The PWM signal representing calculation progress is shown below. The PWM signal has a frequency of approximately $2~\text{kHz}$. -![](./images/scope10_08.jpg) +![View of PWM signal on oscilloscope](./images/scope10_08.jpg) diff --git a/examples/chapter10_08a/readme.md b/examples/chapter10_08a/readme.md index 39401eb14..982669506 100644 --- a/examples/chapter10_08a/readme.md +++ b/examples/chapter10_08a/readme.md @@ -1,4 +1,5 @@ # Example Chapter10_08a (advanced level) + ## Parallel SRAM and Computing 100,001 Digits of Pi This advanced example picks up on the idea of the previous Example Chapter10_08 @@ -30,12 +31,12 @@ Care needs to be taken to wire the parallel SRAM brick properly (as shown below). When the hardware setup is correct, however, it is actually relatively straightforward (although definitely requires careful attention to detail) -to write a prallel SRAM driver for the 8-bit MCU. +to write a parallel SRAM driver for the 8-bit MCU. The results of these activities are expressed in the template classes -`mcal::memroy::sram::memory_sram_parallel_cypress_cy62158e` +`mcal::memory::sram::memory_sram_parallel_cypress_cy62158e` and -`mcal::memroy::sram::memory_sram_parallel_cypress_cy62167gn` +`mcal::memory::sram::memory_sram_parallel_cypress_cy62167gn` found in the files [mcal_memory_sram_parallel_cypress_cy62158e.h](./src/mcal/avr/mcal_memory_sram_parallel_cypress_cy62158e.h) and @@ -89,7 +90,7 @@ This increases quadratically with increasing number of decimal digits targeted in a given calculation. Although we're not intending to break any super-computing -performace or speed records with the 8-bit MCU hooked up +performance or speed records with the 8-bit MCU hooked up to external parallel SRAM, the advantage of parallel port access can be noticed. Indeed, in this setup, the $1,001$ @@ -130,7 +131,7 @@ or the $2~\text{MByte}$ brick. The pin connections of the $2~\text{MByte}$ memory brick of type Cypress(R) MoBL(R) CY62167GN in 48-pin TSOP -are shown in the table below. The pinnning has +are shown in the table below. The pinning has been selected with certain considerations in mind that make the software driver for the memory brick more straightforward and less complicated to write. @@ -194,11 +195,11 @@ read/write operations on the driver level. The hardware setup with the $2~\text{MByte}$ SRAM brick is pictured in the image below. -![](./images/board10_08a_2MB.jpg) +![2MByte Hardware Setup](./images/board10_08a_2MB.jpg) ### 1MB Setup The hardware setup with the $1~\text{MByte}$ SRAM brick is pictured in the image below. -![](./images/board10_08a_1MB.jpg) +![1MByte Hardware Setup](./images/board10_08a_1MB.jpg) diff --git a/examples/chapter10_09/readme.md b/examples/chapter10_09/readme.md index 7590996b3..4cfa31c5b 100644 --- a/examples/chapter10_09/readme.md +++ b/examples/chapter10_09/readme.md @@ -1,4 +1,5 @@ # Example Chapter10_09 (advanced level) + ## 100,001 Digits of Pi on Raspberry Pi(R) This advanced example ports the Pi Spigot @@ -21,7 +22,7 @@ in this example. It can be found in identically the same form as that which has been used in Examples Chapter10_08 and 10_08a. The single-board computer is operated OS-less in _bare-metal_ mode with no input or output device. -Real-time afficionados will relish the eloquent, efficient, terse, +Real-time aficionados will relish the eloquent, efficient, terse, manually-written startup sequence and memory-access optimization code. A skinny MCAL layer provides the needed peripheral abstractions for timer, port I/O driver, etc. @@ -220,7 +221,7 @@ are used to connect the single-board computer to power, ground and the necessary logic peripherals. Power and ground lines have double and quadruple strands of skinny wire in order to reduce parasitic dissipation -in the currrent-carrying lines. +in the current-carrying lines. The logic gate sharpens port output signal edges and performs the conversion from $3.3~\text{V}$ CMOS to $5~\text{V}$ TTL. @@ -256,8 +257,7 @@ Pinning in this example is summarized in the table below. | 27 | GPA_6 | LCD R/W | | 28 | GPA_7 | LCD E | - The hardware setup with the RpiZero in action calculating -$100,001$ decimal digits of $\pi$ is pictured in the image below. +$100,001$ decimal digits of $\pi$ is pictured in the image below. -![](./images/board10_09.jpg) +![Hardware Setup with RpiZero](./images/board10_09.jpg) From 9c3ba63f623b50ec29f8a8f87e3d4483133c86cd Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Thu, 21 May 2026 11:37:50 +0200 Subject: [PATCH 2/9] Add (but not yet in CI) std-big-int bench --- .../workflows/real-time-cpp-benchmarks.yml | 16 +-- .github/workflows/real-time-cpp.yml | 2 +- ref_app/ref_app.vcxproj | 5 +- ref_app/ref_app.vcxproj.filters | 3 + ref_app/src/app/benchmark/app_benchmark.cpp | 4 + ref_app/src/app/benchmark/app_benchmark.h | 4 + .../src/app/benchmark/app_benchmark_crc.cpp | 2 +- .../benchmark/app_benchmark_std_big_int.cpp | 115 ++++++++++++++++++ .../benchmark/app_benchmark_std_big_int_.cpp | 75 ++++++++++++ .../functions/math_functions_hypergeometric.h | 4 +- ref_app/src/util/memory/util_ring_allocator.h | 100 ++++++++------- ref_app/target/app/make/app_files.gmk | 3 +- .../micros/stm32f446/make/stm32f446_flags.gmk | 2 +- .../stm32f446/make/stm32f446_with_stdlib.ld | 2 +- 14 files changed, 278 insertions(+), 59 deletions(-) create mode 100644 ref_app/src/app/benchmark/app_benchmark_std_big_int.cpp create mode 100644 ref_app/src/app/benchmark/app_benchmark_std_big_int_.cpp diff --git a/.github/workflows/real-time-cpp-benchmarks.yml b/.github/workflows/real-time-cpp-benchmarks.yml index 7b6608f5d..de55d90fc 100644 --- a/.github/workflows/real-time-cpp-benchmarks.yml +++ b/.github/workflows/real-time-cpp-benchmarks.yml @@ -1,5 +1,5 @@ ############################################################################## -# Copyright Christopher Kormanyos 2021 - 2025. +# Copyright Christopher Kormanyos 2021 - 2026. # Distributed under the Boost Software License, # Version 1.0. (See accompanying file LICENSE_1_0.txt # or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -286,14 +286,14 @@ jobs: wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libncursesw5_6.3-2ubuntu0.1_amd64.deb sudo apt install ./libncursesw5_6.3-2ubuntu0.1_amd64.deb mkdir -p emu_env && cd emu_env - wget --no-check-certificate https://developer.arm.com/-/media/Files/downloads/gnu/13.3.rel1/binrel/arm-gnu-toolchain-13.3.rel1-x86_64-arm-none-eabi.tar.xz - tar -xf arm-gnu-toolchain-13.3.rel1-x86_64-arm-none-eabi.tar.xz - wget --no-check-certificate https://github.com/xpack-dev-tools/qemu-arm-xpack/releases/download/v8.2.6-1/xpack-qemu-arm-8.2.6-1-linux-x64.tar.gz - tar -xzf xpack-qemu-arm-8.2.6-1-linux-x64.tar.gz + wget --no-check-certificate https://developer.arm.com/-/media/Files/downloads/gnu/15.2.rel1/binrel/arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi.tar.xz + tar -xf arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi.tar.xz + wget --no-check-certificate https://github.com/xpack-dev-tools/qemu-arm-xpack/releases/download/v9.2.4-1/xpack-qemu-arm-9.2.4-1-linux-x64.tar.gz + tar -xzf xpack-qemu-arm-9.2.4-1-linux-x64.tar.gz working-directory: ./ref_app/ - name: build benchmark_single-stm32f429 run: | - PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/arm-gnu-toolchain-13.3.rel1-x86_64-arm-none-eabi/bin:$PATH" + PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi/bin:$PATH" echo 'Query arm-none-eabi-g++ version' echo arm-none-eabi-g++ -v @@ -305,14 +305,14 @@ jobs: working-directory: ./ref_app/ - name: emulate-target stm32f429 run: | - PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/xpack-qemu-arm-8.2.6-1/bin:$PATH" + PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/xpack-qemu-arm-9.2.4-1/bin:$PATH" qemu-system-gnuarmeclipse --verbose --mcu STM32F429ZI --nographic --gdb tcp::9999 -d unimp,guest_errors & sleep 2 working-directory: ./ref_app/ - name: run-test-on-target run: | sleep 2 - PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/arm-gnu-toolchain-13.3.rel1-x86_64-arm-none-eabi/bin:$PATH" + PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi/bin:$PATH" echo 'Run test on target' echo arm-none-eabi-gdb ./bin/app_benchmark_crc.elf -x ./target/build/test_app_benchmarks_emulator.gdb > ./app_benchmark_crc.txt diff --git a/.github/workflows/real-time-cpp.yml b/.github/workflows/real-time-cpp.yml index d4bcbb186..491cf5c89 100644 --- a/.github/workflows/real-time-cpp.yml +++ b/.github/workflows/real-time-cpp.yml @@ -318,7 +318,7 @@ jobs: fetch-depth: '0' - uses: ilammy/msvc-dev-cmd@v1 with: - toolset: 14.2 + toolset: 14.4 - name: msvc-msbuild-${{ matrix.suite }} run: | MSBuild -m ref_app.sln -p:Configuration=${{ matrix.suite }} -p:Platform=x64 /t:Rebuild diff --git a/ref_app/ref_app.vcxproj b/ref_app/ref_app.vcxproj index e5d74e585..beca71fcc 100644 --- a/ref_app/ref_app.vcxproj +++ b/ref_app/ref_app.vcxproj @@ -79,7 +79,7 @@ Level3 ProgramDatabase 4351;4646;4996 - stdcpplatest + stdcpp23 @@ -104,7 +104,7 @@ Level3 ProgramDatabase 4351;4646;4996 - stdcpplatest + stdcpp23 @@ -208,6 +208,7 @@ + diff --git a/ref_app/ref_app.vcxproj.filters b/ref_app/ref_app.vcxproj.filters index 4b0018f4e..2578913a7 100644 --- a/ref_app/ref_app.vcxproj.filters +++ b/ref_app/ref_app.vcxproj.filters @@ -1402,6 +1402,9 @@ src\mcal\esp32p4_riscv_soc + + src\app\benchmark + diff --git a/ref_app/src/app/benchmark/app_benchmark.cpp b/ref_app/src/app/benchmark/app_benchmark.cpp index 5ccc73435..e8eb34d3c 100644 --- a/ref_app/src/app/benchmark/app_benchmark.cpp +++ b/ref_app/src/app/benchmark/app_benchmark.cpp @@ -124,6 +124,10 @@ auto app::benchmark::task_func() -> void const bool result_is_ok = app::benchmark::run_boost_crypt_hasher(); + #elif (defined(APP_BENCHMARK_TYPE) && (APP_BENCHMARK_TYPE == APP_BENCHMARK_TYPE_STD_BIG_INT)) + + const bool result_is_ok = app::benchmark::run_std_big_int(); + #endif // Set the benchmark port pin level to low. diff --git a/ref_app/src/app/benchmark/app_benchmark.h b/ref_app/src/app/benchmark/app_benchmark.h index 5876ffbc0..cd2b3d64d 100644 --- a/ref_app/src/app/benchmark/app_benchmark.h +++ b/ref_app/src/app/benchmark/app_benchmark.h @@ -34,6 +34,7 @@ #define APP_BENCHMARK_TYPE_NON_STD_DECIMAL 21 #define APP_BENCHMARK_TYPE_PI_AGM_100 22 #define APP_BENCHMARK_TYPE_BOOST_CRYPT_HASHER 23 + #define APP_BENCHMARK_TYPE_STD_BIG_INT 24 //#define APP_BENCHMARK_TYPE APP_BENCHMARK_TYPE_NONE //#define APP_BENCHMARK_TYPE APP_BENCHMARK_TYPE_COMPLEX @@ -59,6 +60,7 @@ //#define APP_BENCHMARK_TYPE APP_BENCHMARK_TYPE_NON_STD_DECIMAL //#define APP_BENCHMARK_TYPE APP_BENCHMARK_TYPE_PI_AGM_100 //#define APP_BENCHMARK_TYPE APP_BENCHMARK_TYPE_BOOST_CRYPT_HASHER + //#define APP_BENCHMARK_TYPE APP_BENCHMARK_TYPE_STD_BIG_INT #if !defined(APP_BENCHMARK_TYPE) #define APP_BENCHMARK_TYPE APP_BENCHMARK_TYPE_NONE @@ -112,6 +114,8 @@ auto run_non_std_decimal() -> bool; #elif (APP_BENCHMARK_TYPE == APP_BENCHMARK_TYPE_BOOST_CRYPT_HASHER) auto run_boost_crypt_hasher() -> bool; + #elif (APP_BENCHMARK_TYPE == APP_BENCHMARK_TYPE_STD_BIG_INT) + auto run_std_big_int() -> bool; #else #error APP_BENCHMARK_TYPE is undefined. #endif diff --git a/ref_app/src/app/benchmark/app_benchmark_crc.cpp b/ref_app/src/app/benchmark/app_benchmark_crc.cpp index 7cb92a8db..4ee64a8f0 100644 --- a/ref_app/src/app/benchmark/app_benchmark_crc.cpp +++ b/ref_app/src/app/benchmark/app_benchmark_crc.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Copyright Christopher Kormanyos 2007 - 2019. +// Copyright Christopher Kormanyos 2007 - 2026. // Distributed under the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt // or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/ref_app/src/app/benchmark/app_benchmark_std_big_int.cpp b/ref_app/src/app/benchmark/app_benchmark_std_big_int.cpp new file mode 100644 index 000000000..1acca7c6c --- /dev/null +++ b/ref_app/src/app/benchmark/app_benchmark_std_big_int.cpp @@ -0,0 +1,115 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2026. +// Distributed under the Boost Software License, +// Version 1.0. (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include + +#if (defined(APP_BENCHMARK_TYPE) && (APP_BENCHMARK_TYPE == APP_BENCHMARK_TYPE_STD_BIG_INT)) + +#include + +#include // This includes the entire std-big-int library + +#include +#include +#include + +static auto do_one_test() -> bool; + +static auto do_one_test() -> bool +{ + using allocator_type = util::ring_allocator; + + using wi_type = beman::big_int::basic_big_int::digits, allocator_type>; + + using wi_result_type = wi_type; + + wi_type wi_val_a {}; + wi_type wi_val_b {}; + wi_result_type wi_val_ctrl {}; + + constexpr const char str_a[] = "fee6f3060ed3f90fdd79fe414418f8d9dc08bbe4470b658ca8f167fc3ce48821a79f8f9df51d795cbb88cb6e3a5e5f46b56f06991d6a929784b414c0bff17ca7eef9ab0e4d469093c548018d66a349beda36a4afdeb9d329d4119e93fa436a2b8417c3b2af701dde827e01e608c3ddfedfdc7fd7052fda87efb34d8321f3941482bc74e109ebdff9aebc9585de04ab47afb41ccbda18d806eb3d87ed7b1c0f03954ef98f08432db8f86e4ebceb292c53ac83f9738f8cd88da17384cdfb31d25bf6e030571d52ac43a7c646dee1fc0a8d827d73917b3c5f84dc7d1515a0c9a1bef3dc7f9d8caed3b3db7c869e262860a4e008c12d5f3da2c733c0f55168a30be2"; + constexpr const char str_b[] = "d7f1c5ebfe9108ab8900f3d1af36367cce3e92121acb9b60e352e5d622525715d0203ddd77d9ab308709777b225948c3e61542010fe75974ddb38cc38a11fa65bee2a6f171fe7ee4e52d81569bfcb886f972bd4655b6388bc7c8982f6e6a31efc21f8579394b5e629c15c367ee6eda6091dcb0f8aea6daa69f9c7059e585fc92a28c16d16183b8b0edf460b9741b712a9aaaf9d557ae4a7ef5cead986e9c414988b5fc43d78d8f7fbbc7f6cfd7e08bf8f87ce6f865b9ad1fcf4b00f42939349398c4a2928c21959ff6105665de3d95be8afc9fe9fb33d6afb95948e9778328fdd7172c70431479229cae5a47463f832b9ca2a39f36963f3ec1dc39fe6a3bffbc"; + constexpr const char str_ctrl[] = "d704b29793a64a44339b92e4f202801cae2ca252f899cf36ae3735c98505f4c16a7a6a159e54e8927d4ec95defd8ec04afcc0043bdab50dfc763b376549ab90df60d476bd5b26c3f5b2378656fe307f7da459b62924efa9f6d408484a44a88265515b04f1d75351ba7e6436cdf6d67a87c82dbacb02f782f1601feb974d10367e275561904466d31daf817f350752636455bf7f6f86f21268bf173182e430fdeb80fbc96daf032ec381f761476b8bf2cc33d6ec7d67d96eb69fef2bce4c715e4d676b8c2066afa83f10243273f5c65b427e71eaee89d285f39692e757cb6b86a085e7869ef85c05155328130e37163b8addb3410ccd9fde92fcc5e8a9b3336113440f34e3ace928c98de63d02c0caa1c160cfb8ccf46d48bdf9ebd24f5611582d92cf787e02198e7bebc83bd9eae8bd63c5b74573a2923146d05e92211baecb7fb4d7408d31cdccdfdeca05c0c4085775a510f4bed924ebd69e6c4e34c3c6ecb3de0ff2187affe6bffaa1d73df44d730668318922a3077232dab4575a64e8a7958301ce2e341a146f758fc51d7e25298545a6b277b1a9cd9ea72def76d7c05ea5a17ba501050106ff8042f0ffea4c97193b0b8ad138e315d7cd09179d55782534c96b32f21d808e0764b3a341ccc1c20543da2ef9620a5c877fa330bfc43556ddf8069c3fa04e3081b699b8673346f82d112c49bf17fa7c52cc9fbbe91a8d7f8"; + + const auto fc_result_a{ from_chars(str_a, str_a + std::strlen(str_a), wi_val_a, 16) }; + const auto fc_result_b{ from_chars(str_b, str_b + std::strlen(str_b), wi_val_b, 16) }; + const auto fc_result_ctrl{ from_chars(str_ctrl, str_ctrl + std::strlen(str_ctrl), wi_val_ctrl, 16) }; + + static_cast(fc_result_a); + static_cast(fc_result_b); + static_cast(fc_result_ctrl); + + const wi_result_type wi_val_c { wi_val_a * wi_val_b }; + + const bool result_is_ok { (wi_val_ctrl == wi_val_c) }; + + return result_is_ok; +} + +auto app::benchmark::run_std_big_int() -> bool +{ + const bool result_is_ok { ::do_one_test() }; + + return result_is_ok; +} + +#if defined(APP_BENCHMARK_STANDALONE_MAIN) +constexpr auto app_benchmark_standalone_foodcafe = static_cast(UINT32_C(0xF00DCAFE)); + +extern "C" +{ + extern volatile std::uint32_t app_benchmark_standalone_result; + + auto app_benchmark_run_standalone () -> bool; + auto app_benchmark_get_standalone_result() -> bool; + + auto app_benchmark_run_standalone() -> bool + { + auto result_is_ok = true; + + for(unsigned i = 0U; i < 64U; ++i) + { + result_is_ok &= app::benchmark::run_std_big_int(); + } + + app_benchmark_standalone_result = + static_cast + ( + result_is_ok ? app_benchmark_standalone_foodcafe : static_cast(UINT32_C(0xFFFFFFFF)) + ); + + return result_is_ok; + } + + auto app_benchmark_get_standalone_result() -> bool + { + volatile auto result_is_ok = + (app_benchmark_standalone_result == static_cast(UINT32_C(0xF00DCAFE))); + + return result_is_ok; + } +} + +ATTRIBUTE(used) auto main() -> int; + +auto main() -> int +{ + auto result_is_ok = true; + + result_is_ok = (::app_benchmark_run_standalone () && result_is_ok); + result_is_ok = (::app_benchmark_get_standalone_result() && result_is_ok); + + return (result_is_ok ? 0 : -1); +} + +extern "C" +{ + volatile std::uint32_t app_benchmark_standalone_result; +} +#endif + +#endif // APP_BENCHMARK_TYPE_STD_BIG_INT diff --git a/ref_app/src/app/benchmark/app_benchmark_std_big_int_.cpp b/ref_app/src/app/benchmark/app_benchmark_std_big_int_.cpp new file mode 100644 index 000000000..3319e30ba --- /dev/null +++ b/ref_app/src/app/benchmark/app_benchmark_std_big_int_.cpp @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2026. +// Distributed under the Boost Software License, +// Version 1.0. (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include + +#if (defined(APP_BENCHMARK_TYPE) && (APP_BENCHMARK_TYPE == APP_BENCHMARK_TYPE_STD_BIG_INT)) + +//#include + +//#include // This includes the entire std-big-int library + +auto app::benchmark::run_std_big_int() -> bool +{ + #if 0 + constexpr const char str_a[] = "fee6f3060ed3f90fdd79fe414418f8d9dc08bbe4470b658ca8f167fc3ce48821a79f8f9df51d795cbb88cb6e3a5e5f46b56f06991d6a929784b414c0bff17ca7eef9ab0e4d469093c548018d66a349beda36a4afdeb9d329d4119e93fa436a2b8417c3b2af701dde827e01e608c3ddfedfdc7fd7052fda87efb34d8321f3941482bc74e109ebdff9aebc9585de04ab47afb41ccbda18d806eb3d87ed7b1c0f03954ef98f08432db8f86e4ebceb292c53ac83f9738f8cd88da17384cdfb31d25bf6e030571d52ac43a7c646dee1fc0a8d827d73917b3c5f84dc7d1515a0c9a1bef3dc7f9d8caed3b3db7c869e262860a4e008c12d5f3da2c733c0f55168a30be2"; + constexpr const char str_b[] = "d7f1c5ebfe9108ab8900f3d1af36367cce3e92121acb9b60e352e5d622525715d0203ddd77d9ab308709777b225948c3e61542010fe75974ddb38cc38a11fa65bee2a6f171fe7ee4e52d81569bfcb886f972bd4655b6388bc7c8982f6e6a31efc21f8579394b5e629c15c367ee6eda6091dcb0f8aea6daa69f9c7059e585fc92a28c16d16183b8b0edf460b9741b712a9aaaf9d557ae4a7ef5cead986e9c414988b5fc43d78d8f7fbbc7f6cfd7e08bf8f87ce6f865b9ad1fcf4b00f42939349398c4a2928c21959ff6105665de3d95be8afc9fe9fb33d6afb95948e9778328fdd7172c70431479229cae5a47463f832b9ca2a39f36963f3ec1dc39fe6a3bffbc"; + constexpr const char str_ctrl[] = "d704b29793a64a44339b92e4f202801cae2ca252f899cf36ae3735c98505f4c16a7a6a159e54e8927d4ec95defd8ec04afcc0043bdab50dfc763b376549ab90df60d476bd5b26c3f5b2378656fe307f7da459b62924efa9f6d408484a44a88265515b04f1d75351ba7e6436cdf6d67a87c82dbacb02f782f1601feb974d10367e275561904466d31daf817f350752636455bf7f6f86f21268bf173182e430fdeb80fbc96daf032ec381f761476b8bf2cc33d6ec7d67d96eb69fef2bce4c715e4d676b8c2066afa83f10243273f5c65b427e71eaee89d285f39692e757cb6b86a085e7869ef85c05155328130e37163b8addb3410ccd9fde92fcc5e8a9b3336113440f34e3ace928c98de63d02c0caa1c160cfb8ccf46d48bdf9ebd24f5611582d92cf787e02198e7bebc83bd9eae8bd63c5b74573a2923146d05e92211baecb7fb4d7408d31cdccdfdeca05c0c4085775a510f4bed924ebd69e6c4e34c3c6ecb3de0ff2187affe6bffaa1d73df44d730668318922a3077232dab4575a64e8a7958301ce2e341a146f758fc51d7e25298545a6b277b1a9cd9ea72def76d7c05ea5a17ba501050106ff8042f0ffea4c97193b0b8ad138e315d7cd09179d55782534c96b32f21d808e0764b3a341ccc1c20543da2ef9620a5c877fa330bfc43556ddf8069c3fa04e3081b699b8673346f82d112c49bf17fa7c52cc9fbbe91a8d7f8"; + #else + //constexpr const char str_a [] = "fee6f306"; + //constexpr const char str_b [] = "d7f1c5eb"; + //constexpr const char str_ctrl[] = "d704b297"; + #endif + + #if 0 + using allocator_type = util::ring_allocator; + + using wi_type = beman::big_int::basic_big_int::digits, allocator_type>; + + using wi_result_type = wi_type; + + wi_type wi_val_a {}; + wi_type wi_val_b {}; + wi_result_type wi_val_ctrl {}; + + const auto fc_result_a = from_chars(str_a, str_a + std::strlen(str_a), wi_val_a, 16); + const auto fc_result_b = from_chars(str_b, str_b + std::strlen(str_b), wi_val_b, 16); + const auto fc_result_ctrl = from_chars(str_ctrl, str_ctrl + std::strlen(str_ctrl), wi_val_ctrl, 16); + + static_cast(fc_result_a); + static_cast(fc_result_b); + static_cast(fc_result_ctrl); + + const wi_result_type wi_val_c{wi_result_type{wi_val_a} * wi_result_type{wi_val_b}}; + + const bool result_is_ok { (wi_val_ctrl == wi_val_c) }; + + return result_is_ok; + #else + return true; + #endif +} + +#if defined(APP_BENCHMARK_STANDALONE_MAIN) +ATTRIBUTE(used) auto main() -> int; + +auto main() -> int +{ + // g++ -Wall -O3 -march=native -I./ref_app/src/mcal/host -I./ref_app/src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_FILTER -DAPP_BENCHMARK_STANDALONE_MAIN ./ref_app/src/app/benchmark/app_benchmark_filter.cpp -o ./ref_app/bin/app_benchmark_filter.exe + + bool result_is_ok = true; + + for(unsigned i = 0U; i < 64U; ++i) + { + result_is_ok &= app::benchmark::run_std_big_int(); + } + + return result_is_ok ? 0 : -1; +} +#endif + +#endif // APP_BENCHMARK_TYPE_FILTER diff --git a/ref_app/src/math/functions/math_functions_hypergeometric.h b/ref_app/src/math/functions/math_functions_hypergeometric.h index 02cf779f1..f5a057515 100644 --- a/ref_app/src/math/functions/math_functions_hypergeometric.h +++ b/ref_app/src/math/functions/math_functions_hypergeometric.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Copyright Christopher Kormanyos 2014 - 2025. +// Copyright Christopher Kormanyos 2014 - 2026. // Distributed under the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt // or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -161,7 +161,7 @@ T x_pow_n_div_n_fact(x); // Define an allocator type for use in the containers below. - using allocator_type = util::ring_allocator; + using allocator_type = util::ring_allocator; // Define a container type for the upcoming calculation. using container_type = util::dynamic_array; diff --git a/ref_app/src/util/memory/util_ring_allocator.h b/ref_app/src/util/memory/util_ring_allocator.h index 1c3539a22..b44dab8ea 100644 --- a/ref_app/src/util/memory/util_ring_allocator.h +++ b/ref_app/src/util/memory/util_ring_allocator.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Copyright Christopher Kormanyos 2007 - 2024. +// Copyright Christopher Kormanyos 2007 - 2026. // Distributed under the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt // or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -8,16 +8,29 @@ #ifndef UTIL_RING_ALLOCATOR_2010_02_23_H #define UTIL_RING_ALLOCATOR_2010_02_23_H - #include - #include #include #include namespace util { + // Forward declaration of ring_allocator_base. + template + class ring_allocator_base; + + // Global comparison operators (required by the standard). + template + auto operator==(const ring_allocator_base&, const ring_allocator_base&) noexcept -> bool; + + template + auto operator!=(const ring_allocator_base&, const ring_allocator_base&) noexcept -> bool; + + template class ring_allocator_base { + private: + static constexpr std::uint_fast8_t buffer_alignment { UINT8_C(16) }; + public: using size_type = std::size_t; using difference_type = std::ptrdiff_t; @@ -25,30 +38,36 @@ virtual ~ring_allocator_base() = default; protected: + static constexpr std::uint_fast8_t bufffer_alignment { UINT8_C(16) }; + ring_allocator_base() noexcept = default; ring_allocator_base(const ring_allocator_base&) noexcept = default; + ring_allocator_base(ring_allocator_base&&) noexcept = default; + + auto operator=(const ring_allocator_base&) noexcept -> ring_allocator_base& = default; + auto operator=(ring_allocator_base&&) noexcept -> ring_allocator_base& = default; + // The ring allocator's buffer type. struct buffer_type { - static constexpr size_type size = 64U; + static constexpr size_type local_buf_size { static_cast(buffer_size) }; - std::uint8_t data[size]; + std::uint8_t data[local_buf_size]; - buffer_type() noexcept : data() { } + buffer_type() noexcept : data { } { } }; // The ring allocator's memory allocation. - template static auto do_allocate(size_type chunk_size) -> void* { - ALIGNAS(16) static buffer_type buffer; + alignas(bufffer_alignment) static buffer_type buffer { }; - static std::uint8_t* get_ptr = buffer.data; + static std::uint8_t* get_ptr { buffer.data }; // Get the newly allocated pointer. - std::uint8_t* p = get_ptr; + std::uint8_t* p { get_ptr }; // Increment the get-pointer for the next allocation. // Be sure to handle the buffer alignment. @@ -63,7 +82,7 @@ get_ptr += chunk_size; // Does this attempted allocation overflow the capacity of the buffer? - const bool is_overflow = (get_ptr >= (buffer.data + buffer_type::size)); + const bool is_overflow { (get_ptr >= (buffer.data + buffer_type::local_buf_size)) }; if(is_overflow) { @@ -71,33 +90,24 @@ // Reset the allocated pointer to the bottom of the buffer // and increment the next get-pointer. - p = &buffer.data[0U]; + p = &buffer.data[std::size_t { UINT8_C(0) }]; get_ptr = &buffer.data[chunk_size]; } return static_cast(p); } - }; - - // Global comparison operators (required by the standard). - inline auto operator==(const ring_allocator_base&, - const ring_allocator_base&) noexcept -> bool - { - return true; - } - inline auto operator!=(const ring_allocator_base&, - const ring_allocator_base&) noexcept -> bool - { - return false; - } + // Global comparison operators (required by the standard). + friend auto operator==(const ring_allocator_base&, const ring_allocator_base&) noexcept -> bool { return true; } + friend auto operator!=(const ring_allocator_base&, const ring_allocator_base&) noexcept -> bool { return false; } + }; template + const std::uint_fast32_t buffer_size> class ring_allocator; - template - class ring_allocator : public ring_allocator_base + template + class ring_allocator : public ring_allocator_base { public: using value_type = void; @@ -107,16 +117,16 @@ template struct rebind { - using other = ring_allocator; + using other = ring_allocator; }; }; template - class ring_allocator : public ring_allocator_base + const std::uint_fast32_t buffer_size> + class ring_allocator : public ring_allocator_base { public: - static_assert(sizeof(T) <= buffer_type::size, + static_assert(sizeof(T) <= ring_allocator_base::buffer_type::local_buf_size, "The size of the allocation object can not exceed the buffer size."); using value_type = T; @@ -127,31 +137,37 @@ ring_allocator() noexcept = default; - ring_allocator(const ring_allocator&) noexcept : ring_allocator_base(ring_allocator()) { } + ring_allocator(const ring_allocator&) noexcept : ring_allocator_base(ring_allocator()) { } + ring_allocator(ring_allocator&&) noexcept : ring_allocator_base(std::move(ring_allocator())) { } + + auto operator=(const ring_allocator&) noexcept -> ring_allocator& = default; + auto operator=(ring_allocator&&) noexcept -> ring_allocator& = default; template - ring_allocator(const ring_allocator&) noexcept { } + ring_allocator(const ring_allocator&) noexcept { } + + ~ring_allocator() override = default; template struct rebind { - using other = ring_allocator; + using other = ring_allocator; }; - auto max_size() const noexcept -> size_type + auto max_size() const noexcept -> typename ring_allocator::size_type { - return buffer_type::size / sizeof(value_type); + return ring_allocator_base::buffer_type::size / sizeof(value_type); } auto address( reference x) const -> pointer { return &x; } auto address(const_reference x) const -> const_pointer { return &x; } - auto allocate(size_type count, - typename ring_allocator::const_pointer = nullptr) -> pointer + auto allocate(typename ring_allocator::size_type count, + typename ring_allocator::const_pointer = nullptr) -> pointer { - const size_type chunk_size = count * sizeof(value_type); + const typename ring_allocator::size_type chunk_size = count * sizeof(value_type); - void* p = do_allocate(chunk_size); + void* p = ring_allocator::do_allocate(chunk_size); return static_cast(p); } @@ -163,7 +179,7 @@ auto destroy(pointer p) noexcept -> void { p->~value_type(); } - auto deallocate(pointer, size_type) noexcept -> void { } + auto deallocate(pointer, typename ring_allocator::size_type) noexcept -> void { } }; } diff --git a/ref_app/target/app/make/app_files.gmk b/ref_app/target/app/make/app_files.gmk index b127b5ebb..96fe2ee31 100644 --- a/ref_app/target/app/make/app_files.gmk +++ b/ref_app/target/app/make/app_files.gmk @@ -1,5 +1,5 @@ # -# Copyright Christopher Kormanyos 2007 - 2025. +# Copyright Christopher Kormanyos 2007 - 2026. # Distributed under the Boost Software License, # Version 1.0. (See accompanying file LICENSE_1_0.txt # or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -29,6 +29,7 @@ FILES_CPP = $(PATH_APP)/app/benchmark/app_benchmark $(PATH_APP)/app/benchmark/app_benchmark_pi_spigot \ $(PATH_APP)/app/benchmark/app_benchmark_pi_spigot_single \ $(PATH_APP)/app/benchmark/app_benchmark_soft_double_h2f1 \ + $(PATH_APP)/app/benchmark/app_benchmark_std_big_int \ $(PATH_APP)/app/benchmark/app_benchmark_trapezoid_integral \ $(PATH_APP)/app/benchmark/app_benchmark_wide_decimal \ $(PATH_APP)/app/benchmark/app_benchmark_wide_integer \ diff --git a/ref_app/target/micros/stm32f446/make/stm32f446_flags.gmk b/ref_app/target/micros/stm32f446/make/stm32f446_flags.gmk index 3a905f3e3..1a2dd2ae5 100644 --- a/ref_app/target/micros/stm32f446/make/stm32f446_flags.gmk +++ b/ref_app/target/micros/stm32f446/make/stm32f446_flags.gmk @@ -25,7 +25,7 @@ TGT_ALLFLAGS = -O2 -mno-unaligned-access \ -mno-long-calls -TGT_CFLAGS = -std=c99 \ +TGT_CFLAGS = -std=c11 \ -Wunsuffixed-float-constants \ $(TGT_ALLFLAGS) diff --git a/ref_app/target/micros/stm32f446/make/stm32f446_with_stdlib.ld b/ref_app/target/micros/stm32f446/make/stm32f446_with_stdlib.ld index d6ba72c07..07afd926a 100644 --- a/ref_app/target/micros/stm32f446/make/stm32f446_with_stdlib.ld +++ b/ref_app/target/micros/stm32f446/make/stm32f446_with_stdlib.ld @@ -1,5 +1,5 @@ /* - Copyright Christopher Kormanyos 2007 - 2024. + Copyright Christopher Kormanyos 2007 - 2026. Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) From ec4b970d557ef8c804a3e350b33e6f610a7e3975 Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Thu, 21 May 2026 11:55:59 +0200 Subject: [PATCH 3/9] Try restore QEMU run --- .github/workflows/real-time-cpp-benchmarks.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/real-time-cpp-benchmarks.yml b/.github/workflows/real-time-cpp-benchmarks.yml index de55d90fc..146e095d0 100644 --- a/.github/workflows/real-time-cpp-benchmarks.yml +++ b/.github/workflows/real-time-cpp-benchmarks.yml @@ -286,33 +286,33 @@ jobs: wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libncursesw5_6.3-2ubuntu0.1_amd64.deb sudo apt install ./libncursesw5_6.3-2ubuntu0.1_amd64.deb mkdir -p emu_env && cd emu_env - wget --no-check-certificate https://developer.arm.com/-/media/Files/downloads/gnu/15.2.rel1/binrel/arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi.tar.xz - tar -xf arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi.tar.xz - wget --no-check-certificate https://github.com/xpack-dev-tools/qemu-arm-xpack/releases/download/v9.2.4-1/xpack-qemu-arm-9.2.4-1-linux-x64.tar.gz - tar -xzf xpack-qemu-arm-9.2.4-1-linux-x64.tar.gz + wget --no-check-certificate https://developer.arm.com/-/media/Files/downloads/gnu/14.3.rel1/binrel/arm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi.tar.xz + tar -xf arm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi.tar.xz + wget --no-check-certificate https://github.com/xpack-dev-tools/qemu-arm-xpack/releases/download/v8.2.6-1/xpack-qemu-arm-8.2.6-1-linux-x64.tar.gz + tar -xzf xpack-qemu-arm-8.2.6-1-linux-x64.tar.gz working-directory: ./ref_app/ - name: build benchmark_single-stm32f429 run: | - PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi/bin:$PATH" + PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/arm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi/bin:$PATH" echo 'Query arm-none-eabi-g++ version' echo arm-none-eabi-g++ -v echo mkdir -p bin - arm-none-eabi-g++ -std=c++20 -Werror -Wall -Wextra -Wpedantic -Wconversion -Wsign-conversion -O2 -g -gdwarf-2 -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=32 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=soft -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f429 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_CRC -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_crc.cpp ./target/micros/stm32f429/make/single/crt.cpp -nostartfiles -nostdlib -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_crc.map -T ./target/micros/stm32f429/make/stm32f429.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_crc.elf + arm-none-eabi-g++ -std=c++23 -Werror -Wall -Wextra -Wpedantic -Wconversion -Wsign-conversion -O2 -g -gdwarf-2 -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=32 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=soft -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f429 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_CRC -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_crc.cpp ./target/micros/stm32f429/make/single/crt.cpp -nostartfiles -nostdlib -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_crc.map -T ./target/micros/stm32f429/make/stm32f429.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_crc.elf arm-none-eabi-objcopy ./bin/app_benchmark_crc.elf -O ihex ./bin/app_benchmark_crc.hex ls -la ./bin/app_benchmark_crc.elf ./bin/app_benchmark_crc.hex ./bin/app_benchmark_crc.map working-directory: ./ref_app/ - name: emulate-target stm32f429 run: | - PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/xpack-qemu-arm-9.2.4-1/bin:$PATH" + PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/xpack-qemu-arm-8.2.6-1/bin:$PATH" qemu-system-gnuarmeclipse --verbose --mcu STM32F429ZI --nographic --gdb tcp::9999 -d unimp,guest_errors & sleep 2 working-directory: ./ref_app/ - name: run-test-on-target run: | sleep 2 - PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi/bin:$PATH" + PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/arm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi/bin:$PATH" echo 'Run test on target' echo arm-none-eabi-gdb ./bin/app_benchmark_crc.elf -x ./target/build/test_app_benchmarks_emulator.gdb > ./app_benchmark_crc.txt From 0f1f0a5c93f3f7f2f2795b467e58161be0d95e8f Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Thu, 21 May 2026 12:54:37 +0200 Subject: [PATCH 4/9] setup std-big-int qemu run --- .../workflows/real-time-cpp-benchmarks.yml | 56 +++++++++++++++++++ .../target/micros/stm32f429/make/stm32f429.ld | 5 +- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/.github/workflows/real-time-cpp-benchmarks.yml b/.github/workflows/real-time-cpp-benchmarks.yml index 146e095d0..f02c4ba25 100644 --- a/.github/workflows/real-time-cpp-benchmarks.yml +++ b/.github/workflows/real-time-cpp-benchmarks.yml @@ -321,3 +321,59 @@ jobs: echo 'We will now grep for the right answer...' grep 'value 0xF00DCAFE' ./app_benchmark_crc.txt working-directory: ./ref_app/ + benchmark_single-stm32f429-qemu-std-big-int: + runs-on: ubuntu-latest + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: '0' + - name: update-tools + run: | + sudo apt update + wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2ubuntu0.1_amd64.deb + sudo apt install ./libtinfo5_6.3-2ubuntu0.1_amd64.deb + wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libncursesw5_6.3-2ubuntu0.1_amd64.deb + sudo apt install ./libncursesw5_6.3-2ubuntu0.1_amd64.deb + mkdir -p emu_env && cd emu_env + wget --no-check-certificate https://developer.arm.com/-/media/Files/downloads/gnu/14.3.rel1/binrel/arm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi.tar.xz + tar -xf arm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi.tar.xz + wget --no-check-certificate https://github.com/xpack-dev-tools/qemu-arm-xpack/releases/download/v8.2.6-1/xpack-qemu-arm-8.2.6-1-linux-x64.tar.gz + tar -xzf xpack-qemu-arm-8.2.6-1-linux-x64.tar.gz + working-directory: ./ref_app/ + - name: clone-cppalliance-decimal + run: | + git clone -b main --depth 1 https://github.com/eisenwave/std-big-int.git ../../std-big-int-root + working-directory: ./ref_app/ + - name: build benchmark_single-stm32f429 + run: | + PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/arm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi/bin:$PATH" + echo 'Query arm-none-eabi-g++ version' + echo + arm-none-eabi-g++ -v + echo + mkdir -p bin + arm-none-eabi-g++ -std=c++23 -Werror -Wall -Wextra -Wpedantic -Wconversion -Wsign-conversion -O2 -g -gdwarf-2 -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=32 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=soft -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f429 -I./src -I../../std-big-int-root/include -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_STD_BIG_INT -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_std_big_int.cpp ../../src/karatsuba.cpp ../../src/toom_cook_3.cpp ../../src/toom_cook_4.cpp ../../src/toom_cook_6_5.cpp ./target/micros/stm32f429/make/single/crt.cpp -nostartfiles -nostdlib -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_std_big_int.map -T ./target/micros/stm32f429/make/stm32f429.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_std_big_int.elf + arm-none-eabi-objcopy ./bin/app_benchmark_std_big_int.elf -O ihex ./bin/app_benchmark_std_big_int.hex + ls -la ./bin/app_benchmark_std_big_int.elf ./bin/app_benchmark_std_big_int.hex ./bin/app_benchmark_std_big_int.map + working-directory: ./ref_app/ + - name: emulate-target stm32f429 + run: | + PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/xpack-qemu-arm-8.2.6-1/bin:$PATH" + qemu-system-gnuarmeclipse --verbose --mcu STM32F429ZI --nographic --gdb tcp::9999 -d unimp,guest_errors & + sleep 2 + working-directory: ./ref_app/ + - name: run-test-on-target + run: | + sleep 2 + PATH="${{ runner.workspace }}/real-time-cpp/ref_app/emu_env/arm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi/bin:$PATH" + echo 'Run test on target' + echo + arm-none-eabi-gdb ./bin/app_benchmark_std_big_int.elf -x ./target/build/test_app_benchmarks_emulator.gdb > ./app_benchmark_std_big_int.txt + cat ./app_benchmark_std_big_int.txt + echo + echo 'We will now grep for the right answer...' + grep 'value 0xF00DCAFE' ./app_benchmark_std_big_int.txt + working-directory: ./ref_app/ diff --git a/ref_app/target/micros/stm32f429/make/stm32f429.ld b/ref_app/target/micros/stm32f429/make/stm32f429.ld index 8980388d2..158ac80b4 100644 --- a/ref_app/target/micros/stm32f429/make/stm32f429.ld +++ b/ref_app/target/micros/stm32f429/make/stm32f429.ld @@ -1,12 +1,11 @@ - /* - Copyright Christopher Kormanyos 2007 - 2024. + Copyright Christopher Kormanyos 2007 - 2026. Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ -/* Linker script for STM32F4x ARM(R) Cortex(TM)-M4 MCU */ +/* Linker script for STM32F4xx ARM(R) Cortex(TM)-M4 MCU */ ENTRY(__my_startup) From b103a8092435397aeb3ec617414cd4508ab5ef3d Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Thu, 21 May 2026 13:03:59 +0200 Subject: [PATCH 5/9] retry std-big-int qemu run --- .github/workflows/real-time-cpp-benchmarks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/real-time-cpp-benchmarks.yml b/.github/workflows/real-time-cpp-benchmarks.yml index f02c4ba25..00d95b262 100644 --- a/.github/workflows/real-time-cpp-benchmarks.yml +++ b/.github/workflows/real-time-cpp-benchmarks.yml @@ -355,7 +355,7 @@ jobs: arm-none-eabi-g++ -v echo mkdir -p bin - arm-none-eabi-g++ -std=c++23 -Werror -Wall -Wextra -Wpedantic -Wconversion -Wsign-conversion -O2 -g -gdwarf-2 -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=32 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=soft -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f429 -I./src -I../../std-big-int-root/include -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_STD_BIG_INT -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_std_big_int.cpp ../../src/karatsuba.cpp ../../src/toom_cook_3.cpp ../../src/toom_cook_4.cpp ../../src/toom_cook_6_5.cpp ./target/micros/stm32f429/make/single/crt.cpp -nostartfiles -nostdlib -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_std_big_int.map -T ./target/micros/stm32f429/make/stm32f429.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_std_big_int.elf + arm-none-eabi-g++ -std=c++23 -Werror -Wall -Wextra -Wpedantic -Wconversion -Wsign-conversion -O2 -g -gdwarf-2 -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=32 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=soft -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f429 -I./src -I../../std-big-int-root/include -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_STD_BIG_INT -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_std_big_int.cpp ../../std-big-int-root/src/karatsuba.cpp ../../std-big-int-root/src/toom_cook_3.cpp ../../std-big-int-root/src/toom_cook_4.cpp ../../std-big-int-root/src/toom_cook_6_5.cpp ./target/micros/stm32f429/make/single/crt.cpp -nostartfiles -nostdlib -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_std_big_int.map -T ./target/micros/stm32f429/make/stm32f429.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_std_big_int.elf arm-none-eabi-objcopy ./bin/app_benchmark_std_big_int.elf -O ihex ./bin/app_benchmark_std_big_int.hex ls -la ./bin/app_benchmark_std_big_int.elf ./bin/app_benchmark_std_big_int.hex ./bin/app_benchmark_std_big_int.map working-directory: ./ref_app/ From faf5a174af4010bfb01ceb8efaf261f83c02c022 Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Thu, 21 May 2026 13:08:14 +0200 Subject: [PATCH 6/9] Repair some trivial CI typos --- .github/workflows/real-time-cpp-benchmarks.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/real-time-cpp-benchmarks.yml b/.github/workflows/real-time-cpp-benchmarks.yml index 00d95b262..266570329 100644 --- a/.github/workflows/real-time-cpp-benchmarks.yml +++ b/.github/workflows/real-time-cpp-benchmarks.yml @@ -343,7 +343,7 @@ jobs: wget --no-check-certificate https://github.com/xpack-dev-tools/qemu-arm-xpack/releases/download/v8.2.6-1/xpack-qemu-arm-8.2.6-1-linux-x64.tar.gz tar -xzf xpack-qemu-arm-8.2.6-1-linux-x64.tar.gz working-directory: ./ref_app/ - - name: clone-cppalliance-decimal + - name: clone-eisenwave-std-big-int run: | git clone -b main --depth 1 https://github.com/eisenwave/std-big-int.git ../../std-big-int-root working-directory: ./ref_app/ @@ -355,7 +355,7 @@ jobs: arm-none-eabi-g++ -v echo mkdir -p bin - arm-none-eabi-g++ -std=c++23 -Werror -Wall -Wextra -Wpedantic -Wconversion -Wsign-conversion -O2 -g -gdwarf-2 -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=32 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=soft -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f429 -I./src -I../../std-big-int-root/include -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_STD_BIG_INT -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_std_big_int.cpp ../../std-big-int-root/src/karatsuba.cpp ../../std-big-int-root/src/toom_cook_3.cpp ../../std-big-int-root/src/toom_cook_4.cpp ../../std-big-int-root/src/toom_cook_6_5.cpp ./target/micros/stm32f429/make/single/crt.cpp -nostartfiles -nostdlib -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_std_big_int.map -T ./target/micros/stm32f429/make/stm32f429.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_std_big_int.elf + arm-none-eabi-g++ -std=c++23 -Werror -Wall -Wextra -Wpedantic -Wconversion -Wsign-conversion -O2 -g -gdwarf-2 -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=32 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=soft -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f429 -I./src -I../../std-big-int-root/include -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_STD_BIG_INT -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_std_big_int.cpp ./src/mcal/mcal_gcc_cxx_completion.cpp ../../std-big-int-root/src/karatsuba.cpp ../../std-big-int-root/src/toom_cook_3.cpp ../../std-big-int-root/src/toom_cook_4.cpp ../../std-big-int-root/src/toom_cook_6_5.cpp ./target/micros/stm32f429/make/single/crt.cpp -nostartfiles -nostdlib -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_std_big_int.map -T ./target/micros/stm32f429/make/stm32f429.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_std_big_int.elf arm-none-eabi-objcopy ./bin/app_benchmark_std_big_int.elf -O ihex ./bin/app_benchmark_std_big_int.hex ls -la ./bin/app_benchmark_std_big_int.elf ./bin/app_benchmark_std_big_int.hex ./bin/app_benchmark_std_big_int.map working-directory: ./ref_app/ From 90cc572826f43fcaeb3044c33f0183de79ebd685 Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Thu, 21 May 2026 13:37:30 +0200 Subject: [PATCH 7/9] Minor adjustments for the _exit stub --- .github/workflows/real-time-cpp-benchmarks.yml | 2 +- ref_app/target/micros/stm32f446/make/single/crt.cpp | 4 ---- ref_app/target/micros/stm32f446/make/stm32f446_files.gmk | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/real-time-cpp-benchmarks.yml b/.github/workflows/real-time-cpp-benchmarks.yml index 266570329..e563aef87 100644 --- a/.github/workflows/real-time-cpp-benchmarks.yml +++ b/.github/workflows/real-time-cpp-benchmarks.yml @@ -299,7 +299,7 @@ jobs: arm-none-eabi-g++ -v echo mkdir -p bin - arm-none-eabi-g++ -std=c++23 -Werror -Wall -Wextra -Wpedantic -Wconversion -Wsign-conversion -O2 -g -gdwarf-2 -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=32 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=soft -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f429 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_CRC -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_crc.cpp ./target/micros/stm32f429/make/single/crt.cpp -nostartfiles -nostdlib -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_crc.map -T ./target/micros/stm32f429/make/stm32f429.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_crc.elf + arm-none-eabi-g++ -std=c++23 -Werror -Wall -Wextra -Wpedantic -Wconversion -Wsign-conversion -O2 -g -gdwarf-2 -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=32 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=soft -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f429 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_CRC -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_crc.cpp ./src/mcal/mcal_gcc_cxx_completion.cpp ./target/micros/stm32f429/make/single/crt.cpp -nostartfiles -nostdlib -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_crc.map -T ./target/micros/stm32f429/make/stm32f429.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_crc.elf arm-none-eabi-objcopy ./bin/app_benchmark_crc.elf -O ihex ./bin/app_benchmark_crc.hex ls -la ./bin/app_benchmark_crc.elf ./bin/app_benchmark_crc.hex ./bin/app_benchmark_crc.map working-directory: ./ref_app/ diff --git a/ref_app/target/micros/stm32f446/make/single/crt.cpp b/ref_app/target/micros/stm32f446/make/single/crt.cpp index ffd822323..89eb9bbad 100644 --- a/ref_app/target/micros/stm32f446/make/single/crt.cpp +++ b/ref_app/target/micros/stm32f446/make/single/crt.cpp @@ -61,10 +61,6 @@ void __my_startup() // TBD: Nothing on return from main. } -extern "C" void _exit (int); - -extern "C" void _exit (int) { } - extern "C" { extern std::uintptr_t _rom_data_begin; // Start address for the initialization values of the rom-to-ram section. diff --git a/ref_app/target/micros/stm32f446/make/stm32f446_files.gmk b/ref_app/target/micros/stm32f446/make/stm32f446_files.gmk index fa3be41a9..6394380fe 100644 --- a/ref_app/target/micros/stm32f446/make/stm32f446_files.gmk +++ b/ref_app/target/micros/stm32f446/make/stm32f446_files.gmk @@ -1,5 +1,5 @@ # -# Copyright Christopher Kormanyos 2007 - 2025. +# Copyright Christopher Kormanyos 2007 - 2026. # Distributed under the Boost Software License, # Version 1.0. (See accompanying file LICENSE_1_0.txt # or copy at http://www.boost.org/LICENSE_1_0.txt) From 23a1dd99edc983510652ef3d2891dc88796a71ac Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Thu, 21 May 2026 13:49:52 +0200 Subject: [PATCH 8/9] More trivial changes for qemu runs --- .github/workflows/real-time-cpp-benchmarks.yml | 2 +- ref_app/target/micros/stm32f429/make/single/crt.cpp | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/real-time-cpp-benchmarks.yml b/.github/workflows/real-time-cpp-benchmarks.yml index e563aef87..e51551115 100644 --- a/.github/workflows/real-time-cpp-benchmarks.yml +++ b/.github/workflows/real-time-cpp-benchmarks.yml @@ -243,7 +243,7 @@ jobs: - name: benchmark_single-stm32f446 run: | mkdir -p bin - arm-none-eabi-g++ -std=c++20 -Wall -Wextra -Wpedantic -O2 -g -gdwarf-2 -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=32 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=soft -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_CRC -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_crc.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_crc.map -T ./target/micros/stm32f446/make/stm32f446.ld -o ./bin/app_benchmark_crc.elf + arm-none-eabi-g++ -std=c++20 -Wall -Wextra -Wpedantic -O2 -g -gdwarf-2 -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=32 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=soft -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_CRC -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_crc.cpp ./src/mcal/mcal_gcc_cxx_completion.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_crc.map -T ./target/micros/stm32f446/make/stm32f446.ld -o ./bin/app_benchmark_crc.elf arm-none-eabi-objcopy ./bin/app_benchmark_crc.elf -O ihex ./bin/app_benchmark_crc.hex ls -la ./bin/app_benchmark_crc.elf ./bin/app_benchmark_crc.hex ./bin/app_benchmark_crc.map working-directory: ./ref_app/ diff --git a/ref_app/target/micros/stm32f429/make/single/crt.cpp b/ref_app/target/micros/stm32f429/make/single/crt.cpp index 7393b12ec..2338a0fdd 100644 --- a/ref_app/target/micros/stm32f429/make/single/crt.cpp +++ b/ref_app/target/micros/stm32f429/make/single/crt.cpp @@ -60,10 +60,6 @@ void __my_startup() // Do nothing on return from main. } -extern "C" void _exit (int); - -extern "C" void _exit (int) { } - extern "C" { extern std::uintptr_t _rom_data_begin; // Start address for the initialization values of the rom-to-ram section. From 590b6f64e804338af4c092bda258274c9d3ccae2 Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Thu, 21 May 2026 14:40:30 +0200 Subject: [PATCH 9/9] Do some more minor cleanup --- ref_app/src/mcal/mcal_gcc_cxx_completion.cpp | 12 ++ ref_app/target.vcxproj | 2 - ref_app/target.vcxproj.filters | 6 - .../build/test_app_benchmarks_stm32f446.sh | 44 +++--- .../micros/stm32f429/make/single/crt.cpp | 2 +- .../target/micros/stm32f429/make/stm32f429.ld | 6 +- .../stm32f429/make/stm32f429_with_stdlib.ld | 138 ------------------ .../micros/stm32f446/make/single/crt.cpp | 2 +- .../target/micros/stm32f446/make/stm32f446.ld | 16 +- .../stm32f446/make/stm32f446_with_stdlib.ld | 137 ----------------- 10 files changed, 51 insertions(+), 314 deletions(-) delete mode 100644 ref_app/target/micros/stm32f429/make/stm32f429_with_stdlib.ld delete mode 100644 ref_app/target/micros/stm32f446/make/stm32f446_with_stdlib.ld diff --git a/ref_app/src/mcal/mcal_gcc_cxx_completion.cpp b/ref_app/src/mcal/mcal_gcc_cxx_completion.cpp index d323dd4fa..414c8e279 100644 --- a/ref_app/src/mcal/mcal_gcc_cxx_completion.cpp +++ b/ref_app/src/mcal/mcal_gcc_cxx_completion.cpp @@ -54,12 +54,19 @@ void operator delete(void*, std::size_t) noexcept { } extern "C" { + typedef struct file_tag + { + void* file_dummy; + } + FILE; + // Declarations of patched functions. // Provide stubbed copies of certain functions declared in and . // Also provide stubbed copies of certain empirically found library functions // and objects. + int fprintf (FILE*, const char*, ... ); void abort () __attribute__((noreturn)); int atexit (void (*)()); int at_quick_exit (void (*)()); @@ -82,6 +89,7 @@ extern "C" // Implementations of patched functions. + int fprintf (FILE*, const char*, ... ) { return -1; } void abort () { for(;;) { mcal::cpu::nop(); } } int atexit (void (*)()) { return 0; } int at_quick_exit (void (*)()) { return 0; } @@ -133,6 +141,10 @@ namespace std { [[noreturn]] void __throw_out_of_range_fmt(char const*, ...) { for(;;) { ; } } + + using ::fprintf; + + using ::atexit; } #if defined(__GNUC__) diff --git a/ref_app/target.vcxproj b/ref_app/target.vcxproj index 51911160c..5cbf25417 100644 --- a/ref_app/target.vcxproj +++ b/ref_app/target.vcxproj @@ -1115,11 +1115,9 @@ - - diff --git a/ref_app/target.vcxproj.filters b/ref_app/target.vcxproj.filters index 8c3bc2cf0..278077985 100644 --- a/ref_app/target.vcxproj.filters +++ b/ref_app/target.vcxproj.filters @@ -594,9 +594,6 @@ build - - micros\stm32f446\make - micros\bcm2835_raspi_b\make @@ -639,9 +636,6 @@ micros\stm32h7a3\make - - micros\stm32f429\make - micros\nxp_imxrt1062\make diff --git a/ref_app/target/build/test_app_benchmarks_stm32f446.sh b/ref_app/target/build/test_app_benchmarks_stm32f446.sh index 9b4312032..02ed56b78 100755 --- a/ref_app/target/build/test_app_benchmarks_stm32f446.sh +++ b/ref_app/target/build/test_app_benchmarks_stm32f446.sh @@ -23,28 +23,28 @@ rm -f ./bin/*.* echo run benchmarks with $GCC and language standard $STD echo -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_COMPLEX -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_complex.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_complex.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_complex.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_CRC -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_crc.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_crc.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_crc.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_FAST_MATH -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_fast_math.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_fast_math.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_fast_math.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_FILTER -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_filter.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_filter.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_filter.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_FIXED_POINT -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_fixed_point.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_fixed_point.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_fixed_point.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_FLOAT -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_float.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_float.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_float.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_HASH -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_hash.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_hash.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_hash.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_NONE -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_none.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_none.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_none.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_PI_AGM -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_pi_agm.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_pi_agm.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_pi_agm.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_PI_SPIGOT -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_pi_spigot.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_pi_spigot.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_pi_spigot.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_PI_SPIGOT_SINGLE -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_pi_spigot_single.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_pi_spigot_single.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_pi_spigot_single.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_SOFT_DOUBLE_H2F1 -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_soft_double_h2f1.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_soft_double_h2f1.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_soft_double_h2f1.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_TRAPEZOID_INTEGRAL -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_trapezoid_integral.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_trapezoid_integral.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_trapezoid_integral.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_WIDE_DECIMAL -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_wide_decimal.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_wide_decimal.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_wide_decimal.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_WIDE_INTEGER -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_wide_integer.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_wide_integer.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_wide_integer.elf -$GCC -std=$STD -Werror -Wall -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -I../../boost-root -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_BOOST_MATH_CBRT_TGAMMA -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_boost_math_cbrt_tgamma.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_boost_math_cbrt_tgamma.map -T ./target/micros/stm32f446/make/stm32f446_with_stdlib.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_boost_math_cbrt_tgamma.elf -$GCC -std=$STD -Werror -Wall -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -I../../boost-root -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_BOOST_MATH_CYL_BESSEL_J -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_boost_math_cyl_bessel_j.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_boost_math_cyl_bessel_j.map -T ./target/micros/stm32f446/make/stm32f446_with_stdlib.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_boost_math_cyl_bessel_j.elf -$GCC -std=$STD -Werror -Wall -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -I../../boost-root -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_BOOST_MULTIPRECISION_CBRT -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_boost_multiprecision_cbrt.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_boost_multiprecision_cbrt.map -T ./target/micros/stm32f446/make/stm32f446_with_stdlib.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_boost_multiprecision_cbrt.elf -$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_HASH_SHA256 -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_hash_sha256.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_hash_sha256.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_hash_sha256.elf -$GCC -std=$STD -Werror -Wall $wflags -Os -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_ECC_GENERIC_ECC -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_ecc_generic_ecc.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_ecc_generic_ecc.map -T ./target/micros/stm32f446/make/stm32f446_with_stdlib.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_ecc_generic_ecc.elf -$GCC -std=$STD -Werror -Wall -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -I../../cppalliance-decimal-root/include -I../../boost-root -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_NON_STD_DECIMAL -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_non_std_decimal.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_non_std_decimal.map -T ./target/micros/stm32f446/make/stm32f446_with_stdlib.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_non_std_decimal.elf -$GCC -std=$STD -Werror -Wall -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -I../../cppalliance-crypt-root/include -I../../boost-root -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_BOOST_CRYPT_HASHER -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_boost_crypt_hasher.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_boost_crypt_hasher.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_boost_crypt_hasher.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_COMPLEX -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_complex.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_complex.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_complex.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_CRC -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_crc.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_crc.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_crc.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_FAST_MATH -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_fast_math.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_fast_math.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_fast_math.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_FILTER -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_filter.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_filter.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_filter.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_FIXED_POINT -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_fixed_point.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_fixed_point.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_fixed_point.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_FLOAT -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_float.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_float.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_float.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_HASH -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_hash.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_hash.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_hash.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_NONE -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_none.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_none.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_none.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_PI_AGM -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_pi_agm.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_pi_agm.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_pi_agm.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_PI_SPIGOT -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_pi_spigot.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_pi_spigot.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_pi_spigot.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_PI_SPIGOT_SINGLE -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_pi_spigot_single.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_pi_spigot_single.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_pi_spigot_single.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_SOFT_DOUBLE_H2F1 -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_soft_double_h2f1.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_soft_double_h2f1.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_soft_double_h2f1.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_TRAPEZOID_INTEGRAL -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_trapezoid_integral.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_trapezoid_integral.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_trapezoid_integral.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_WIDE_DECIMAL -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_wide_decimal.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_wide_decimal.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_wide_decimal.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_WIDE_INTEGER -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_wide_integer.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_wide_integer.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_wide_integer.elf +$GCC -std=$STD -Werror -Wall -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -I../../boost-root -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_BOOST_MATH_CBRT_TGAMMA -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_boost_math_cbrt_tgamma.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_boost_math_cbrt_tgamma.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_boost_math_cbrt_tgamma.elf +$GCC -std=$STD -Werror -Wall -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -I../../boost-root -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_BOOST_MATH_CYL_BESSEL_J -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_boost_math_cyl_bessel_j.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_boost_math_cyl_bessel_j.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_boost_math_cyl_bessel_j.elf +$GCC -std=$STD -Werror -Wall -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -I../../boost-root -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_BOOST_MULTIPRECISION_CBRT -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_boost_multiprecision_cbrt.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_boost_multiprecision_cbrt.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_boost_multiprecision_cbrt.elf +$GCC -std=$STD -Werror -Wall $wflags -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_HASH_SHA256 -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_hash_sha256.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_hash_sha256.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_hash_sha256.elf +$GCC -std=$STD -Werror -Wall $wflags -Os -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_ECC_GENERIC_ECC -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_ecc_generic_ecc.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_ecc_generic_ecc.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_ecc_generic_ecc.elf +$GCC -std=$STD -Werror -Wall -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -I../../cppalliance-decimal-root/include -I../../boost-root -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_NON_STD_DECIMAL -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_non_std_decimal.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_non_std_decimal.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_non_std_decimal.elf +$GCC -std=$STD -Werror -Wall -O2 -g -gdwarf-2 -fno-exceptions -ffunction-sections -fdata-sections -x c++ -fno-rtti -fno-use-cxa-atexit -fno-exceptions -fno-nonansi-builtins -fno-threadsafe-statics -fno-enforce-eh-specs -ftemplate-depth=128 -Wzero-as-null-pointer-constant -mcpu=cortex-m4 -mtune=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -mno-unaligned-access -mno-long-calls -I./src/mcal/stm32f446 -I./src -I../../cppalliance-crypt-root/include -I../../boost-root -DAPP_BENCHMARK_TYPE=APP_BENCHMARK_TYPE_BOOST_CRYPT_HASHER -DAPP_BENCHMARK_STANDALONE_MAIN ./src/app/benchmark/app_benchmark_boost_crypt_hasher.cpp ./target/micros/stm32f446/make/single/crt.cpp -nostartfiles -Wl,--gc-sections -Wl,-Map,./bin/app_benchmark_boost_crypt_hasher.map -T ./target/micros/stm32f446/make/stm32f446.ld --specs=nano.specs --specs=nosys.specs -o ./bin/app_benchmark_boost_crypt_hasher.elf echo check existences of ELF-files and map-files echo diff --git a/ref_app/target/micros/stm32f429/make/single/crt.cpp b/ref_app/target/micros/stm32f429/make/single/crt.cpp index 2338a0fdd..318bf8506 100644 --- a/ref_app/target/micros/stm32f429/make/single/crt.cpp +++ b/ref_app/target/micros/stm32f429/make/single/crt.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Copyright Christopher Kormanyos 2018 - 2025. +// Copyright Christopher Kormanyos 2018 - 2026. // Distributed under the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt // or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/ref_app/target/micros/stm32f429/make/stm32f429.ld b/ref_app/target/micros/stm32f429/make/stm32f429.ld index 158ac80b4..e18d85aa6 100644 --- a/ref_app/target/micros/stm32f429/make/stm32f429.ld +++ b/ref_app/target/micros/stm32f429/make/stm32f429.ld @@ -22,8 +22,8 @@ _rom_end = _rom_begin + _rom_size; /* The beginning and end (i.e., the top) of the stack */ /* Set up a stack with a size of 16K */ -_stack_begin = 0x2000C000; -_stack_end = 0x20010000; +_stack_begin = 0x2001C000; +_stack_end = 0x20020000; __initial_stack_pointer = _stack_end - 4; @@ -31,7 +31,7 @@ MEMORY { VEC(rx) : ORIGIN = 0x08000000, LENGTH = 0x300 ROM(rx) : ORIGIN = 0x08000300, LENGTH = _rom_size - 0x300 - RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 0x0C000 + RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 0x1C000 } SECTIONS diff --git a/ref_app/target/micros/stm32f429/make/stm32f429_with_stdlib.ld b/ref_app/target/micros/stm32f429/make/stm32f429_with_stdlib.ld deleted file mode 100644 index 4a39af96f..000000000 --- a/ref_app/target/micros/stm32f429/make/stm32f429_with_stdlib.ld +++ /dev/null @@ -1,138 +0,0 @@ - -/* - Copyright Christopher Kormanyos 2007 - 2024. - Distributed under the Boost Software License, - Version 1.0. (See accompanying file LICENSE_1_0.txt - or copy at http://www.boost.org/LICENSE_1_0.txt) -*/ - -/* Linker script for STM32F4x ARM(R) Cortex(TM)-M4 MCU */ - -ENTRY(__my_startup) - -INPUT(libc.a libm.a libgcc.a) - -OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") -OUTPUT_ARCH(arm) - -/* The beginning and end of the program ROM area */ -/* Set up a ROM area with a size of 512K */ -_rom_size = 0x00080000; -_rom_begin = 0x08000000; -_rom_end = _rom_begin + _rom_size; - -/* The beginning and end (i.e., the top) of the stack */ -/* Set up a stack with a size of 16K */ -_stack_begin = 0x2000C000; -_stack_end = 0x20010000; - -__initial_stack_pointer = _stack_end - 4; - -MEMORY -{ - VEC(rx) : ORIGIN = 0x08000000, LENGTH = 0x300 - ROM(rx) : ORIGIN = 0x08000300, LENGTH = _rom_size - 0x300 - RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 0x0C000 -} - -SECTIONS -{ - . = 0x08000000; - . = ALIGN(4); - - /* ISR vectors */ - .isr_vector : - { - *(.isr_vector) - . = ALIGN(0x100); - KEEP(*(.isr_vector)) - } > VEC = 0xAAAA - - /* startup */ - .startup : - { - *(.startup) - . = ALIGN(0x10); - KEEP(*(.startup)) - } > ROM = 0x5555 - - /* Program code (text), read-only data and static ctors */ - .text : - { - _ctors_begin = .; - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array*)) - _ctors_end = .; - *(.progmem*) - . = ALIGN(4); - *(.text) - . = ALIGN(4); - *(.text*) - . = ALIGN(4); - *(.rodata) - . = ALIGN(4); - *(.rodata*) - . = ALIGN(4); - *(.glue_7) - . = ALIGN(4); - *(.glue_7t) - . = ALIGN(4); - } > ROM - - .ARM.extab : - { - . = ALIGN(4); - *(.ARM.extab) - *(.ARM.extab*) - *(.gnu.linkonce.armextab.*) - . = ALIGN(4); - } > ROM - - .exidx : - { - . = ALIGN(4); - PROVIDE(__exidx_start = .); - *(.ARM.exidx*) - . = ALIGN(4); - PROVIDE(__exidx_end = .); - } > ROM - - .ARM.attributes : - { - *(.ARM.attributes) - } > ROM - - . = 0x20000000; - . = ALIGN(4); - - /* The ROM-to-RAM initialized data section */ - .data : - { - _data_begin = .; - *(.data) - . = ALIGN(4); - KEEP (*(.data)) - *(.data*) - . = ALIGN(4); - KEEP (*(.data*)) - _data_end = .; - } > RAM AT > ROM - - /* The uninitialized (zero-cleared) data section */ - .bss : - { - _bss_begin = .; - *(.bss) - . = ALIGN(4); - KEEP (*(.bss)) - *(.bss*) - . = ALIGN(4); - KEEP (*(.bss*)) - _bss_end = .; - } > RAM - - PROVIDE(end = .); - PROVIDE(_fini = .); - - _rom_data_begin = LOADADDR(.data); -} diff --git a/ref_app/target/micros/stm32f446/make/single/crt.cpp b/ref_app/target/micros/stm32f446/make/single/crt.cpp index 89eb9bbad..f26655c55 100644 --- a/ref_app/target/micros/stm32f446/make/single/crt.cpp +++ b/ref_app/target/micros/stm32f446/make/single/crt.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Copyright Christopher Kormanyos 2018 - 2025. +// Copyright Christopher Kormanyos 2018 - 2026. // Distributed under the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt // or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/ref_app/target/micros/stm32f446/make/stm32f446.ld b/ref_app/target/micros/stm32f446/make/stm32f446.ld index 501002012..973533347 100644 --- a/ref_app/target/micros/stm32f446/make/stm32f446.ld +++ b/ref_app/target/micros/stm32f446/make/stm32f446.ld @@ -14,16 +14,24 @@ INPUT(libc.a libm.a libgcc.a) OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) +/* The beginning and end of the program ROM area */ +/* Set up a ROM area with a size of 512K */ +_rom_size = 0x00080000; +_rom_begin = 0x08000000; +_rom_end = _rom_begin + _rom_size; + /* The beginning and end (i.e., the top) of the stack */ -/* Set up a stack with a size of 4K */ +/* Set up a stack with a size of 16K */ +_stack_begin = 0x2001C000; +_stack_end = 0x20020000; -__initial_stack_pointer = 0x20002000 - 4; +__initial_stack_pointer = _stack_end - 4; MEMORY { VEC(rx) : ORIGIN = 0x08000000, LENGTH = 0x300 - ROM(rx) : ORIGIN = 0x08000300, LENGTH = 64K - 0x300 - RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 0x7000 + ROM(rx) : ORIGIN = 0x08000300, LENGTH = _rom_size - 0x300 + RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 0x1C000 } SECTIONS diff --git a/ref_app/target/micros/stm32f446/make/stm32f446_with_stdlib.ld b/ref_app/target/micros/stm32f446/make/stm32f446_with_stdlib.ld deleted file mode 100644 index 07afd926a..000000000 --- a/ref_app/target/micros/stm32f446/make/stm32f446_with_stdlib.ld +++ /dev/null @@ -1,137 +0,0 @@ -/* - Copyright Christopher Kormanyos 2007 - 2026. - Distributed under the Boost Software License, - Version 1.0. (See accompanying file LICENSE_1_0.txt - or copy at http://www.boost.org/LICENSE_1_0.txt) -*/ - -/* Linker script for STM32F4xx ARM(R) Cortex(TM)-M4 MCU */ - -ENTRY(__my_startup) - -INPUT(libc.a libm.a libgcc.a) - -OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") -OUTPUT_ARCH(arm) - -/* The beginning and end of the program ROM area */ -/* Set up a ROM area with a size of 512K */ -_rom_size = 0x00080000; -_rom_begin = 0x08000000; -_rom_end = _rom_begin + _rom_size; - -/* The beginning and end (i.e., the top) of the stack */ -/* Set up a stack with a size of 16K */ -_stack_begin = 0x2000C000; -_stack_end = 0x20010000; - -__initial_stack_pointer = _stack_end - 4; - -MEMORY -{ - VEC(rx) : ORIGIN = 0x08000000, LENGTH = 0x300 - ROM(rx) : ORIGIN = 0x08000300, LENGTH = _rom_size - 0x300 - RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 0x0C000 -} - -SECTIONS -{ - . = 0x08000000; - . = ALIGN(4); - - /* ISR vectors */ - .isr_vector : - { - *(.isr_vector) - . = ALIGN(0x100); - KEEP(*(.isr_vector)) - } > VEC = 0xAAAA - - /* startup */ - .startup : - { - *(.startup) - . = ALIGN(0x10); - KEEP(*(.startup)) - } > ROM = 0x5555 - - /* Program code (text), read-only data and static ctors */ - .text : - { - _ctors_begin = .; - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array*)) - _ctors_end = .; - *(.progmem*) - . = ALIGN(4); - *(.text) - . = ALIGN(4); - *(.text*) - . = ALIGN(4); - *(.rodata) - . = ALIGN(4); - *(.rodata*) - . = ALIGN(4); - *(.glue_7) - . = ALIGN(4); - *(.glue_7t) - . = ALIGN(4); - } > ROM - - .ARM.extab : - { - . = ALIGN(4); - *(.ARM.extab) - *(.ARM.extab*) - *(.gnu.linkonce.armextab.*) - . = ALIGN(4); - } > ROM - - .exidx : - { - . = ALIGN(4); - PROVIDE(__exidx_start = .); - *(.ARM.exidx*) - . = ALIGN(4); - PROVIDE(__exidx_end = .); - } > ROM - - .ARM.attributes : - { - *(.ARM.attributes) - } > ROM - - . = 0x20000000; - . = ALIGN(4); - - /* The ROM-to-RAM initialized data section */ - .data : - { - _data_begin = .; - *(.data) - . = ALIGN(4); - KEEP (*(.data)) - *(.data*) - . = ALIGN(4); - KEEP (*(.data*)) - _data_end = .; - } > RAM AT > ROM - - /* The uninitialized (zero-cleared) data section */ - .bss : - { - _bss_begin = .; - *(.bss) - . = ALIGN(4); - KEEP (*(.bss)) - *(.bss*) - . = ALIGN(4); - KEEP (*(.bss*)) - _bss_end = .; - } > RAM - - PROVIDE(end = .); - PROVIDE(_fini = .); - - _rom_data_begin = LOADADDR(.data); -}