From 88377c8f5051ed7c9a50d1c40c0d3c854b4dc83c Mon Sep 17 00:00:00 2001 From: Alejandro Casanova Date: Tue, 23 Jun 2026 16:44:06 +0200 Subject: [PATCH 1/8] fix some typos, formatting and missing alt text --- examples/chapter16_08/readme.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/chapter16_08/readme.md b/examples/chapter16_08/readme.md index e7ca3f4cf..a11b8f9c7 100644 --- a/examples/chapter16_08/readme.md +++ b/examples/chapter16_08/readme.md @@ -1,4 +1,5 @@ # Example Chapter16_08 (advanced level) + ## Generate and Display 128-bit Random Prime Numbers This advanced example uses a self-made pseudo-random electronic @@ -34,7 +35,7 @@ from Newhaven Display International. The display is 40 characters in width by 4 lines and is, in fact, controlled as two individual displays packed together. -The realease version of this software is intended to run on our target +The release version of this software is intended to run on our target with the 8-bit microcontroller, as shown below. On this system, it takes approximately $15~\text{s}$ on average to find each single new pseudo-random 128-bit prime. @@ -51,10 +52,10 @@ project uses [Boost.Multiprecision](https://www.boost.org/doc/libs/1_82_0/libs/multiprecision/doc/html/index.html) for its 128-bit integer representation and independent primality testing. -This advanced example's software running on an 8-bit micrcocontroller +This advanced example's software running on an 8-bit microcontroller exhibits a fascinating combination of elementary electronics, real-time C++ object-oriented and template programming, -and the inate elegance and beauty of pure mathematics. +and the innate elegance and beauty of pure mathematics. ## Hardware Setup @@ -71,7 +72,7 @@ of the breadboard. The $12~\text{V}$ supply (center left) stems from a classic L voltage regulator, from which TTL $+5~\text{V}$ (upper left) is also derived for the MCU and logic power rail. -![](./images/board16_08.jpg) +![View of hardware setup](./images/board16_08.jpg) In this particular image, the system has accumulated a few hundred pseudo-random prime @@ -83,7 +84,7 @@ with the prime number theorem. The electronic subcircuit used for creating the random digitized noise is sketched below. -![](./images/circuit16_08.svg) +![Schematic view of the random noise generator subcircuit](./images/circuit16_08.svg) The oscilloscope image below shows a small snapshot of the random digitized noise from this circuit. @@ -91,13 +92,12 @@ The square-wave-like pulses result from digitizing the random signal above/below $0~\text{V}$. This is done with an op-amp and rudimentary logic, as shown in the circuit. -![](./images/signal16_08.jpg) +![View of the generated noise on oscilloscope](./images/signal16_08.jpg) ## Deep Connection to the Prime Number Theorem Recall the prime counting function -previously encountered in Example Chapter03_02 -[here](https://github.com/ckormanyos/real-time-cpp/tree/master/examples/chapter03_02#prime-counting-function). +previously encountered in Example [Chapter03_02](https://github.com/ckormanyos/real-time-cpp/tree/master/examples/chapter03_02#prime-counting-function). The prime number theorem known from mathematical number theory postulates that the prime counting function $\pi(x)$ for large $x$ asymptotically and approximately approaches @@ -148,7 +148,7 @@ $$ \left(\frac{2}{3}\right)~{\approx}~\frac{1}{24}\text{,} $$ -which is around $4\\%$. +which is around $4\%$. Sect. 16.8 in the book runs through the related, intriguing mathematics in great detail. From 3930a2fc5f007ee03943b9f1d5611bab49fdc24f Mon Sep 17 00:00:00 2001 From: Alejandro Casanova Date: Tue, 23 Jun 2026 16:50:22 +0200 Subject: [PATCH 2/8] improve schematic visualization using png instead of svg --- examples/chapter16_08/images/circuit16_08.png | Bin 0 -> 42380 bytes examples/chapter16_08/readme.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 examples/chapter16_08/images/circuit16_08.png diff --git a/examples/chapter16_08/images/circuit16_08.png b/examples/chapter16_08/images/circuit16_08.png new file mode 100644 index 0000000000000000000000000000000000000000..16e4d516dd2a20eabf5c78e5c6ffadfa5ebb2b3b GIT binary patch literal 42380 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 E0+2rKNdN!< literal 0 HcmV?d00001 diff --git a/examples/chapter16_08/readme.md b/examples/chapter16_08/readme.md index a11b8f9c7..8e3b8a476 100644 --- a/examples/chapter16_08/readme.md +++ b/examples/chapter16_08/readme.md @@ -84,7 +84,7 @@ with the prime number theorem. The electronic subcircuit used for creating the random digitized noise is sketched below. -![Schematic view of the random noise generator subcircuit](./images/circuit16_08.svg) +![Schematic view of the random noise generator subcircuit](./images/circuit16_08.png) The oscilloscope image below shows a small snapshot of the random digitized noise from this circuit. From a3b164dc888beed11b3813dcba62fdc7ed42a103 Mon Sep 17 00:00:00 2001 From: Alejandro Casanova Date: Tue, 23 Jun 2026 23:05:37 +0200 Subject: [PATCH 3/8] fix some typos and md formatting issues --- examples/chapter17_03/readme.md | 8 ++++---- examples/chapter17_03a/readme.md | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/chapter17_03/readme.md b/examples/chapter17_03/readme.md index 77936b4ae..862a7ac4e 100644 --- a/examples/chapter17_03/readme.md +++ b/examples/chapter17_03/readme.md @@ -1,4 +1,5 @@ # Example Chapter17_03 + ## Traditional C Language Code in a Modern C++ Project Example chapter17_03 depicts some methods that potentially allow @@ -61,13 +62,12 @@ void Crc08_Finalize (Crc08_Context_Type* Crc_Context); On top of the existing C-language CRC library we have built a skinny object-oriented C++ wrapper class architecture that allows the CRC objects to be used effectively in a -modern C++ envorinment. The application benchmark task, +modern C++ environment. The application benchmark task, for instance, tests all four CRC functions and compares the results with their expected values. As mentioned in -![Example chapter06_01](../chapter06_01), the standard +[Example chapter06_01](../chapter06_01), the standard CRC test involves the result of performing the CRC on the -bytes of the ACII digits -. +bytes of the ASCII digits $1$ through $9$. The application task `app::crc::task_func()` is shown below. diff --git a/examples/chapter17_03a/readme.md b/examples/chapter17_03a/readme.md index cfaebff61..be448719e 100644 --- a/examples/chapter17_03a/readme.md +++ b/examples/chapter17_03a/readme.md @@ -1,4 +1,5 @@ # Example Chapter17_03a + ## Traditional C-Language in Modern C++, Using Time Slices Example chapter17_03a is almost identical with @@ -105,7 +106,7 @@ void app::crc::task_func() // Finalize this CRC object. app_crc_checksums[app_crc_object_index]->finalize(); - // Increment to othe next CRC object in the list. + // Increment to the next CRC object in the list. ++app_crc_object_index; if(app_crc_object_index >= app_crc_checksums.size()) From aba58d97009b43ac99b3fab5efe2080cd74909a3 Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Fri, 26 Jun 2026 15:31:12 +0200 Subject: [PATCH 4/8] Minor upkeep and repair of CI --- .github/workflows/real-time-cpp.yml | 3 +- .../startup/coprocessor_binary.S | 110 +++++++++--------- .../make/xtensa_esp32_s3_riscv_cop_flags.gmk | 4 +- .../startup/Scripts/bin2asm.py | 62 +++++++++- 4 files changed, 117 insertions(+), 62 deletions(-) diff --git a/.github/workflows/real-time-cpp.yml b/.github/workflows/real-time-cpp.yml index ed0990af9..413039f08 100644 --- a/.github/workflows/real-time-cpp.yml +++ b/.github/workflows/real-time-cpp.yml @@ -107,7 +107,8 @@ jobs: echo 'Install osx-cross/homebrew-avr on MacOS via brew' cd ${{ runner.workspace }}/homebrew-avr brew tap osx-cross/avr - brew install avr-gcc@12 + brew trust --formula osx-cross/avr/avr-gcc@12 + brew install osx-cross/avr/avr-gcc@12 working-directory: ./ - name: target-avr-macos-${{ matrix.suite }} run: | diff --git a/ref_app/target/micros/xtensa_esp32_s3/startup/coprocessor_binary.S b/ref_app/target/micros/xtensa_esp32_s3/startup/coprocessor_binary.S index 7657d6dc8..37249e38e 100644 --- a/ref_app/target/micros/xtensa_esp32_s3/startup/coprocessor_binary.S +++ b/ref_app/target/micros/xtensa_esp32_s3/startup/coprocessor_binary.S @@ -2,56 +2,58 @@ .global coprocessor_bin coprocessor_bin: .byte 0x6F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00 - .byte 0x17, 0x11, 0x00, 0x00, 0x13, 0x01, 0xC1, 0x4B, 0x6F, 0x00, 0xC0, 0x28, 0x41, 0x11, 0x06, 0xC6 - .byte 0x31, 0x2A, 0xB2, 0x40, 0x41, 0x01, 0x82, 0x80, 0xB7, 0x16, 0x00, 0x50, 0x03, 0xA7, 0xC6, 0x09 - .byte 0xB7, 0x17, 0x00, 0x50, 0x93, 0x87, 0xC7, 0x0B, 0x3A, 0x95, 0x63, 0x74, 0xF5, 0x00, 0x23, 0xAE - .byte 0xA6, 0x08, 0x3A, 0x85, 0x82, 0x80, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00 - .byte 0x01, 0x00, 0xFD, 0xBF, 0x01, 0x00, 0x00, 0x00, 0x01, 0x45, 0x82, 0x80, 0x01, 0x00, 0x00, 0x00 - .byte 0x01, 0x45, 0x82, 0x80, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFD, 0xBF, 0x01, 0x00, 0x00, 0x00 - .byte 0x01, 0x00, 0xFD, 0xBF, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFD, 0xBF, 0x01, 0x00, 0x00, 0x00 - .byte 0x01, 0x00, 0xFD, 0xBF, 0x01, 0x00, 0x00, 0x00, 0x05, 0x45, 0x82, 0x80, 0x01, 0x00, 0x00, 0x00 - .byte 0x01, 0x45, 0x82, 0x80, 0x01, 0x00, 0x00, 0x00, 0x7D, 0x55, 0x82, 0x80, 0x01, 0x00, 0x00, 0x00 - .byte 0x7D, 0x55, 0x82, 0x80, 0x01, 0x00, 0x00, 0x00, 0x01, 0x45, 0x82, 0x80, 0x01, 0x00, 0x00, 0x00 - .byte 0x01, 0x45, 0x82, 0x80, 0x01, 0x00, 0x00, 0x00, 0x01, 0x45, 0x82, 0x80, 0x01, 0x00, 0x00, 0x00 - .byte 0x01, 0x45, 0x82, 0x80, 0x01, 0x00, 0x00, 0x00, 0x05, 0x45, 0x82, 0x80, 0x01, 0x00, 0x00, 0x00 - .byte 0x7D, 0x55, 0x82, 0x80, 0x01, 0x00, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00, 0x01, 0x45, 0x82, 0x80 - .byte 0x01, 0x00, 0x00, 0x00, 0x01, 0x45, 0x82, 0x80, 0x01, 0x00, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00 - .byte 0x01, 0x11, 0x2E, 0xC2, 0x32, 0xC4, 0x36, 0xC6, 0x3A, 0xC8, 0x3E, 0xCA, 0x42, 0xCC, 0x46, 0xCE - .byte 0x01, 0xA0, 0x00, 0x00, 0x41, 0x11, 0x01, 0x45, 0x06, 0xC6, 0x89, 0x28, 0x01, 0x45, 0xA9, 0x20 - .byte 0xB2, 0x40, 0x01, 0x45, 0x41, 0x01, 0x3D, 0xA0, 0x37, 0x15, 0x00, 0x50, 0x13, 0x05, 0xC5, 0x0B - .byte 0x82, 0x80, 0x00, 0x00, 0x41, 0x11, 0x06, 0xC6, 0xC5, 0x3F, 0x83, 0x47, 0x05, 0x00, 0x81, 0xE7 - .byte 0x85, 0x47, 0x23, 0x00, 0xF5, 0x00, 0xB2, 0x40, 0x41, 0x01, 0x82, 0x80, 0x01, 0x45, 0x81, 0x45 - .byte 0x82, 0x80, 0x00, 0x00, 0x37, 0x07, 0x0C, 0x60, 0x9D, 0x46, 0xBA, 0x87, 0x14, 0xC7, 0x13, 0x07 - .byte 0x10, 0x40, 0xB8, 0xD3, 0x82, 0x80, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00, 0x37, 0x37, 0x1D, 0x8F - .byte 0xB7, 0x87, 0x00, 0x60, 0x13, 0x07, 0xA7, 0x12, 0x23, 0xAC, 0xE7, 0x0A, 0x23, 0xAE, 0x07, 0x08 - .byte 0xB7, 0x06, 0x00, 0x40, 0x23, 0xAA, 0xD7, 0x0A, 0xB7, 0x46, 0xD8, 0x50, 0x23, 0xAC, 0x07, 0x0A - .byte 0x93, 0x86, 0x16, 0xAA, 0xB7, 0xF7, 0x01, 0x60, 0xF4, 0xD3, 0x23, 0xA4, 0x07, 0x04, 0x23, 0xA2 - .byte 0x07, 0x06, 0x82, 0x80, 0x01, 0x00, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00, 0x05, 0x45, 0x82, 0x80 - .byte 0x01, 0x00, 0x00, 0x00, 0x13, 0x07, 0x80, 0x3E, 0xAE, 0x87, 0x63, 0x73, 0xB7, 0x00, 0xBA, 0x87 - .byte 0x23, 0x14, 0xF5, 0x00, 0x82, 0x80, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00, 0xB1, 0x45, 0x79, 0xB5 - .byte 0x41, 0x11, 0x01, 0x45, 0x06, 0xC6, 0xB9, 0x3F, 0x37, 0x17, 0x00, 0x50, 0x13, 0x07, 0x07, 0x0C - .byte 0xB7, 0x1E, 0x00, 0x50, 0xA9, 0x66, 0x37, 0x08, 0x00, 0xF8, 0x83, 0x57, 0x67, 0x00, 0x83, 0x55 - .byte 0x47, 0x00, 0x93, 0x8E, 0x8E, 0x01, 0x93, 0x86, 0x06, 0x40, 0x7D, 0x18, 0x05, 0x47, 0x01, 0x4E - .byte 0x13, 0x05, 0x80, 0x3E, 0xB7, 0x08, 0x00, 0x08, 0x3A, 0x83, 0x63, 0x74, 0xE5, 0x00, 0x13, 0x03 - .byte 0x80, 0x3E, 0x42, 0x03, 0x11, 0x67, 0x13, 0x53, 0x03, 0x01, 0x6D, 0x07, 0x85, 0x07, 0xC2, 0x07 - .byte 0x90, 0x42, 0xC1, 0x83, 0x63, 0xE5, 0xF5, 0x02, 0x33, 0x66, 0x16, 0x01, 0x90, 0xC2, 0x7D, 0x17 - .byte 0x63, 0x8B, 0xA7, 0x00, 0x65, 0xF7, 0x05, 0x0E, 0x13, 0x77, 0xFE, 0x03, 0x06, 0x07, 0x76, 0x97 - .byte 0x03, 0x57, 0x07, 0x00, 0xD1, 0xB7, 0x9A, 0x85, 0x81, 0x47, 0x69, 0xFB, 0xED, 0xB7, 0x33, 0x76 - .byte 0x06, 0x01, 0x90, 0xC2, 0xE9, 0xBF, 0x01, 0x00, 0x37, 0x17, 0x00, 0x50, 0xB7, 0x17, 0x00, 0x50 - .byte 0x13, 0x07, 0x07, 0x0C, 0x93, 0x87, 0x87, 0x00, 0x1C, 0xC3, 0xA9, 0x67, 0x83, 0xA6, 0x07, 0x40 - .byte 0x37, 0x06, 0x00, 0xF8, 0x7D, 0x16, 0xF1, 0x8E, 0x23, 0xA0, 0xD7, 0x40, 0x03, 0xA5, 0x87, 0x4C - .byte 0x37, 0x08, 0x08, 0x00, 0xBE, 0x86, 0x33, 0x65, 0x05, 0x01, 0x23, 0xA4, 0xA7, 0x4C, 0x83, 0xA5 - .byte 0x07, 0x40, 0x37, 0x05, 0x00, 0x08, 0x6D, 0x8E, 0x23, 0xA0, 0xC7, 0x40, 0x83, 0xA7, 0xC7, 0x40 - .byte 0x23, 0x22, 0x07, 0x00, 0x23, 0x14, 0x07, 0x00, 0xC9, 0x8F, 0x23, 0xA6, 0xF6, 0x40, 0x82, 0x80 - .byte 0x01, 0x00, 0x00, 0x00, 0x41, 0x11, 0x06, 0xC6, 0xB1, 0x3D, 0x39, 0x20, 0xB1, 0x28, 0x6F, 0xF0 - .byte 0x3F, 0xF1, 0xDD, 0x35, 0xFD, 0xBF, 0x00, 0x00, 0x37, 0x16, 0x00, 0x50, 0x37, 0x17, 0x00, 0x50 - .byte 0x13, 0x06, 0x06, 0x0A, 0x13, 0x07, 0xC7, 0x09, 0x63, 0x0F, 0xE6, 0x00, 0xB7, 0x17, 0x00, 0x50 - .byte 0x19, 0x8E, 0x93, 0x87, 0xC7, 0x09, 0x3E, 0x96, 0x94, 0x43, 0x91, 0x07, 0x11, 0x07, 0x23, 0x2E - .byte 0xD7, 0xFE, 0xE3, 0x1B, 0xF6, 0xFE, 0xB7, 0x17, 0x00, 0x50, 0x37, 0x17, 0x00, 0x50, 0x93, 0x87 - .byte 0x07, 0x0A, 0x13, 0x07, 0xC7, 0x0C, 0x63, 0x87, 0xE7, 0x00, 0x23, 0xA0, 0x07, 0x00, 0x91, 0x07 - .byte 0xE3, 0x9D, 0xE7, 0xFE, 0x82, 0x80, 0x00, 0x00, 0x41, 0x11, 0x22, 0xC4, 0x26, 0xC2, 0x37, 0x14 - .byte 0x00, 0x50, 0xB7, 0x14, 0x00, 0x50, 0x06, 0xC6, 0x13, 0x04, 0xC4, 0x09, 0x93, 0x84, 0x84, 0x09 - .byte 0x63, 0x08, 0x94, 0x00, 0x83, 0x27, 0xC4, 0xFF, 0x71, 0x14, 0x82, 0x97, 0xE3, 0x1C, 0x94, 0xFE + .byte 0x17, 0x11, 0x00, 0x00, 0x13, 0x01, 0xC1, 0x4B, 0x6F, 0x00, 0x80, 0x29, 0xB7, 0x16, 0x00, 0x50 + .byte 0x03, 0xA7, 0xC6, 0x09, 0xB7, 0x17, 0x00, 0x50, 0x93, 0x87, 0xC7, 0x0B, 0x3A, 0x95, 0x63, 0x74 + .byte 0xF5, 0x00, 0x23, 0xAE, 0xA6, 0x08, 0x3A, 0x85, 0x82, 0x80, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00 + .byte 0x82, 0x80, 0x00, 0x00, 0x01, 0x11, 0x32, 0xC4, 0x36, 0xC6, 0x3A, 0xC8, 0x3E, 0xCA, 0x42, 0xCC + .byte 0x46, 0xCE, 0x7D, 0x55, 0x05, 0x61, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFD, 0xBF + .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0x82, 0x80 + .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFD, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFD, 0xBF + .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFD, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFD, 0xBF + .byte 0x00, 0x00, 0x00, 0x00, 0x05, 0x45, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0x82, 0x80 + .byte 0x00, 0x00, 0x00, 0x00, 0x7D, 0x55, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x55, 0x82, 0x80 + .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0x82, 0x80 + .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0x82, 0x80 + .byte 0x00, 0x00, 0x00, 0x00, 0x05, 0x45, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x55, 0x82, 0x80 + .byte 0x00, 0x00, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00, 0x01, 0x45, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00 + .byte 0x01, 0x45, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00, 0x01, 0x11, 0x2E, 0xC2 + .byte 0x32, 0xC4, 0x36, 0xC6, 0x3A, 0xC8, 0x3E, 0xCA, 0x42, 0xCC, 0x46, 0xCE, 0x01, 0xA0, 0x00, 0x00 + .byte 0x41, 0x11, 0x01, 0x45, 0x06, 0xC6, 0x89, 0x28, 0x01, 0x45, 0xA9, 0x20, 0xB2, 0x40, 0x01, 0x45 + .byte 0x41, 0x01, 0x3D, 0xA0, 0x37, 0x15, 0x00, 0x50, 0x13, 0x05, 0xC5, 0x0B, 0x82, 0x80, 0x00, 0x00 + .byte 0x41, 0x11, 0x06, 0xC6, 0xC5, 0x3F, 0x83, 0x47, 0x05, 0x00, 0x81, 0xE7, 0x85, 0x47, 0x23, 0x00 + .byte 0xF5, 0x00, 0xB2, 0x40, 0x41, 0x01, 0x82, 0x80, 0x01, 0x45, 0x81, 0x45, 0x82, 0x80, 0x00, 0x00 + .byte 0x37, 0x07, 0x0C, 0x60, 0x9D, 0x46, 0xBA, 0x87, 0x14, 0xC7, 0x13, 0x07, 0x10, 0x40, 0xB8, 0xD3 + .byte 0x82, 0x80, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00, 0xB7, 0x37, 0x1D, 0x8F, 0x37, 0x87, 0x00, 0x60 + .byte 0x93, 0x87, 0xA7, 0x12, 0x23, 0x2C, 0xF7, 0x0A, 0x23, 0x2E, 0x07, 0x08, 0xB7, 0x06, 0x00, 0x40 + .byte 0x23, 0x2A, 0xD7, 0x0A, 0xB7, 0x46, 0xD8, 0x50, 0xB7, 0xF7, 0x01, 0x60, 0x23, 0x2C, 0x07, 0x0A + .byte 0x93, 0x86, 0x16, 0xAA, 0xF4, 0xD3, 0x23, 0xA4, 0x07, 0x04, 0x23, 0xA2, 0x07, 0x06, 0x82, 0x80 + .byte 0x00, 0x00, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00, 0x05, 0x45, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00 + .byte 0x13, 0x07, 0x80, 0x3E, 0xAE, 0x87, 0x63, 0x73, 0xB7, 0x00, 0xBA, 0x87, 0x23, 0x14, 0xF5, 0x00 + .byte 0x82, 0x80, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00, 0xB1, 0x45, 0x9D, 0xBD, 0x41, 0x11, 0x01, 0x45 + .byte 0x06, 0xC6, 0xB9, 0x3F, 0x37, 0x17, 0x00, 0x50, 0x13, 0x07, 0x07, 0x0C, 0xB7, 0x1E, 0x00, 0x50 + .byte 0xA9, 0x66, 0x37, 0x08, 0x00, 0xF8, 0x83, 0x57, 0x67, 0x00, 0x83, 0x55, 0x47, 0x00, 0x93, 0x8E + .byte 0x8E, 0x01, 0x93, 0x86, 0x06, 0x40, 0x7D, 0x18, 0x05, 0x47, 0x01, 0x4E, 0x13, 0x05, 0x80, 0x3E + .byte 0xB7, 0x08, 0x00, 0x08, 0x3A, 0x83, 0x63, 0x74, 0xE5, 0x00, 0x13, 0x03, 0x80, 0x3E, 0x42, 0x03 + .byte 0x11, 0x67, 0x13, 0x53, 0x03, 0x01, 0x6D, 0x07, 0x85, 0x07, 0xC2, 0x07, 0x90, 0x42, 0xC1, 0x83 + .byte 0x63, 0xE5, 0xF5, 0x02, 0x33, 0x66, 0x16, 0x01, 0x90, 0xC2, 0x7D, 0x17, 0x63, 0x8B, 0xA7, 0x00 + .byte 0x65, 0xF7, 0x05, 0x0E, 0x13, 0x77, 0xFE, 0x03, 0x06, 0x07, 0x76, 0x97, 0x03, 0x57, 0x07, 0x00 + .byte 0xD1, 0xB7, 0x9A, 0x85, 0x81, 0x47, 0x69, 0xFB, 0xED, 0xB7, 0x33, 0x76, 0x06, 0x01, 0x90, 0xC2 + .byte 0xE9, 0xBF, 0x00, 0x00, 0x37, 0x17, 0x00, 0x50, 0xB7, 0x16, 0x00, 0x50, 0xA9, 0x67, 0x13, 0x07 + .byte 0x07, 0x0C, 0x93, 0x86, 0x86, 0x00, 0x14, 0xC3, 0x83, 0xA6, 0x07, 0x40, 0x37, 0x06, 0x00, 0xF8 + .byte 0x7D, 0x16, 0xF1, 0x8E, 0x23, 0xA0, 0xD7, 0x40, 0x03, 0xA5, 0x87, 0x4C, 0x37, 0x08, 0x08, 0x00 + .byte 0xBE, 0x86, 0x33, 0x65, 0x05, 0x01, 0x23, 0xA4, 0xA7, 0x4C, 0x83, 0xA5, 0x07, 0x40, 0x37, 0x05 + .byte 0x00, 0x08, 0x6D, 0x8E, 0x23, 0xA0, 0xC7, 0x40, 0x83, 0xA7, 0xC7, 0x40, 0x23, 0x22, 0x07, 0x00 + .byte 0x23, 0x14, 0x07, 0x00, 0xC9, 0x8F, 0x23, 0xA6, 0xF6, 0x40, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00 + .byte 0x41, 0x11, 0x06, 0xC6, 0xB1, 0x3D, 0x39, 0x20, 0xB5, 0x20, 0x6F, 0xF0, 0x3F, 0xF1, 0xDD, 0x35 + .byte 0xFD, 0xBF, 0x00, 0x00, 0xB7, 0x16, 0x00, 0x50, 0x37, 0x17, 0x00, 0x50, 0x93, 0x86, 0x06, 0x0A + .byte 0x93, 0x05, 0xC7, 0x09, 0xB7, 0x17, 0x00, 0x50, 0x33, 0x85, 0xB6, 0x40, 0x13, 0x86, 0xC7, 0x09 + .byte 0x2A, 0x96, 0x63, 0x8D, 0xB6, 0x00, 0x13, 0x07, 0xC7, 0x09, 0x93, 0x87, 0xC7, 0x09, 0x94, 0x43 + .byte 0x91, 0x07, 0x11, 0x07, 0x23, 0x2E, 0xD7, 0xFE, 0xE3, 0x1B, 0xF6, 0xFE, 0xB7, 0x17, 0x00, 0x50 + .byte 0x37, 0x17, 0x00, 0x50, 0x93, 0x86, 0x07, 0x0A, 0x13, 0x07, 0xC7, 0x0C, 0x63, 0x89, 0xE6, 0x00 + .byte 0x93, 0x87, 0x07, 0x0A, 0x23, 0xA0, 0x07, 0x00, 0x91, 0x07, 0xE3, 0x9D, 0xE7, 0xFE, 0x82, 0x80 + .byte 0x00, 0x00, 0x00, 0x00, 0x41, 0x11, 0x22, 0xC4, 0x26, 0xC2, 0x37, 0x14, 0x00, 0x50, 0xB7, 0x14 + .byte 0x00, 0x50, 0x06, 0xC6, 0x93, 0x07, 0xC4, 0x09, 0x93, 0x84, 0x84, 0x09, 0x63, 0x8A, 0x97, 0x00 + .byte 0x13, 0x04, 0xC4, 0x09, 0x83, 0x27, 0xC4, 0xFF, 0x71, 0x14, 0x82, 0x97, 0xE3, 0x1C, 0x94, 0xFE .byte 0xB2, 0x40, 0x22, 0x44, 0x92, 0x44, 0x41, 0x01, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 @@ -255,10 +257,8 @@ coprocessor_bin: .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x50, 0xBC, 0x01, 0x00, 0x50 - .byte 0x9C, 0x01, 0x00, 0x50, 0xA4, 0x01, 0x00, 0x50, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x01, 0x00, 0x50, 0xC8, 0x01, 0x00, 0x50 + .byte 0xA8, 0x01, 0x00, 0x50, 0xB0, 0x01, 0x00, 0x50, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00 .byte 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x00 .byte 0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00 .byte 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1A, 0x00, 0x1B, 0x00, 0x1C, 0x00 @@ -266,4 +266,4 @@ coprocessor_bin: .byte 0x26, 0x00, 0x28, 0x00, 0x2A, 0x00, 0x2C, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x32, 0x00, 0x34, 0x00 .byte 0x36, 0x00, 0x38, 0x00, 0x3A, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x42, 0x00, 0x44, 0x00, 0x46, 0x00 .byte 0x48, 0x00, 0x4A, 0x00, 0x4C, 0x00, 0x4E, 0x00, 0x50, 0x00, 0x52, 0x00, 0x54, 0x00, 0x56, 0x00 - .byte 0x59, 0x00, 0x5C, 0x00, 0x60, 0x00, 0x64, 0x00, 0x48, 0x02, 0x00, 0x50, 0xAC, 0x10, 0x00, 0x50 + .byte 0x59, 0x00, 0x5C, 0x00, 0x60, 0x00, 0x64, 0x00, 0x54, 0x02, 0x00, 0x50, 0xAC, 0x10, 0x00, 0x50 diff --git a/ref_app/target/micros/xtensa_esp32_s3_riscv_cop/make/xtensa_esp32_s3_riscv_cop_flags.gmk b/ref_app/target/micros/xtensa_esp32_s3_riscv_cop/make/xtensa_esp32_s3_riscv_cop_flags.gmk index bce3b52d6..887eba1ba 100644 --- a/ref_app/target/micros/xtensa_esp32_s3_riscv_cop/make/xtensa_esp32_s3_riscv_cop_flags.gmk +++ b/ref_app/target/micros/xtensa_esp32_s3_riscv_cop/make/xtensa_esp32_s3_riscv_cop_flags.gmk @@ -87,8 +87,8 @@ PYTHON := python BIN2ASM_FLAGS := -s ".coprocessor" \ - -l 16 \ - -g coprocessor_bin + -l 16 \ + -g coprocessor_bin RULE_SPECIAL_MAKE_IMAGE_FILE_PART00 := $(ECHO) +++ creating binary $(APP).bin diff --git a/ref_app/target/micros/xtensa_esp32_s3_riscv_cop/startup/Scripts/bin2asm.py b/ref_app/target/micros/xtensa_esp32_s3_riscv_cop/startup/Scripts/bin2asm.py index 90bf2a262..32c4b0be0 100644 --- a/ref_app/target/micros/xtensa_esp32_s3_riscv_cop/startup/Scripts/bin2asm.py +++ b/ref_app/target/micros/xtensa_esp32_s3_riscv_cop/startup/Scripts/bin2asm.py @@ -9,12 +9,49 @@ # Date : 27.02.2025 # # Description : convert a binary image to assembly file +# 2026-01-15: Added path validation to ensure input/output +# files are within allowed base directory # ##################################################################################### import argparse +import sys +import re +from pathlib import Path -def binary_to_assembly(input_file, output_file, section_name, symbol_name, bytes_per_line): - with open(input_file, "rb") as f: +def is_within_directory(path: Path, base: Path) -> bool: + try: + path_resolved = path.resolve(strict=False) + base_resolved = base.resolve(strict=False) + return base_resolved == path_resolved or base_resolved in path_resolved.parents + except Exception: + return False + +def validate_path(path_str: str, base: Path, must_exist: bool = False, allow_create_parent: bool = False) -> Path: + path = Path(path_str) + # If user provided a relative path, make it relative to cwd then resolve + try: + resolved = path.resolve(strict=must_exist) + except Exception: + # If must_exist is False, resolve with strict=False to avoid exceptions for non-existent files + resolved = path.resolve(strict=False) + if not is_within_directory(resolved, base): + raise ValueError(f"Path '{path_str}' is outside allowed base directory '{base}'") + if must_exist and not resolved.exists(): + raise ValueError(f"Required path does not exist: '{resolved}'") + if allow_create_parent: + parent = resolved.parent + if not is_within_directory(parent, base): + raise ValueError(f"Parent directory '{parent}' is outside allowed base '{base}'") + return resolved + +def validate_names(section_name: str, symbol_name: str): + if not re.match(r'^[A-Za-z0-9_.-]+$', section_name): + raise ValueError(f"Invalid section name: '{section_name}'") + if not re.match(r'^[A-Za-z_]\w*$', symbol_name): + raise ValueError(f"Invalid symbol name: '{symbol_name}'") + +def binary_to_assembly(input_file: Path, output_file: Path, section_name: str, symbol_name: str, bytes_per_line: int): + with input_file.open("rb") as f: data = f.read() asm_lines = [ @@ -28,7 +65,9 @@ def binary_to_assembly(input_file, output_file, section_name, symbol_name, bytes byte_list = ", ".join(f"0x{b:02X}" for b in chunk) asm_lines.append(f" .byte {byte_list}") - with open(output_file, "w") as f: + # Safe creation and write (parent path was validated before calling) + output_file.parent.mkdir(parents=True, exist_ok=True) + with output_file.open("w", newline="\n") as f: f.write("\n".join(asm_lines) + "\n") if __name__ == "__main__": @@ -38,6 +77,21 @@ def binary_to_assembly(input_file, output_file, section_name, symbol_name, bytes parser.add_argument("-s", "--section", required=True, help="Target section name") parser.add_argument("-g", "--symbol", required=True, help="Global symbol name") parser.add_argument("-l", "--length", type=int, required=True, help="Number of bytes per .byte line") + parser.add_argument("--root", required=False, default=".", help="Allowed base root directory (default: current working directory)") args = parser.parse_args() - binary_to_assembly(args.input, args.output, args.section, args.symbol, args.length) + + if args.length <= 0 or args.length > 4096: + print("Error: --length must be between 1 and 4096", file=sys.stderr) + sys.exit(2) + + base_dir = Path(args.root).resolve() + try: + input_path = validate_path(args.input, base_dir, must_exist=True) + output_path = validate_path(args.output, base_dir, must_exist=False, allow_create_parent=True) + validate_names(args.section, args.symbol) + except ValueError as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(2) + + binary_to_assembly(input_path, output_path, args.section, args.symbol, args.length) From 9ab4cf62e2053b309c76bc418dc17072ae3e2cc6 Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Fri, 26 Jun 2026 15:39:56 +0200 Subject: [PATCH 5/8] Merge master and bump up osx cross avr --- .github/workflows/real-time-cpp.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/real-time-cpp.yml b/.github/workflows/real-time-cpp.yml index 413039f08..e81aec95c 100644 --- a/.github/workflows/real-time-cpp.yml +++ b/.github/workflows/real-time-cpp.yml @@ -107,15 +107,15 @@ jobs: echo 'Install osx-cross/homebrew-avr on MacOS via brew' cd ${{ runner.workspace }}/homebrew-avr brew tap osx-cross/avr - brew trust --formula osx-cross/avr/avr-gcc@12 - brew install osx-cross/avr/avr-gcc@12 + brew trust --formula osx-cross/avr/avr-gcc@15 + brew install osx-cross/avr/avr-gcc@15 working-directory: ./ - name: target-avr-macos-${{ matrix.suite }} run: | echo query the GNUmake version make --version - echo Add the brew-installed-avr-gcc@12 path - PATH="/opt/homebrew/opt/avr-gcc@12/bin:$PATH" + echo Add the brew-installed-avr-gcc@15 path + PATH="/opt/homebrew/opt/avr-gcc@15/bin:$PATH" echo "" echo Query the avr-gcc version avr-g++ -v From c6051404a932037fd29564338dd07c3062d3578e Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Fri, 26 Jun 2026 16:33:45 +0200 Subject: [PATCH 6/8] Brew trusts the needed packages --- .github/workflows/real-time-cpp.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/real-time-cpp.yml b/.github/workflows/real-time-cpp.yml index e81aec95c..b2590f68e 100644 --- a/.github/workflows/real-time-cpp.yml +++ b/.github/workflows/real-time-cpp.yml @@ -102,12 +102,11 @@ jobs: working-directory: ./ - name: install-osx-cross-homebrew-avr run: | - echo 'Tap osx-cross/homebrew-avr on MacOS via brew' + echo 'Tap, trust and install osx-cross/avr on MacOS via brew' echo "" - echo 'Install osx-cross/homebrew-avr on MacOS via brew' cd ${{ runner.workspace }}/homebrew-avr brew tap osx-cross/avr - brew trust --formula osx-cross/avr/avr-gcc@15 + brew trust aws/tap azure/bicep osx-cross/avr brew install osx-cross/avr/avr-gcc@15 working-directory: ./ - name: target-avr-macos-${{ matrix.suite }} From 0c2d9fbf939f757356de0d248cc65d47b28fb7d0 Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Fri, 26 Jun 2026 17:03:02 +0200 Subject: [PATCH 7/8] Update docs --- code_snippets/readme.md | 10 ++++------ examples/chapter16_08/readme.md | 2 +- examples/readme.md | 13 +++++-------- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/code_snippets/readme.md b/code_snippets/readme.md index b78b38520..59636ca15 100644 --- a/code_snippets/readme.md +++ b/code_snippets/readme.md @@ -10,12 +10,10 @@ Real-Time-C++ - Code Snippets

