From 24205f9dcd4b46a2b022a59f02945bcfbef4378b Mon Sep 17 00:00:00 2001 From: Richard Hulme Date: Sat, 6 Sep 2025 15:50:46 +0200 Subject: [PATCH 1/2] Use 'constexpr' when including pio header files from a C++ compiler In particular this allows compile-time checks to be performed on the contents of pio_program structs via 'static_assert'. This could be used (for example) to confirm that multiple PIO programs fit in a single PIO module and abort compilation if not. Fixes #2650 --- tools/pioasm/c_sdk_output.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tools/pioasm/c_sdk_output.cpp b/tools/pioasm/c_sdk_output.cpp index 156d3e71c..9a373df63 100644 --- a/tools/pioasm/c_sdk_output.cpp +++ b/tools/pioasm/c_sdk_output.cpp @@ -79,6 +79,13 @@ struct c_sdk_output : public output_format { fprintf(out, "#endif\n"); fprintf(out, "\n"); + fprintf(out, "#ifdef __cplusplus\n"); + fprintf(out, "#define PIO_CONST constexpr\n"); + fprintf(out, "#else\n"); + fprintf(out, "#define PIO_CONST const\n"); + fprintf(out, "#endif\n"); + fprintf(out, "\n"); + output_symbols(out, "", source.global_symbols); for (const auto &program : source.programs) { @@ -93,7 +100,7 @@ struct c_sdk_output : public output_format { output_symbols(out, prefix, program.symbols); - fprintf(out, "static const uint16_t %sprogram_instructions[] = {\n", prefix.c_str()); + fprintf(out, "static PIO_CONST uint16_t %sprogram_instructions[] = {\n", prefix.c_str()); for (int i = 0; i < (int)program.instructions.size(); i++) { const auto &inst = program.instructions[i]; if (i == program.wrap_target) { @@ -109,7 +116,7 @@ struct c_sdk_output : public output_format { fprintf(out, "\n"); fprintf(out, "#if !PICO_NO_HARDWARE\n"); - fprintf(out, "static const struct pio_program %sprogram = {\n", prefix.c_str()); + fprintf(out, "static PIO_CONST struct pio_program %sprogram = {\n", prefix.c_str()); fprintf(out, " .instructions = %sprogram_instructions,\n", prefix.c_str()); fprintf(out, " .length = %d,\n", (int) program.instructions.size()); fprintf(out, " .origin = %d,\n", program.origin.get()); From e8be6de4aca4075e7f23f8bff36a1c4c1dc6bfbf Mon Sep 17 00:00:00 2001 From: Richard Hulme Date: Sat, 13 Sep 2025 10:42:29 +0200 Subject: [PATCH 2/2] Use feature test macro to check for 'constexpr' support --- tools/pioasm/c_sdk_output.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pioasm/c_sdk_output.cpp b/tools/pioasm/c_sdk_output.cpp index 9a373df63..4f53f2e21 100644 --- a/tools/pioasm/c_sdk_output.cpp +++ b/tools/pioasm/c_sdk_output.cpp @@ -79,7 +79,7 @@ struct c_sdk_output : public output_format { fprintf(out, "#endif\n"); fprintf(out, "\n"); - fprintf(out, "#ifdef __cplusplus\n"); + fprintf(out, "#ifdef __cpp_constexpr\n"); fprintf(out, "#define PIO_CONST constexpr\n"); fprintf(out, "#else\n"); fprintf(out, "#define PIO_CONST const\n");