Skip to content

Commit 24205f9

Browse files
committed
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
1 parent 299fb7d commit 24205f9

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

tools/pioasm/c_sdk_output.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ struct c_sdk_output : public output_format {
7979
fprintf(out, "#endif\n");
8080
fprintf(out, "\n");
8181

82+
fprintf(out, "#ifdef __cplusplus\n");
83+
fprintf(out, "#define PIO_CONST constexpr\n");
84+
fprintf(out, "#else\n");
85+
fprintf(out, "#define PIO_CONST const\n");
86+
fprintf(out, "#endif\n");
87+
fprintf(out, "\n");
88+
8289
output_symbols(out, "", source.global_symbols);
8390

8491
for (const auto &program : source.programs) {
@@ -93,7 +100,7 @@ struct c_sdk_output : public output_format {
93100

94101
output_symbols(out, prefix, program.symbols);
95102

96-
fprintf(out, "static const uint16_t %sprogram_instructions[] = {\n", prefix.c_str());
103+
fprintf(out, "static PIO_CONST uint16_t %sprogram_instructions[] = {\n", prefix.c_str());
97104
for (int i = 0; i < (int)program.instructions.size(); i++) {
98105
const auto &inst = program.instructions[i];
99106
if (i == program.wrap_target) {
@@ -109,7 +116,7 @@ struct c_sdk_output : public output_format {
109116
fprintf(out, "\n");
110117

111118
fprintf(out, "#if !PICO_NO_HARDWARE\n");
112-
fprintf(out, "static const struct pio_program %sprogram = {\n", prefix.c_str());
119+
fprintf(out, "static PIO_CONST struct pio_program %sprogram = {\n", prefix.c_str());
113120
fprintf(out, " .instructions = %sprogram_instructions,\n", prefix.c_str());
114121
fprintf(out, " .length = %d,\n", (int) program.instructions.size());
115122
fprintf(out, " .origin = %d,\n", program.origin.get());

0 commit comments

Comments
 (0)