-These are the code snippets from the chapters of the book -C.M. Kormanyos, -[Real-Time C++](https://www.springer.com/de/book/9783662629956): -Efficient Object-Oriented -and Template Microcontroller Programming, Fourth Edition -(Springer, Heidelberg, 2021) ISBN 9783662629956. +These are the code snippets from the chapters +of the book C.M. Kormanyos, _Real-Time_ _C++:_ _Efficient_ _Object-Oriented_ +_and_ _Template_ _Microcontroller_ _Programming_, _4_$^{th}$ _Edition_ +and are made available for educational and exploratory use. ## Summary of the Code Snippets diff --git a/examples/chapter16_08/readme.md b/examples/chapter16_08/readme.md index 8e3b8a476..ddcf18b1c 100644 --- a/examples/chapter16_08/readme.md +++ b/examples/chapter16_08/readme.md @@ -148,7 +148,7 @@ $$ \left(\frac{2}{3}\right)~{\approx}~\frac{1}{24}\text{,} $$ -which is around $4\%$. +which is around $4\\%$. Sect. 16.8 in the book runs through the related, intriguing mathematics in great detail. diff --git a/examples/readme.md b/examples/readme.md index b7a22cd1e..dd8a759e7 100644 --- a/examples/readme.md +++ b/examples/readme.md @@ -9,12 +9,9 @@ godbolt

-These examples are motivated by the book -C.M. Kormanyos, -[Real-Time C++](https://www.springer.com/de/book/9783662629956): -Efficient Object-Oriented -and Template Microcontroller Programming, Fourth Edition -(Springer, Heidelberg, 2021) ISBN 9783662629956. +These examples are motivated by the book C.M. Kormanyos, _Real-Time_ _C++:_ +_Efficient_ _Object-Oriented_ _and_ _Template_ _Microcontroller_ _Programming_, _4_$^{th}$ _Edition_ +and are made available for educational and exploratory use. The first couple of example projects can use the ARDUINO board directly and non-modified. Examples from the later chapters in the book do, however, @@ -140,11 +137,11 @@ in each individual example directory. ## Try it at _godbolt_

- + godbolt

-Use this [short link](https://godbolt.org/z/fxWzb6h6f) +Use this [short link](https://godbolt.org/z/jTPPo51aM) to [godbolt](https://godbolt.org) in order to further explore Example [chapter02_02](https://github.com/ckormanyos/real-time-cpp/tree/master/examples/chapter02_02) (the LED program). In the link, the main source file of the example From ee73b84c80ae0173218125305c4758c613293e8d Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Fri, 26 Jun 2026 17:23:27 +0200 Subject: [PATCH 8/8] Update example-docs godbolt links --- examples/chapter02_02/readme.md | 6 +++--- examples/chapter03_02/readme.md | 4 ++-- examples/chapter06_01/readme.md | 4 ++-- examples/chapter10_08/readme.md | 4 ++-- examples/readme.md | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/chapter02_02/readme.md b/examples/chapter02_02/readme.md index d7444b134..d018c24c6 100644 --- a/examples/chapter02_02/readme.md +++ b/examples/chapter02_02/readme.md @@ -3,7 +3,7 @@ ## The LED program

- + godbolt

@@ -160,7 +160,7 @@ such as: ## Try it at _godbolt_ -Use the following [short link](https://godbolt.org/z/v5f45fMqq) +Use the following [short link](https://godbolt.org/z/zbcof9E94) to [godbolt](https://godbolt.org) in order to further explore this program. In the afore-mentioned link, the file [`led.cpp`](./led.cpp) is, @@ -171,7 +171,7 @@ but not executed because there is no target hardware available. ### On the Metal: _Clear_ and _Set_ Bit Consider the assembly output near the bottom of the page in the right-side tab -of the [short link](https://godbolt.org/z/v5f45fMqq) +of the [short link](https://godbolt.org/z/zbcof9E94) to [godbolt](https://godbolt.org). Upon close investigation, the bit-_clear_ and bit-_set_ opcodes (`cbi` and `sbi`) can be recognized. diff --git a/examples/chapter03_02/readme.md b/examples/chapter03_02/readme.md index ac05ff2ac..2ee66156c 100644 --- a/examples/chapter03_02/readme.md +++ b/examples/chapter03_02/readme.md @@ -3,7 +3,7 @@ ## Integer Types Having Fixed Widths and Prime Numbers

- + godbolt

@@ -89,7 +89,7 @@ A nifty little PC-based sieving program from the code snippets area helps to [explore prime numbers](../../code_snippets/chapter03/chapter03_02-002a_explore_prime_numbers.cpp). This code can be run in its entirety at the following -[short link](https://godbolt.org/z/dPbM7v4ff) to [godbolt](https://godbolt.org). +[short link](https://godbolt.org/z/Pa3WbG8h6) to [godbolt](https://godbolt.org). ## Prime Counting Function diff --git a/examples/chapter06_01/readme.md b/examples/chapter06_01/readme.md index c159bd33d..d6f4fdf6e 100644 --- a/examples/chapter06_01/readme.md +++ b/examples/chapter06_01/readme.md @@ -3,7 +3,7 @@ ## A CRC Benchmark

- + godbolt

@@ -91,7 +91,7 @@ The expected result of the CRC-32/MPEG-2 of these data bytes is `0x0376'E6E7`. This code can be run in its entirety at the following -[short link](https://godbolt.org/z/ssTK8TjWj) to [godbolt](https://godbolt.org). +[short link](https://godbolt.org/z/vvobo4Pnq) to [godbolt](https://godbolt.org). The application benchmark task `app::benchmark::task_func` computes the CRC-32/MPEG-2. The computation is run to completion diff --git a/examples/chapter10_08/readme.md b/examples/chapter10_08/readme.md index 561157a86..5d884fd32 100644 --- a/examples/chapter10_08/readme.md +++ b/examples/chapter10_08/readme.md @@ -3,7 +3,7 @@ ## External SPI RAM and Computing 10,001 Digits of Pi

- + godbolt

@@ -66,7 +66,7 @@ A similar implementation of the Pi Spigot program has been setup at [godbolt](https://godbolt.org), where it can be compiled and executed. This setup computes $10,001$ decimal digits of $\pi$. -Use the following [short link](https://godbolt.org/z/EMx88ocxn) +Use the following [short link](https://godbolt.org/z/cr7MxKsK3) to further explore this program. ## 8-Bit MCU Adaptions diff --git a/examples/readme.md b/examples/readme.md index dd8a759e7..0089663f6 100644 --- a/examples/readme.md +++ b/examples/readme.md @@ -5,7 +5,7 @@ Build Examples Boost Software License 1.0 - + godbolt

@@ -137,11 +137,11 @@ in each individual example directory. ## Try it at _godbolt_

- + godbolt

-Use this [short link](https://godbolt.org/z/jTPPo51aM) +Use this [short link](https://godbolt.org/z/zbcof9E94) to [godbolt](https://godbolt.org) in order to further explore Example [chapter02_02](https://github.com/ckormanyos/real-time-cpp/tree/master/examples/chapter02_02) (the LED program). In the link, the main source file of the example