diff --git a/.github/workflows/real-time-cpp.yml b/.github/workflows/real-time-cpp.yml
index dce3d83a2..30bdb0b43 100644
--- a/.github/workflows/real-time-cpp.yml
+++ b/.github/workflows/real-time-cpp.yml
@@ -236,19 +236,19 @@ jobs:
strategy:
fail-fast: false
matrix:
- suite: [ riscvfe310, wch_ch32v307, xtensa_esp32_s3_riscv_cop ]
+ suite: [ bl602_sifive_e24_riscv, riscvfe310, wch_ch32v307, xtensa_esp32_s3_riscv_cop ]
steps:
- uses: actions/checkout@v4
with:
fetch-depth: '0'
- name: update-tools
run: |
- wget --no-check-certificate https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v14.2.0-3/xpack-riscv-none-elf-gcc-14.2.0-3-linux-x64.tar.gz
- tar -xzf xpack-riscv-none-elf-gcc-14.2.0-3-linux-x64.tar.gz -C ${{ runner.workspace }}
+ wget --no-check-certificate https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v15.2.0-1/xpack-riscv-none-elf-gcc-15.2.0-1-linux-x64.tar.gz
+ tar -xzf xpack-riscv-none-elf-gcc-15.2.0-1-linux-x64.tar.gz -C ${{ runner.workspace }}
working-directory: ./
- name: target-riscv-${{ matrix.suite }}
run: |
- PATH="${{ runner.workspace }}/xpack-riscv-none-elf-gcc-14.2.0-3/bin:$PATH"
+ PATH="${{ runner.workspace }}/xpack-riscv-none-elf-gcc-15.2.0-1/bin:$PATH"
./target/build/build.sh ${{ matrix.suite }} rebuild
ls -la ./bin/ref_app.elf ./bin/ref_app.hex ./bin/ref_app.map ./bin/ref_app.s19
working-directory: ./ref_app/
diff --git a/readme.md b/readme.md
index d33c35783..0513bd466 100644
--- a/readme.md
+++ b/readme.md
@@ -71,11 +71,12 @@ The reference application supports the following targets (in alpha-numeric order
| Target name (as used in build command) | Target Description | *(breadboard) |
| -------------------------------------- | ----------------------------------------------------------- | ------------- |
| `am335x` | BeagleBone with Texas Instruments(R) AM335x ARM(R) A8 | |
-| `am6254_soc_` | PocketBeagle2 with multicore Texas Instruments(R) AM6254 | |
+| `am6254_soc` | PocketBeagle2 with multicore Texas Instruments(R) AM6254 | |
| `atmega2560` | MICROCHIP(R) [former ATMEL(R)] AVR(R) ATmega2560 | |
| `atmega4809` | MICROCHIP(R) [former ATMEL(R)] AVR(R) ATmegax4809 | X |
| `avr` (as used in the book) | MICROCHIP(R) [former ATMEL(R)] AVR(R) ATmega328P | X |
| `bcm2835_raspi_b` | RaspberryPi(R) Zero with ARM1176-JZFS(TM) | X |
+| `bl602_sifive_e24_riscv` | BL602 single-core RISC-V (SiFive E24) | X |
| `Debug`/`Release` | PC on `Win*` via MSVC x64 compiler `Debug`/`Release` | |
| `host` | PC/Workstation on `Win*`/`mingw64`/`*nix` via host compiler | |
| `lpc11c24` | NXP(R) OM13093 LPC11C24 board ARM(R) Cortex(R)-M0+ | |
@@ -415,6 +416,13 @@ called `target avr` (as used in the book) runs
on a classic ARDUINO(R) compatible board.
The program toggles the yellow LED on `portb.5`.
+Target `bl602_sifive_e24_riscv` contains a fully manually-written bare-metal project
+for the BL602 single-core RISC-V (SiFive E24), making no use of any SDK.
+The boot code and bare-metal register interactions are based
+on the creative work in
+[`Chalandi/Baremetal_BL602_SiFive_E24_RISC-V`](https://github.com/Chalandi/Baremetal_BL602_SiFive_E24_RISC-V).
+This configuration toggles pin `IO3` and requires a self-fitted LED.
+
The ARM(R) 1176-JZF-S configuration (called `target bcm2835_raspi_b`) runs on the
RaspberryPi(R) Zero (PiZero) single core controller.
This project creates a bare-metal program for the PiZero.
diff --git a/ref_app/ref_app.sln b/ref_app/ref_app.sln
index 27c76958b..3982452de 100644
--- a/ref_app/ref_app.sln
+++ b/ref_app/ref_app.sln
@@ -52,6 +52,7 @@ Global
target atmega4809|x64 = target atmega4809|x64
target avr|x64 = target avr|x64
target bcm2835_raspi_b|x64 = target bcm2835_raspi_b|x64
+ target bl602_sifive_e24_riscv|x64 = target bl602_sifive_e24_riscv|x64
target lpc11c24|x64 = target lpc11c24|x64
target nxp_imxrt1062|x64 = target nxp_imxrt1062|x64
target riscvfe310|x64 = target riscvfe310|x64
@@ -86,6 +87,7 @@ Global
{C8B59726-9319-45C3-8F11-F9F388FB6A2C}.target atmega4809|x64.ActiveCfg = Release|x64
{C8B59726-9319-45C3-8F11-F9F388FB6A2C}.target avr|x64.ActiveCfg = Release|x64
{C8B59726-9319-45C3-8F11-F9F388FB6A2C}.target bcm2835_raspi_b|x64.ActiveCfg = Release|x64
+ {C8B59726-9319-45C3-8F11-F9F388FB6A2C}.target bl602_sifive_e24_riscv|x64.ActiveCfg = Release|x64
{C8B59726-9319-45C3-8F11-F9F388FB6A2C}.target lpc11c24|x64.ActiveCfg = Release|x64
{C8B59726-9319-45C3-8F11-F9F388FB6A2C}.target nxp_imxrt1062|x64.ActiveCfg = Release|x64
{C8B59726-9319-45C3-8F11-F9F388FB6A2C}.target riscvfe310|x64.ActiveCfg = Release|x64
@@ -122,6 +124,8 @@ Global
{30CE370B-40F3-4BCD-8986-64AAFF8971BD}.target avr|x64.Build.0 = target avr|x64
{30CE370B-40F3-4BCD-8986-64AAFF8971BD}.target bcm2835_raspi_b|x64.ActiveCfg = target bcm2835_raspi_b|x64
{30CE370B-40F3-4BCD-8986-64AAFF8971BD}.target bcm2835_raspi_b|x64.Build.0 = target bcm2835_raspi_b|x64
+ {30CE370B-40F3-4BCD-8986-64AAFF8971BD}.target bl602_sifive_e24_riscv|x64.ActiveCfg = target bl602_sifive_e24_riscv|x64
+ {30CE370B-40F3-4BCD-8986-64AAFF8971BD}.target bl602_sifive_e24_riscv|x64.Build.0 = target bl602_sifive_e24_riscv|x64
{30CE370B-40F3-4BCD-8986-64AAFF8971BD}.target lpc11c24|x64.ActiveCfg = target lpc11c24|x64
{30CE370B-40F3-4BCD-8986-64AAFF8971BD}.target lpc11c24|x64.Build.0 = target lpc11c24|x64
{30CE370B-40F3-4BCD-8986-64AAFF8971BD}.target nxp_imxrt1062|x64.ActiveCfg = target nxp_imxrt1062|x64
diff --git a/ref_app/ref_app.vcxproj b/ref_app/ref_app.vcxproj
index 4e6589d0c..f2516d0f2 100644
--- a/ref_app/ref_app.vcxproj
+++ b/ref_app/ref_app.vcxproj
@@ -473,6 +473,46 @@
true
true
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
@@ -1868,6 +1908,62 @@
true
true
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ true
+ true
+
diff --git a/ref_app/ref_app.vcxproj.filters b/ref_app/ref_app.vcxproj.filters
index 2e21722da..1f465dc55 100644
--- a/ref_app/ref_app.vcxproj.filters
+++ b/ref_app/ref_app.vcxproj.filters
@@ -281,6 +281,9 @@
{74714130-9ba7-45a5-a860-74f8cb6eae22}
+
+ {9575513c-b5da-473e-9095-bbd968c02f6b}
+
@@ -1303,6 +1306,36 @@
src\mcal\am6254_soc
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
@@ -2952,6 +2985,48 @@
src\util\utility
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
+
+ src\mcal\bl602_sifive_e24_riscv
+
diff --git a/ref_app/src/mcal/am6254_soc/mcal_gpt.cpp b/ref_app/src/mcal/am6254_soc/mcal_gpt.cpp
index 57684bdc0..61de864ea 100644
--- a/ref_app/src/mcal/am6254_soc/mcal_gpt.cpp
+++ b/ref_app/src/mcal/am6254_soc/mcal_gpt.cpp
@@ -11,11 +11,19 @@
auto mcal::gpt::secure::get_time_elapsed() -> mcal::gpt::value_type
{
- // Get the system tick from the system counter register.
- const value_type consistent_microsecond_tick = static_cast(ARM64_READ_SYSREG(CNTPCT_EL0));
+ // Get the consistent system tick from the system counter register.
+ const value_type
+ consistent_microsecond_tick
+ {
+ static_cast(ARM64_READ_SYSREG(CNTPCT_EL0))
+ };
// Convert the consistent tick to microseconds.
- return static_cast(static_cast(consistent_microsecond_tick + UINT64_C(100)) / UINT64_C(200));
+ return
+ static_cast
+ (
+ static_cast(consistent_microsecond_tick + UINT64_C(100)) / UINT64_C(200)
+ );
}
auto mcal::gpt::secure::get_time_elapsed_core1() -> mcal::gpt::value_type_core1
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_benchmark.h b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_benchmark.h
new file mode 100644
index 000000000..0b641207f
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_benchmark.h
@@ -0,0 +1,24 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2014 - 2025.
+// 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)
+//
+
+#ifndef MCAL_BENCHMARK_2014_04_16_H
+ #define MCAL_BENCHMARK_2014_04_16_H
+
+ #include
+ #include
+
+ #include
+
+ namespace mcal
+ {
+ namespace benchmark
+ {
+ using benchmark_port_type = mcal::port::port_pin;
+ }
+ }
+
+#endif // MCAL_BENCHMARK_2014_04_16_H
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_cpu.cpp b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_cpu.cpp
new file mode 100644
index 000000000..248a6d828
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_cpu.cpp
@@ -0,0 +1,12 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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
+
+auto mcal::cpu::init() -> void
+{
+}
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_cpu.h b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_cpu.h
new file mode 100644
index 000000000..9ac5039be
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_cpu.h
@@ -0,0 +1,25 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2025.
+// 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)
+//
+
+#ifndef MCAL_CPU_2025_07_30_H
+ #define MCAL_CPU_2025_07_30_H
+
+ #include
+
+ namespace mcal
+ {
+ namespace cpu
+ {
+ auto init() -> void;
+
+ inline auto post_init() -> void { }
+
+ inline auto nop() noexcept -> void { asm volatile("nop"); }
+ }
+ }
+
+#endif // MCAL_CPU_2025_07_30_H
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_eep.cpp b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_eep.cpp
new file mode 100644
index 000000000..849637ad9
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_eep.cpp
@@ -0,0 +1,21 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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
+
+auto mcal::eep::write(const address_type addr, const std::uint8_t data) -> void
+{
+ static_cast(addr);
+ static_cast(data);
+}
+
+auto mcal::eep::read(const address_type addr) -> std::uint8_t
+{
+ static_cast(addr);
+
+ return UINT8_C(0);
+}
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_eep.h b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_eep.h
new file mode 100644
index 000000000..253778148
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_eep.h
@@ -0,0 +1,27 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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)
+//
+
+#ifndef MCAL_EEP_2018_12_15_H
+ #define MCAL_EEP_2018_12_15_H
+
+ #include
+
+ namespace mcal
+ {
+ namespace eep
+ {
+ using config_type = void;
+ using address_type = std::uint32_t;
+
+ inline auto init(const config_type*) -> void { }
+
+ auto write(const address_type addr, const std::uint8_t data) -> void;
+ auto read (const address_type addr) -> std::uint8_t;
+ }
+ }
+
+#endif // MCAL_EEP_2018_12_15_H
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_gpt.cpp b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_gpt.cpp
new file mode 100644
index 000000000..4fe998091
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_gpt.cpp
@@ -0,0 +1,122 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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
+#include
+
+#include
+
+namespace
+{
+ struct mcal_gpt_system_tick final : private util::noncopyable
+ {
+ public:
+ mcal_gpt_system_tick() = delete;
+
+ ~mcal_gpt_system_tick() = delete;
+
+ static auto init() -> void
+ {
+ initial_count = get_consistent_microsecond_tick();
+ }
+
+ static auto get_tick() -> std::uint64_t
+ {
+ const std::uint64_t elapsed { get_consistent_microsecond_tick() - initial_count };
+
+ return elapsed;
+ }
+
+ private:
+ static std::uint64_t initial_count;
+
+ static auto read_clic_timer64() -> std::uint64_t
+ {
+ return mcal::reg::reg_access_static::reg_get();
+ }
+
+ static auto get_consistent_microsecond_tick() -> std::uint64_t
+ {
+ // Return the (elapsed) system tick using a multiple read
+ // to ensure data consistency. The system tick representing
+ // the elapsed time is used because the system tick timer
+ // has already been initialized by the system's bootloader.
+ // This means that by the time the bare-metal software actually
+ // starts up, the system tick timer will have already increased
+ // to some non-zero value represented here by initial_count.
+
+ // Return the system tick using a multiple read to ensure data consistency.
+
+ const volatile std::uint64_t time_first { read_clic_timer64() };
+ const volatile std::uint64_t time_second { read_clic_timer64() };
+
+ const bool
+ is_steady
+ {
+ (static_cast(time_second) >= static_cast(time_first))
+ };
+
+ const std::uint64_t
+ consistent_tick
+ {
+ static_cast
+ (
+ is_steady ? time_first : read_clic_timer64()
+ )
+ };
+
+ return
+ static_cast
+ (
+ static_cast(consistent_tick + UINT32_C(5))
+ / UINT32_C(10)
+ );
+ }
+ };
+
+ std::uint64_t mcal_gpt_system_tick::initial_count { };
+
+ auto gpt_is_initialized() -> bool& __attribute__((used, noinline));
+
+ auto gpt_is_initialized() -> bool&
+ {
+ static bool is_init = bool();
+
+ return is_init;
+ }
+}
+
+extern "C" auto mcal_gpt_init() -> void;
+
+extern "C" auto mcal_gpt_init() -> void
+{
+ mcal::gpt::init(nullptr);
+}
+
+void mcal::gpt::init(const config_type*)
+{
+ if(!gpt_is_initialized())
+ {
+ gpt_is_initialized() = true;
+
+ mcal_gpt_system_tick::init();
+ }
+}
+
+mcal::gpt::value_type mcal::gpt::secure::get_time_elapsed()
+{
+ const std::uint64_t
+ elapsed
+ {
+ static_cast
+ (
+ gpt_is_initialized() ? mcal_gpt_system_tick::get_tick() : UINT64_C(0)
+ )
+ };
+
+ return mcal::gpt::value_type(elapsed);
+}
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_gpt.h b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_gpt.h
new file mode 100644
index 000000000..8c9e9bd94
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_gpt.h
@@ -0,0 +1,29 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2025.
+// 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)
+//
+
+#ifndef MCAL_GPT_2025_10_30_H
+ #define MCAL_GPT_2025_10_30_H
+
+ #include
+
+ namespace mcal
+ {
+ namespace gpt
+ {
+ using config_type = void;
+ using value_type = std::uint64_t;
+
+ auto init(const config_type*) -> void;
+
+ struct secure final
+ {
+ static auto get_time_elapsed() -> value_type;
+ };
+ }
+ }
+
+#endif // MCAL_GPT_2025_10_30_H
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_irq.cpp b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_irq.cpp
new file mode 100644
index 000000000..a97496a2d
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_irq.cpp
@@ -0,0 +1,12 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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
+
+auto mcal::irq::init(const config_type*) -> void
+{
+}
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_irq.h b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_irq.h
new file mode 100644
index 000000000..2d606f6e0
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_irq.h
@@ -0,0 +1,24 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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)
+//
+
+#ifndef MCAL_IRQ_2010_04_10_H
+ #define MCAL_IRQ_2010_04_10_H
+
+ namespace mcal
+ {
+ namespace irq
+ {
+ using config_type = void;
+
+ void init(const config_type*);
+
+ inline void enable_all() { }
+ inline void disable_all() { }
+ }
+ }
+
+#endif // MCAL_IRQ_2010_04_10_H
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_led.cpp b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_led.cpp
new file mode 100644
index 000000000..c052e3c30
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_led.cpp
@@ -0,0 +1,20 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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
+#include
+
+auto mcal::led::led0() -> mcal::led::led_base&
+{
+ using led0_port_type = mcal::port::port_pin;
+
+ using led0_led_type = mcal::led::led_port;
+
+ static led0_led_type l0;
+
+ return l0;
+}
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_led.h b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_led.h
new file mode 100644
index 000000000..cd9c8065d
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_led.h
@@ -0,0 +1,31 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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)
+//
+
+#ifndef MCAL_LED_2010_09_14_H
+ #define MCAL_LED_2010_09_14_H
+
+ #include
+
+ #include
+
+ namespace mcal
+ {
+ namespace led
+ {
+ constexpr unsigned LED_ID_1 { UINT8_C(6) };
+ constexpr unsigned LED_ID_2 { UINT8_C(5) };
+ constexpr unsigned LED_ID_3 { UINT8_C(4) };
+ constexpr unsigned LED_ID_4 { UINT8_C(3) };
+
+ auto led0() -> led_base&;
+ auto led1() -> led_base&;
+ auto led2() -> led_base&;
+ auto led3() -> led_base&;
+ }
+ }
+
+#endif // MCAL_LED_2010_09_14_H
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_memory_progmem.h b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_memory_progmem.h
new file mode 100644
index 000000000..9668b68c4
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_memory_progmem.h
@@ -0,0 +1,72 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2019 - 2020.
+// 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)
+//
+
+#ifndef MCAL_MEMORY_PROGMEM_2019_08_17_H_
+ #define MCAL_MEMORY_PROGMEM_2019_08_17_H_
+
+ #include
+
+ #define MY_PROGMEM
+
+ #if defined(__cplusplus)
+ extern "C"
+ {
+ #endif
+
+ typedef uintptr_t mcal_progmem_uintptr_t;
+ typedef ptrdiff_t mcal_progmem_ptrdiff_t;
+
+ #define MCAL_PROGMEM_ADDRESSOF(x) ((mcal_progmem_uintptr_t) (&(x)))
+
+ static inline uint8_t mcal_memory_progmem_read_byte(const mcal_progmem_uintptr_t src_addr)
+ {
+ return *(const uint8_t*) src_addr;
+ }
+
+ static inline uint16_t mcal_memory_progmem_read_word(const mcal_progmem_uintptr_t src_addr)
+ {
+ uint16_t dest;
+
+ *(((uint8_t*) &dest) + 0U) = *((const uint8_t*) (src_addr + 0U));
+ *(((uint8_t*) &dest) + 1U) = *((const uint8_t*) (src_addr + 1U));
+
+ return dest;
+ }
+
+ static inline uint32_t mcal_memory_progmem_read_dword(const mcal_progmem_uintptr_t src_addr)
+ {
+ uint32_t dest;
+
+ *(((uint8_t*) &dest) + 0U) = *((const uint8_t*) (src_addr + 0U));
+ *(((uint8_t*) &dest) + 1U) = *((const uint8_t*) (src_addr + 1U));
+ *(((uint8_t*) &dest) + 2U) = *((const uint8_t*) (src_addr + 2U));
+ *(((uint8_t*) &dest) + 3U) = *((const uint8_t*) (src_addr + 3U));
+
+ return dest;
+ }
+
+ static inline uint64_t mcal_memory_progmem_read_qword(const mcal_progmem_uintptr_t src_addr)
+ {
+ uint64_t dest;
+
+ *(((uint8_t*) &dest) + 0U) = *((const uint8_t*) (src_addr + 0U));
+ *(((uint8_t*) &dest) + 1U) = *((const uint8_t*) (src_addr + 1U));
+ *(((uint8_t*) &dest) + 2U) = *((const uint8_t*) (src_addr + 2U));
+ *(((uint8_t*) &dest) + 3U) = *((const uint8_t*) (src_addr + 3U));
+ *(((uint8_t*) &dest) + 4U) = *((const uint8_t*) (src_addr + 4U));
+ *(((uint8_t*) &dest) + 5U) = *((const uint8_t*) (src_addr + 5U));
+ *(((uint8_t*) &dest) + 6U) = *((const uint8_t*) (src_addr + 6U));
+ *(((uint8_t*) &dest) + 7U) = *((const uint8_t*) (src_addr + 7U));
+
+ return dest;
+ }
+
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif // MCAL_MEMORY_PROGMEM_2019_08_17_H_
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_osc.cpp b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_osc.cpp
new file mode 100644
index 000000000..6ae0b6324
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_osc.cpp
@@ -0,0 +1,12 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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
+
+auto mcal::osc::init(const config_type*) -> void
+{
+}
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_osc.h b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_osc.h
new file mode 100644
index 000000000..cb8944d84
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_osc.h
@@ -0,0 +1,21 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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)
+//
+
+#ifndef MCAL_OSC_2011_10_20_H
+ #define MCAL_OSC_2011_10_20_H
+
+ namespace mcal
+ {
+ namespace osc
+ {
+ using config_type = void;
+
+ auto init(const config_type*) -> void;
+ }
+ }
+
+#endif // MCAL_OSC_2011_10_20_H
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_port.cpp b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_port.cpp
new file mode 100644
index 000000000..85e46c9cb
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_port.cpp
@@ -0,0 +1,12 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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
+
+void mcal::port::init(const config_type*)
+{
+}
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_port.h b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_port.h
new file mode 100644
index 000000000..fe7df7753
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_port.h
@@ -0,0 +1,98 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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)
+//
+
+#ifndef MCAL_PORT_2014_01_10_H
+ #define MCAL_PORT_2014_01_10_H
+
+ #include
+ #include
+
+ #include
+ #include
+
+ namespace mcal
+ {
+ namespace port
+ {
+ using config_type = void;
+
+ void init(const config_type*);
+
+ template
+ class port_pin
+ {
+ private:
+ static constexpr std::uint32_t GPIO_FUN_SDIO { UINT32_C( 1) };
+ static constexpr std::uint32_t GPIO_FUN_FLASH { UINT32_C( 2) };
+ static constexpr std::uint32_t GPIO_FUN_SPI { UINT32_C( 4) };
+ static constexpr std::uint32_t GPIO_FUN_I2C { UINT32_C( 6) };
+ static constexpr std::uint32_t GPIO_FUN_UART { UINT32_C( 7) };
+ static constexpr std::uint32_t GPIO_FUN_PWM { UINT32_C( 8) };
+ static constexpr std::uint32_t GPIO_FUN_EXT_PA { UINT32_C( 9) };
+ static constexpr std::uint32_t GPIO_FUN_ANALOG { UINT32_C(10) };
+ static constexpr std::uint32_t GPIO_FUN_SWGPIO { UINT32_C(11) };
+ static constexpr std::uint32_t GPIO_FUN_JTAG { UINT32_C(14) };
+
+ static constexpr std::uint32_t port_index { static_cast(PortIndex) };
+
+ static constexpr bool odd_index { ((PortIndex % unsigned { UINT8_C(2) }) != unsigned { UINT8_C(0) }) };
+
+ static constexpr std::uintptr_t
+ cfgctl
+ {
+ static_cast
+ (
+ mcal::reg::gpio_cfgctl0 + (port_index / 2U) * 4U
+ )
+ };
+
+ static constexpr unsigned cfgctl_bpos_reg_gpio_3_func_sel { odd_index ? UINT8_C(24) : UINT8_C(24) - UINT8_C(16) };
+ static constexpr unsigned cfgctl_bpos_reg_gpio_3_ie { odd_index ? UINT8_C(16) : UINT8_C(16) - UINT8_C(16) };
+ static constexpr unsigned cfgctl_bpos_reg_gpio_3_smt { odd_index ? UINT8_C(17) : UINT8_C(17) - UINT8_C(16) };
+ static constexpr unsigned cfgctl_bpos_reg_gpio_3_drv { odd_index ? UINT8_C(18) : UINT8_C(18) - UINT8_C(16) };
+
+ public:
+ static auto set_direction_output() noexcept -> void
+ {
+ mcal::reg::reg_access_static(GPIO_FUN_SWGPIO << cfgctl_bpos_reg_gpio_3_func_sel)>::template reg_msk(UINT32_C(0xF) << cfgctl_bpos_reg_gpio_3_func_sel)>();
+ mcal::reg::reg_access_static::bit_clr();
+ mcal::reg::reg_access_static::bit_clr();
+ mcal::reg::reg_access_static::template reg_msk();
+
+ mcal::reg::reg_access_static::bit_set();
+ }
+
+ static auto set_direction_input() noexcept -> void
+ {
+ // Not yet implemented.
+ }
+
+ static auto set_pin_high() noexcept -> void
+ {
+ // Not yet implemented.
+ }
+
+ static auto set_pin_low() noexcept -> void
+ {
+ // Not yet implemented.
+ }
+
+ static auto read_input_value() noexcept -> bool
+ {
+ // Not yet implemented.
+ return false;
+ }
+
+ static auto toggle_pin() noexcept -> void
+ {
+ mcal::reg::reg_access_static::bit_not();
+ }
+ };
+ }
+ }
+
+#endif // MCAL_PORT_2014_01_10_H
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_pwm.cpp b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_pwm.cpp
new file mode 100644
index 000000000..cf0b192b5
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_pwm.cpp
@@ -0,0 +1,12 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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
+
+auto mcal::pwm::init(const config_type*) -> void
+{
+}
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_pwm.h b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_pwm.h
new file mode 100644
index 000000000..2d99c6165
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_pwm.h
@@ -0,0 +1,21 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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)
+//
+
+#ifndef MCAL_PWM_2010_09_14_H
+ #define MCAL_PWM_2010_09_14_H
+
+ namespace mcal
+ {
+ namespace pwm
+ {
+ using config_type = void;
+
+ void init(const config_type*);
+ }
+ }
+
+#endif // MCAL_PWM_2010_09_14_H
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_reg.h b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_reg.h
new file mode 100644
index 000000000..d75e51b68
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_reg.h
@@ -0,0 +1,52 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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)
+//
+
+#ifndef MCAL_REG_2010_04_10_H
+ #define MCAL_REG_2010_04_10_H
+
+ #include
+
+ namespace mcal
+ {
+ namespace reg
+ {
+ // CLIC (timer) registers.
+ constexpr std::uintptr_t clic_ctrl_addr { UINT32_C(0x02000000) };
+ constexpr std::uintptr_t clic_msip { clic_ctrl_addr + UINT32_C(0x00000000) };
+ constexpr std::uintptr_t clic_mtimecmp { clic_ctrl_addr + UINT32_C(0x00004000) };
+ constexpr std::uintptr_t clic_mtime { clic_ctrl_addr + UINT32_C(0x0000BFF8) };
+ constexpr std::uintptr_t clic_clk_gate { clic_ctrl_addr + UINT32_C(0x007FF000) };
+
+ constexpr std::uintptr_t glb_base { UINT32_C(0x40000000) };
+ constexpr std::uintptr_t gpio_cfgctl0 { glb_base + UINT32_C(0x00000100) };
+ constexpr std::uintptr_t gpio_cfgctl1 { glb_base + UINT32_C(0x00000104) };
+ constexpr std::uintptr_t gpio_cfgctl2 { glb_base + UINT32_C(0x00000108) };
+ constexpr std::uintptr_t gpio_cfgctl3 { glb_base + UINT32_C(0x0000010C) };
+ constexpr std::uintptr_t gpio_cfgctl4 { glb_base + UINT32_C(0x00000110) };
+ constexpr std::uintptr_t gpio_cfgctl5 { glb_base + UINT32_C(0x00000114) };
+ constexpr std::uintptr_t gpio_cfgctl6 { glb_base + UINT32_C(0x00000118) };
+ constexpr std::uintptr_t gpio_cfgctl7 { glb_base + UINT32_C(0x0000011C) };
+ constexpr std::uintptr_t gpio_cfgctl8 { glb_base + UINT32_C(0x00000120) };
+ constexpr std::uintptr_t gpio_cfgctl9 { glb_base + UINT32_C(0x00000124) };
+ constexpr std::uintptr_t gpio_cfgctl10 { glb_base + UINT32_C(0x00000128) };
+ constexpr std::uintptr_t gpio_cfgctl11 { glb_base + UINT32_C(0x0000012C) };
+ constexpr std::uintptr_t gpio_cfgctl12 { glb_base + UINT32_C(0x00000130) };
+ constexpr std::uintptr_t gpio_cfgctl13 { glb_base + UINT32_C(0x00000134) };
+ constexpr std::uintptr_t gpio_cfgctl14 { glb_base + UINT32_C(0x00000138) };
+ constexpr std::uintptr_t gpio_cfgctl30 { glb_base + UINT32_C(0x00000180) };
+ constexpr std::uintptr_t gpio_cfgctl31 { glb_base + UINT32_C(0x00000184) };
+ constexpr std::uintptr_t gpio_cfgctl32 { glb_base + UINT32_C(0x00000188) };
+ constexpr std::uintptr_t gpio_cfgctl33 { glb_base + UINT32_C(0x0000018C) };
+ constexpr std::uintptr_t gpio_cfgctl34 { glb_base + UINT32_C(0x00000190) };
+ constexpr std::uintptr_t gpio_cfgctl35 { glb_base + UINT32_C(0x00000194) };
+ }
+ }
+
+ #include
+ #include
+
+#endif // MCAL_REG_2010_04_10_H
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_ser.h b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_ser.h
new file mode 100644
index 000000000..7eb790916
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_ser.h
@@ -0,0 +1,21 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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)
+//
+
+#ifndef MCAL_SER_2011_10_20_H
+ #define MCAL_SER_2011_10_20_H
+
+ namespace mcal
+ {
+ namespace ser
+ {
+ using config_type = void;
+
+ inline void init(const config_type*) { }
+ }
+ }
+
+#endif // MCAL_SER_2011_10_20_H
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_spi.cpp b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_spi.cpp
new file mode 100644
index 000000000..90723f45f
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_spi.cpp
@@ -0,0 +1,12 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2012 - 2025.
+// 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
+
+void mcal::spi::init(const mcal::spi::config_type*)
+{
+}
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_spi.h b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_spi.h
new file mode 100644
index 000000000..26563e885
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_spi.h
@@ -0,0 +1,19 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2012 - 2025.
+// 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)
+//
+
+#ifndef MCAL_SPI_2012_05_24_H
+ #define MCAL_SPI_2012_05_24_H
+
+ namespace mcal { namespace spi {
+
+ using config_type = void;
+
+ auto init(const config_type*) -> void;
+
+ } }
+
+#endif // MCAL_SPI_2012_05_24_H
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_wdg.cpp b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_wdg.cpp
new file mode 100644
index 000000000..4cb0e5f15
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_wdg.cpp
@@ -0,0 +1,17 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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
+#include
+
+void mcal::wdg::init(const config_type*)
+{
+}
+
+void mcal::wdg::secure::trigger()
+{
+}
diff --git a/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_wdg.h b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_wdg.h
new file mode 100644
index 000000000..996659eea
--- /dev/null
+++ b/ref_app/src/mcal/bl602_sifive_e24_riscv/mcal_wdg.h
@@ -0,0 +1,26 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2007 - 2025.
+// 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)
+//
+
+#ifndef MCAL_WDG_2010_04_10_H
+ #define MCAL_WDG_2010_04_10_H
+
+ namespace mcal
+ {
+ namespace wdg
+ {
+ using config_type = void;
+
+ auto init(const config_type*) -> void;
+
+ struct secure final
+ {
+ static auto trigger() -> void;
+ };
+ }
+ }
+
+#endif // MCAL_WDG_2010_04_10_H
diff --git a/ref_app/target.vcxproj b/ref_app/target.vcxproj
index 3a710f2e4..0ac75349f 100644
--- a/ref_app/target.vcxproj
+++ b/ref_app/target.vcxproj
@@ -5,6 +5,10 @@
target am6254_soc
x64
+
+ target bl602_sifive_e24_riscv
+ x64
+
target rpi_pico2_rp2350
x64
@@ -170,6 +174,12 @@
true
v143
+
+ Makefile
+ Unicode
+ true
+ v143
+
Makefile
Unicode
@@ -354,6 +364,9 @@
+
+
+
@@ -423,6 +436,7 @@
target\build\build.bat stm32f100
target\build\build.bat riscvfe310
target\build\build.bat wch_ch32v307
+ target\build\build.bat bl602_sifive_e24_riscv
target\build\build.bat wch_ch32v307_llvm
target\build\build.bat stm32l100c
target\build\build.bat lpc11c24
@@ -451,6 +465,7 @@
target\build\build.bat stm32f100 rebuild
target\build\build.bat riscvfe310 rebuild
target\build\build.bat wch_ch32v307 rebuild
+ target\build\build.bat bl602_sifive_e24_riscv rebuild
target\build\build.bat wch_ch32v307_llvm rebuild
target\build\build.bat stm32l100c rebuild
target\build\build.bat lpc11c24 rebuild
@@ -480,6 +495,7 @@
target\build\build.bat stm32f100 clean_all
target\build\build.bat riscvfe310 clean_all
target\build\build.bat wch_ch32v307 clean_all
+ target\build\build.bat bl602_sifive_e24_riscv clean_all
target\build\build.bat wch_ch32v307_llvm clean_all
target\build\build.bat stm32l100c clean_all
target\build\build.bat lpc11c24 clean_all
@@ -509,6 +525,7 @@
$(SolutionDir)bin\ref_app.hex
$(SolutionDir)bin\ref_app.hex
$(SolutionDir)bin\ref_app.hex
+ $(SolutionDir)bin\ref_app.hex
$(SolutionDir)bin\ref_app.hex
$(SolutionDir)bin\ref_app.hex
$(SolutionDir)bin\ref_app.hex
@@ -537,6 +554,7 @@
+
@@ -566,6 +584,7 @@
$(SolutionDir)src\util\STL_C++XX_stdfloat;$(SolutionDir)src\util\STL;$(SolutionDir)/src;$(SolutionDir)/src/mcal/stm32f100
$(SolutionDir)src\util\STL_C++XX_stdfloat;$(SolutionDir)src\util\STL;$(SolutionDir)/src;$(SolutionDir)/src/mcal/riscvfe310
$(SolutionDir)/src/mcal/wch_ch32v307/Mcal; $(SolutionDir)/src/util/STL; $(SolutionDir)/src; $(SolutionDir)/src/mcal/wch_ch32v307;
+ $(SolutionDir)/src/mcal/bl602_sifive_e24_riscv/Mcal;$(SolutionDir)/src/util/STL;$(SolutionDir)/src;$(SolutionDir)/src/mcal/bl602_sifive_e24_riscv
$(SolutionDir)/src/mcal/wch_ch32v307_llvm/Mcal;$(SolutionDir)/src
$(SolutionDir)src\util\STL_C++XX_stdfloat;$(SolutionDir)src\util\STL;$(SolutionDir)/src;$(SolutionDir)/src/mcal/stm32f100
$(SolutionDir)src\util\STL_C++XX_stdfloat;$(SolutionDir)src\util\STL;$(SolutionDir)src;$(SolutionDir)src\mcal\lpc11c24
@@ -594,6 +613,7 @@
+
@@ -622,6 +642,7 @@
+
@@ -650,6 +671,7 @@
+
@@ -835,6 +857,11 @@
$(SolutionDir)tmp\log\ref_app.log
+
+
+ $(SolutionDir)tmp\log\ref_app.log
+
+
$(SolutionDir)tmp\log\ref_app.log
@@ -983,6 +1010,10 @@
+
+
+
+
@@ -1101,6 +1132,8 @@
+
+
diff --git a/ref_app/target.vcxproj.filters b/ref_app/target.vcxproj.filters
index efd4fe857..aae9c270f 100644
--- a/ref_app/target.vcxproj.filters
+++ b/ref_app/target.vcxproj.filters
@@ -322,6 +322,15 @@
{8cae57b6-0e1e-471c-acea-6e9f6ef3ece8}
+
+ {f04752e7-fb5c-409d-b8a1-45c616328d40}
+
+
+ {78ca94d0-a98f-4278-b355-cfa8a6979c42}
+
+
+ {d9d707dc-1ba0-4d0c-be67-fbb095f42986}
+
@@ -741,6 +750,18 @@
micros\am6254_soc\make
+
+ micros\bl602_sifive_e24_riscv\make
+
+
+ micros\bl602_sifive_e24_riscv\make
+
+
+ micros\bl602_sifive_e24_riscv\make
+
+
+ micros\bl602_sifive_e24_riscv\startup
+
@@ -1070,6 +1091,12 @@
micros\am6254_soc\Code\Appli\Core\a53
+
+ micros\bl602_sifive_e24_riscv\startup
+
+
+ micros\bl602_sifive_e24_riscv\startup
+
diff --git a/ref_app/target/micros/am335x/make/am335x_files.gmk b/ref_app/target/micros/am335x/make/am335x_files.gmk
index 9043a2bf2..31e8db652 100644
--- a/ref_app/target/micros/am335x/make/am335x_files.gmk
+++ b/ref_app/target/micros/am335x/make/am335x_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2013 - 2021.
+# Copyright Christopher Kormanyos 2013 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the AM335x ARM(R) A8 files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/am6254_soc/make/am6254_soc_files.gmk b/ref_app/target/micros/am6254_soc/make/am6254_soc_files.gmk
index ae1207419..427ceef2d 100644
--- a/ref_app/target/micros/am6254_soc/make/am6254_soc_files.gmk
+++ b/ref_app/target/micros/am6254_soc/make/am6254_soc_files.gmk
@@ -6,7 +6,7 @@
#
# ------------------------------------------------------------------------------
-# File list of the AM6254 SOC files in the project
+# File list of the target-specific SOC files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/atmega2560/make/atmega2560_files.gmk b/ref_app/target/micros/atmega2560/make/atmega2560_files.gmk
index 99b95cfa2..c764ddbed 100644
--- a/ref_app/target/micros/atmega2560/make/atmega2560_files.gmk
+++ b/ref_app/target/micros/atmega2560/make/atmega2560_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2007 - 2021.
+# Copyright Christopher Kormanyos 2007 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the avr files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/atmega4809/make/atmega4809_files.gmk b/ref_app/target/micros/atmega4809/make/atmega4809_files.gmk
index 99b95cfa2..c764ddbed 100644
--- a/ref_app/target/micros/atmega4809/make/atmega4809_files.gmk
+++ b/ref_app/target/micros/atmega4809/make/atmega4809_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2007 - 2021.
+# Copyright Christopher Kormanyos 2007 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the avr files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/avr/make/avr_files.gmk b/ref_app/target/micros/avr/make/avr_files.gmk
index 9391412e8..c764ddbed 100644
--- a/ref_app/target/micros/avr/make/avr_files.gmk
+++ b/ref_app/target/micros/avr/make/avr_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2007 - 2024.
+# Copyright Christopher Kormanyos 2007 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the avr files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/bcm2835_raspi_b/make/bcm2835_raspi_b_files.gmk b/ref_app/target/micros/bcm2835_raspi_b/make/bcm2835_raspi_b_files.gmk
index 87d047e5b..0868a5cde 100644
--- a/ref_app/target/micros/bcm2835_raspi_b/make/bcm2835_raspi_b_files.gmk
+++ b/ref_app/target/micros/bcm2835_raspi_b/make/bcm2835_raspi_b_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2013 - 2021.
+# Copyright Christopher Kormanyos 2013 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the RaspberryPi(R) ARM(R) A11 files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/bl602_sifive_e24_riscv/make/bl602_sifive_e24_riscv.ld b/ref_app/target/micros/bl602_sifive_e24_riscv/make/bl602_sifive_e24_riscv.ld
new file mode 100644
index 000000000..0d5ca027b
--- /dev/null
+++ b/ref_app/target/micros/bl602_sifive_e24_riscv/make/bl602_sifive_e24_riscv.ld
@@ -0,0 +1,159 @@
+/******************************************************************************************
+ Filename : Memory_Map.ld
+
+ Core : RV32IMAC
+
+ MCU : FE310-G002 (SiFive)
+
+ Author : Chalandi Amine
+
+ Owner : Chalandi Amine
+
+ Date : 04.06.2021
+
+ Description : Linker description file for FE310 SiFive
+
+******************************************************************************************/
+
+/******************************************************************************************
+ ELF Entrypoint
+******************************************************************************************/
+ENTRY(_start)
+
+/******************************************************************************************
+ Globals
+******************************************************************************************/
+__FLASH_START_ADDRESS = 0x23000000;
+__FLASH_SIZE = 2M;
+
+__ITCM_START_ADDRESS = 0x22008000;
+__ITCM_SIZE = 48K;
+
+__DTCM_START_ADDRESS = 0x42014000;
+__DTCM_SIZE = 48K;
+
+__STACK_START_ADDRESS = 0x42020000;
+__STACK_SIZE = 1K;
+
+__RAM_START_ADDRESS = 0x42020000 + __STACK_SIZE;
+__RAM_SIZE = 64K - __STACK_SIZE;
+
+/******************************************************************************************
+ Memory configuration
+******************************************************************************************/
+
+MEMORY
+{
+ FLASH(rx) : ORIGIN = __FLASH_START_ADDRESS, LENGTH = __FLASH_SIZE
+ ITCM(rx) : ORIGIN = __ITCM_START_ADDRESS, LENGTH = __ITCM_SIZE
+ DTCM(rx) : ORIGIN = __DTCM_START_ADDRESS, LENGTH = __DTCM_SIZE
+ STACK(rw) : ORIGIN = __STACK_START_ADDRESS, LENGTH = __STACK_SIZE
+ RAM(rwx) : ORIGIN = __RAM_START_ADDRESS, LENGTH = __RAM_SIZE
+}
+
+/******************************************************************************************
+ Sections definition
+******************************************************************************************/
+SECTIONS
+{
+ /* Program code (text) */
+ .text : ALIGN(4)
+ {
+ PROVIDE(__CODE_BASE_ADDRESS = .);
+ *(.boot)
+ *(.text)
+ . = ALIGN(4);
+ } > FLASH
+
+ /* Read-only data (.rodata) */
+ .rodata : ALIGN(4)
+ {
+ PROVIDE(__RODATA_BASE_ADDRESS = .);
+ *(.rodata)
+ } > FLASH
+
+ /* Section for constructors */
+ .ctors : ALIGN(4)
+ {
+ PROVIDE(__CTOR_LIST__ = .);
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array))
+ LONG(-1) ;
+ PROVIDE(__CTOR_END__ = .);
+ . = ALIGN(4);
+ } > FLASH
+
+
+ /* Section for destructors */
+ .dtors : ALIGN(4)
+ {
+ PROVIDE(__DTOR_LIST__ = .);
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ KEEP (*(SORT(.fini_array.*)))
+ KEEP (*(.fini_array))
+ LONG(-1) ;
+ PROVIDE(__DTOR_END__ = .);
+ . = ALIGN(4);
+ } > FLASH
+
+ /* Runtime clear table */
+ .clear_sec : ALIGN(4)
+ {
+ PROVIDE(__RUNTIME_CLEAR_TABLE = .) ;
+ LONG(0 + ADDR(.bss)); LONG(SIZEOF(.bss));
+ LONG(-1); LONG(-1);
+ . = ALIGN(4);
+ } > FLASH
+
+ /* Runtime copy table */
+ .copy_sec : ALIGN(4)
+ {
+ PROVIDE(__RUNTIME_COPY_TABLE = .) ;
+ LONG(LOADADDR(.data)); LONG(0 + ADDR(.data)); LONG(SIZEOF(.data));
+ LONG(LOADADDR(.sdata)); LONG(0 + ADDR(.sdata)); LONG(SIZEOF(.sdata));
+ LONG(-1); LONG(-1); LONG(-1);
+ . = ALIGN(4);
+ PROVIDE(__CODE_END_ADDRESS = .);
+ } > FLASH
+
+ /* The ROM-to-RAM initialized data sections */
+ .data : ALIGN(4)
+ {
+ *(.data)
+ *(.data*)
+ . = ALIGN(4);
+ } > RAM AT>FLASH
+
+ .sdata : ALIGN(4)
+ {
+ *(.sdata)
+ . = ALIGN(4);
+ } > RAM AT>FLASH
+
+
+
+ /* The uninitialized (zero-cleared) data sections */
+ .bss : ALIGN(4)
+ {
+ *(.bss)
+ *(.bss*)
+ . = ALIGN(4);
+ } > RAM
+
+ .sbss : ALIGN(4)
+ {
+ *(.sbss)
+ . = ALIGN(4);
+ } > RAM
+
+ /* stack definition */
+ .stack :
+ {
+ . = ALIGN(MAX(__STACK_SIZE , .), 8);
+ PROVIDE(__STACK_TOP = .) ;
+ } > STACK
+
+}
diff --git a/ref_app/target/micros/bl602_sifive_e24_riscv/make/bl602_sifive_e24_riscv_files.gmk b/ref_app/target/micros/bl602_sifive_e24_riscv/make/bl602_sifive_e24_riscv_files.gmk
new file mode 100644
index 000000000..47f364a14
--- /dev/null
+++ b/ref_app/target/micros/bl602_sifive_e24_riscv/make/bl602_sifive_e24_riscv_files.gmk
@@ -0,0 +1,15 @@
+#
+# Copyright Christopher Kormanyos 2025.
+# 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)
+#
+
+# ------------------------------------------------------------------------------
+# File list of the target-specific files in the project
+# ------------------------------------------------------------------------------
+
+FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
+ $(PATH_TGT)/Code/Startup/boot \
+ $(PATH_TGT)/startup/intvect \
+ $(PATH_TGT)/startup/Startup
diff --git a/ref_app/target/micros/bl602_sifive_e24_riscv/make/bl602_sifive_e24_riscv_flags.gmk b/ref_app/target/micros/bl602_sifive_e24_riscv/make/bl602_sifive_e24_riscv_flags.gmk
new file mode 100644
index 000000000..f1528873b
--- /dev/null
+++ b/ref_app/target/micros/bl602_sifive_e24_riscv/make/bl602_sifive_e24_riscv_flags.gmk
@@ -0,0 +1,70 @@
+# Copyright Christopher Kormanyos 2025.
+# 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)
+#
+
+# ------------------------------------------------------------------------------
+# compiler flags for the target architecture
+# ------------------------------------------------------------------------------
+
+GCC_TARGET := riscv-none-elf
+GCC_PREFIX := riscv-none-elf
+
+GCC_VERSION := 15.2.0
+
+TGT_SUFFIX = elf
+
+ARCH := -mcpu=sifive-e24 \
+ -mabi=ilp32 \
+ -msmall-data-limit=0 \
+ -falign-functions=4
+
+TGT_ALLFLAGS = -O2 \
+ $(ARCH) \
+ -DPRINTF_INCLUDE_CONFIG_H \
+ -fomit-frame-pointer \
+ -fno-reorder-blocks-and-partition \
+ -fno-reorder-functions
+
+
+TGT_CFLAGS = -std=c11 \
+ -Wunsuffixed-float-constants \
+ $(TGT_ALLFLAGS)
+
+TGT_CXXFLAGS = -std=c++23 \
+ -Wno-psabi \
+ $(TGT_ALLFLAGS)
+
+TGT_INCLUDES :=
+
+TGT_AFLAGS = $(TGT_ALLFLAGS)
+
+TGT_LDFLAGS = -nostdlib \
+ -nostartfiles \
+ -Wl,--gc-sections \
+ -e _start \
+ -Wl,-Map,$(APP).map \
+ -T $(LINKER_DEFINITION_FILE)
+
+
+OBJCOPY := $(PATH_TOOLS_CC)/$(GCC_PREFIX)-objcopy.exe
+
+ifeq ($(TYP_OS),WIN)
+OBJCOPY := $(subst /,\,$(PATH_TOOLS_CC)/$(GCC_PREFIX)-objcopy.exe)
+endif
+
+NAME_IMAGE_FILE := $(APP)
+
+RULE_SPECIAL_MAKE_IMAGE_FILE := $(ECHO) "+++ creating special image file $(NAME_IMAGE_FILE).img" \
+ && $(OBJCOPY) $(APP).$(TGT_SUFFIX) -O binary $(NAME_IMAGE_FILE).img
+
+ifeq ($(TYP_OS),WIN)
+
+BL602_BFLASH_TOOL := $(PATH_TOOLS)/BL602/flasher/blflash.exe
+
+RULE_SPECIAL_MAKE_FLASH_BATCH := $(ECHO) "+++ creating flash batch file $(PATH_BIN)/flash.bat" \
+ && copy /Y $(subst /,\\,$(BL602_BFLASH_TOOL)) $(subst /,\,$(CURDIR)/bin) > 2 > NUL \
+ && $(ECHO) "$(subst /,\\,./$(notdir $(BL602_BFLASH_TOOL))) flash ./$(notdir $(NAME_IMAGE_FILE).img) --baud-rate 230400 --initial-baud-rate 230400 --port COM3"> $(CURDIR)/bin/flash.bat
+
+endif
diff --git a/ref_app/target/micros/bl602_sifive_e24_riscv/startup/Startup.c b/ref_app/target/micros/bl602_sifive_e24_riscv/startup/Startup.c
new file mode 100644
index 000000000..1fb7dfe6a
--- /dev/null
+++ b/ref_app/target/micros/bl602_sifive_e24_riscv/startup/Startup.c
@@ -0,0 +1,188 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2025.
+// 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)
+//
+
+// Originally from:
+// ***************************************************************************************
+// Filename : Startup.c
+//
+// Author : Chalandi Amine
+//
+// Owner : Chalandi Amine
+//
+// Date : 11.03.2020
+//
+// Description : C/C++ Runtime Setup (Crt0)
+//
+// ***************************************************************************************
+//=========================================================================================
+// Types definitions
+//=========================================================================================
+typedef struct
+{
+ unsigned long sourceAddr; /* Source Address (section in ROM memory) */
+ unsigned long targetAddr; /* Target Address (section in RAM memory) */
+ unsigned long size; /* length of section (bytes) */
+} runtimeCopyTable_t;
+
+typedef struct
+{
+ unsigned long addr; /* Source Address (section in RAM memory) */
+ unsigned long size; /* Length of section (bytes) */
+} runtimeClearTable_t;
+
+//=========================================================================================
+// Linker variables
+//=========================================================================================
+extern const runtimeCopyTable_t __RUNTIME_COPY_TABLE[];
+extern const runtimeClearTable_t __RUNTIME_CLEAR_TABLE[];
+extern unsigned long __CTOR_LIST__[];
+
+//=========================================================================================
+// Defines
+//=========================================================================================
+#define __STARTUP_RUNTIME_COPYTABLE (runtimeCopyTable_t*)(&__RUNTIME_COPY_TABLE[0])
+#define __STARTUP_RUNTIME_CLEARTABLE (runtimeClearTable_t*)(&__RUNTIME_CLEAR_TABLE[0])
+#define __STARTUP_RUNTIME_CTORS (unsigned long*)(&__CTOR_LIST__[0])
+
+//=========================================================================================
+// Function prototype
+//=========================================================================================
+void Startup_Init(void);
+static void Startup_InitRam(void);
+static void Startup_InitCtors(void);
+static void Startup_RunApplication(void);
+static void Startup_Unexpected_Exit(void);
+static void Startup_InitMcuSystem(void);
+
+//=========================================================================================
+// Extern function prototype
+//=========================================================================================
+int main(void) __attribute__((used,noinline));
+
+//-----------------------------------------------------------------------------------------
+/// \brief Startup_Init function
+///
+/// \param void
+///
+/// \return void
+//-----------------------------------------------------------------------------------------
+void Startup_Init(void) __attribute__((used,noinline));
+
+void Startup_Init(void)
+{
+ /* Initialize the MCU system */
+ Startup_InitMcuSystem();
+
+ /* Initialize the RAM memory */
+ Startup_InitRam();
+
+ /* Initialize the non-local C++ objects */
+ Startup_InitCtors();
+
+ /* Run the main application */
+ Startup_RunApplication();
+
+}
+
+//-----------------------------------------------------------------------------------------
+/// \brief Startup_InitRam function
+///
+/// \param void
+///
+/// \return void
+//-----------------------------------------------------------------------------------------
+static void Startup_InitRam(void)
+{
+ unsigned long ClearTableIdx = 0;
+ unsigned long CopyTableIdx = 0;
+
+ /* Clear Table */
+ while((__STARTUP_RUNTIME_CLEARTABLE)[ClearTableIdx].addr != (unsigned long)-1 && (__STARTUP_RUNTIME_CLEARTABLE)[ClearTableIdx].size != (unsigned long)-1)
+ {
+ for(unsigned long idx = 0; idx < ((unsigned long)((__STARTUP_RUNTIME_CLEARTABLE)[ClearTableIdx].size) / 4); idx++)
+ {
+ ((unsigned long*)((__STARTUP_RUNTIME_CLEARTABLE)[ClearTableIdx].addr))[idx] = 0;
+ }
+
+ ClearTableIdx++;
+ }
+
+ /* Copy Table */
+ while((__STARTUP_RUNTIME_COPYTABLE)[CopyTableIdx].sourceAddr != (unsigned long)-1 &&
+ (__STARTUP_RUNTIME_COPYTABLE)[CopyTableIdx].targetAddr != (unsigned long)-1 &&
+ (__STARTUP_RUNTIME_COPYTABLE)[CopyTableIdx].size != (unsigned long)-1
+ )
+ {
+ for(unsigned long idx = 0; idx < ((unsigned long)((__STARTUP_RUNTIME_COPYTABLE)[CopyTableIdx].size) / 4); idx++)
+ {
+ ((unsigned long*)((__STARTUP_RUNTIME_COPYTABLE)[CopyTableIdx].targetAddr))[idx] =
+ ((unsigned long*)((__STARTUP_RUNTIME_COPYTABLE)[CopyTableIdx].sourceAddr))[idx];
+ }
+
+ CopyTableIdx++;
+ }
+}
+
+//-----------------------------------------------------------------------------------------
+/// \brief Startup_InitCtors function
+///
+/// \param void
+///
+/// \return void
+//-----------------------------------------------------------------------------------------
+static void Startup_InitCtors(void)
+{
+ unsigned long CtorIdx = 0U;
+
+ while((__STARTUP_RUNTIME_CTORS)[CtorIdx] != ((unsigned long)-1))
+ {
+ ((void (*)(void))((__STARTUP_RUNTIME_CTORS)[CtorIdx++]))();
+ }
+}
+
+//-----------------------------------------------------------------------------------------
+/// \brief Startup_RunApplication function
+///
+/// \param void
+///
+/// \return void
+//-----------------------------------------------------------------------------------------
+static void Startup_RunApplication(void)
+{
+ /* check the weak function */
+ if((unsigned int) &main != 0)
+ {
+ /* Call the main function */
+ main();
+ }
+
+ /* Catch unexpected exit from main or if main does not exist */
+ Startup_Unexpected_Exit();
+}
+
+//-----------------------------------------------------------------------------------------
+/// \brief Startup_Unexpected_Exit function
+///
+/// \param void
+///
+/// \return void
+//-----------------------------------------------------------------------------------------
+static void Startup_Unexpected_Exit(void)
+{
+ for(;;);
+}
+//-----------------------------------------------------------------------------------------
+/// \brief Startup_InitMcuSystem function
+///
+/// \param void
+///
+/// \return void
+//-----------------------------------------------------------------------------------------
+static void Startup_InitMcuSystem(void)
+{
+ /* system clock is set by the bootROM */
+}
\ No newline at end of file
diff --git a/ref_app/target/micros/bl602_sifive_e24_riscv/startup/boot.s b/ref_app/target/micros/bl602_sifive_e24_riscv/startup/boot.s
new file mode 100644
index 000000000..1da35e909
--- /dev/null
+++ b/ref_app/target/micros/bl602_sifive_e24_riscv/startup/boot.s
@@ -0,0 +1,73 @@
+/******************************************************************************************
+ Filename : boot.s
+
+ Core : RV32IMAFCB (SiFive E24 RISC-V)
+
+ MCU : BL602
+
+ Author : Chalandi Amine
+
+ Owner : Chalandi Amine
+
+ Date : 22.10.2025
+
+ Description : boot routine
+
+******************************************************************************************/
+
+.extern InterruptVectorTable
+
+/*******************************************************************************************
+ \brief
+
+ \param
+
+ \return
+********************************************************************************************/
+.section .boot
+.type _start, @function
+.align 2
+.globl _start
+
+_start:
+ /* note: The system clock is set to 160MHz by the BL602 bootROM
+ RISC-V mtime clock (rtc_toggle signal) is set to 10MHz
+ */
+
+ /* setup the exception vector table (CLIC vectored) */
+ la t0, ExceptionVectorTable
+ addi t0, t0, 3
+ csrw mtvec, t0
+
+ /* setup the interrupt vector table (CLIC vectored) */
+ la t0, InterruptVectorTable
+ csrw 0x00000307, t0
+
+ /* enable global interrupt flag */
+ csrsi mstatus, (1ul << 3u)
+
+ /* setup the stack pointer */
+ la sp, __STACK_TOP
+
+ /* setup the C/C++ runtime environment */
+ j Startup_Init
+
+
+.size _start, .-_start
+
+/*******************************************************************************************
+ \brief
+
+ \param
+
+ \return
+********************************************************************************************/
+.section .text.vivt
+.type ExceptionVectorTable, @function
+.align 6
+.globl ExceptionVectorTable
+
+ExceptionVectorTable:
+ j .
+
+.size ExceptionVectorTable, .-ExceptionVectorTable
diff --git a/ref_app/target/micros/bl602_sifive_e24_riscv/startup/intvect.c b/ref_app/target/micros/bl602_sifive_e24_riscv/startup/intvect.c
new file mode 100644
index 000000000..5e42685ac
--- /dev/null
+++ b/ref_app/target/micros/bl602_sifive_e24_riscv/startup/intvect.c
@@ -0,0 +1,136 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2025.
+// 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)
+//
+
+// Originally from:
+/******************************************************************************************************
+ Filename : intvect.c
+
+ Core : RV32IMAFCB (SiFive E24 RISC-V)
+
+ MCU : BL602
+
+ Author : Chalandi Amine
+
+ Owner : Chalandi Amine
+
+ Date : 22.10.2025
+
+ Description : Interrupt vector table implementation
+
+******************************************************************************************************/
+
+//=====================================================================================================
+// Includes
+//=====================================================================================================
+#include
+
+//=====================================================================================================
+// Functions prototype
+//=====================================================================================================
+static void UndefinedHandler(void);
+static void UndefinedHandler(void){ for(;;); }
+
+void Isr_SW_Interrupt (void) __attribute__((weak, alias("UndefinedHandler")));
+void Isr_TIMER_Interrupt (void) __attribute__((weak, alias("UndefinedHandler")));
+void Isr_Ext_Interrupt (void) __attribute__((weak, alias("UndefinedHandler")));
+void Isr_CLIC_SW_Interrupt (void) __attribute__((weak, alias("UndefinedHandler")));
+void L1C_BMX_ERR (void) __attribute__((weak, alias("UndefinedHandler")));
+void L1C_BMX_TO (void) __attribute__((weak, alias("UndefinedHandler")));
+void DMA_BMX_ERR (void) __attribute__((weak, alias("UndefinedHandler")));
+void IRTX (void) __attribute__((weak, alias("UndefinedHandler")));
+void IRRX (void) __attribute__((weak, alias("UndefinedHandler")));
+void GPADC_DMA (void) __attribute__((weak, alias("UndefinedHandler")));
+void SPI (void) __attribute__((weak, alias("UndefinedHandler")));
+void UART0 (void) __attribute__((weak, alias("UndefinedHandler")));
+void UART1 (void) __attribute__((weak, alias("UndefinedHandler")));
+void I2C (void) __attribute__((weak, alias("UndefinedHandler")));
+void PWM (void) __attribute__((weak, alias("UndefinedHandler")));
+void TIMER_CH0 (void) __attribute__((weak, alias("UndefinedHandler")));
+void TIMER_CH1 (void) __attribute__((weak, alias("UndefinedHandler")));
+void TIMER_WDT (void) __attribute__((weak, alias("UndefinedHandler")));
+void GPIO_INT0 (void) __attribute__((weak, alias("UndefinedHandler")));
+void PDS_WAKEUP (void) __attribute__((weak, alias("UndefinedHandler")));
+void HBN_OUT0 (void) __attribute__((weak, alias("UndefinedHandler")));
+void HBN_OUT1 (void) __attribute__((weak, alias("UndefinedHandler")));
+
+typedef void (*InterruptHandler)(void);
+
+//=====================================================================================================
+// Interrupt vector table
+//=====================================================================================================
+const InterruptHandler __attribute__((aligned(64))) InterruptVectorTable[] =
+{
+ (InterruptHandler)&UndefinedHandler, /* IRQ 00 Reserved */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 01 Reserved */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 02 Reserved */
+ (InterruptHandler)&Isr_SW_Interrupt, /* IRQ 03 SW Interrupt */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 04 Reserved */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 05 Reserved */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 06 Reserved */
+ (InterruptHandler)&Isr_TIMER_Interrupt, /* IRQ 07 Timer Interrupt */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 08 Reserved */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 09 Reserved */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 10 Reserved */
+ (InterruptHandler)&Isr_Ext_Interrupt, /* IRQ 11 External Interrupt */
+ (InterruptHandler)&Isr_CLIC_SW_Interrupt, /* IRQ 12 CLIC SW Interrupt */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 13 Reserved */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 14 Reserved */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 15 Reserved */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 16 Local Interrupt (IRQ_NUM_BASE + 00) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 17 Local Interrupt (IRQ_NUM_BASE + 01) */
+ (InterruptHandler)&L1C_BMX_ERR, /* IRQ 18 Local Interrupt (IRQ_NUM_BASE + 02) */
+ (InterruptHandler)&L1C_BMX_TO, /* IRQ 19 Local Interrupt (IRQ_NUM_BASE + 03) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 20 Local Interrupt (IRQ_NUM_BASE + 04) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 21 Local Interrupt (IRQ_NUM_BASE + 05) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 22 Local Interrupt (IRQ_NUM_BASE + 06) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 23 Local Interrupt (IRQ_NUM_BASE + 07) */
+ (InterruptHandler)&DMA_BMX_ERR, /* IRQ 24 Local Interrupt (IRQ_NUM_BASE + 08) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 25 Local Interrupt (IRQ_NUM_BASE + 09) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 26 Local Interrupt (IRQ_NUM_BASE + 10) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 27 Local Interrupt (IRQ_NUM_BASE + 11) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 28 Local Interrupt (IRQ_NUM_BASE + 12) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 29 Local Interrupt (IRQ_NUM_BASE + 13) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 30 Local Interrupt (IRQ_NUM_BASE + 14) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 31 Local Interrupt (IRQ_NUM_BASE + 15) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 32 Local Interrupt (IRQ_NUM_BASE + 16) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 33 Local Interrupt (IRQ_NUM_BASE + 17) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 34 Local Interrupt (IRQ_NUM_BASE + 18) */
+ (InterruptHandler)&IRTX, /* IRQ 35 Local Interrupt (IRQ_NUM_BASE + 19) */
+ (InterruptHandler)&IRRX, /* IRQ 36 Local Interrupt (IRQ_NUM_BASE + 20) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 37 Local Interrupt (IRQ_NUM_BASE + 21) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 38 Local Interrupt (IRQ_NUM_BASE + 22) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 39 Local Interrupt (IRQ_NUM_BASE + 23) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 40 Local Interrupt (IRQ_NUM_BASE + 24) */
+ (InterruptHandler)&GPADC_DMA, /* IRQ 41 Local Interrupt (IRQ_NUM_BASE + 25) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 42 Local Interrupt (IRQ_NUM_BASE + 26) */
+ (InterruptHandler)&SPI, /* IRQ 43 Local Interrupt (IRQ_NUM_BASE + 27) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 44 Local Interrupt (IRQ_NUM_BASE + 28) */
+ (InterruptHandler)&UART0, /* IRQ 45 Local Interrupt (IRQ_NUM_BASE + 29) */
+ (InterruptHandler)&UART1, /* IRQ 46 Local Interrupt (IRQ_NUM_BASE + 30) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 47 Local Interrupt (IRQ_NUM_BASE + 31) */
+ (InterruptHandler)&I2C, /* IRQ 48 Local Interrupt (IRQ_NUM_BASE + 32) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 49 Local Interrupt (IRQ_NUM_BASE + 33) */
+ (InterruptHandler)&PWM, /* IRQ 50 Local Interrupt (IRQ_NUM_BASE + 34) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 51 Local Interrupt (IRQ_NUM_BASE + 35) */
+ (InterruptHandler)&TIMER_CH0, /* IRQ 52 Local Interrupt (IRQ_NUM_BASE + 36) */
+ (InterruptHandler)&TIMER_CH1, /* IRQ 53 Local Interrupt (IRQ_NUM_BASE + 37) */
+ (InterruptHandler)&TIMER_WDT, /* IRQ 54 Local Interrupt (IRQ_NUM_BASE + 38) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 55 Local Interrupt (IRQ_NUM_BASE + 39) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 56 Local Interrupt (IRQ_NUM_BASE + 40) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 57 Local Interrupt (IRQ_NUM_BASE + 41) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 58 Local Interrupt (IRQ_NUM_BASE + 42) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 59 Local Interrupt (IRQ_NUM_BASE + 43) */
+ (InterruptHandler)&GPIO_INT0, /* IRQ 60 Local Interrupt (IRQ_NUM_BASE + 44) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 61 Local Interrupt (IRQ_NUM_BASE + 45) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 62 Local Interrupt (IRQ_NUM_BASE + 46) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 63 Local Interrupt (IRQ_NUM_BASE + 47) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 64 Local Interrupt (IRQ_NUM_BASE + 48) */
+ (InterruptHandler)&UndefinedHandler, /* IRQ 65 Local Interrupt (IRQ_NUM_BASE + 49) */
+ (InterruptHandler)&PDS_WAKEUP, /* IRQ 66 Local Interrupt (IRQ_NUM_BASE + 50) */
+ (InterruptHandler)&HBN_OUT0, /* IRQ 67 Local Interrupt (IRQ_NUM_BASE + 51) */
+ (InterruptHandler)&HBN_OUT1 /* IRQ 68 Local Interrupt (IRQ_NUM_BASE + 52) */
+};
diff --git a/ref_app/target/micros/lpc11c24/make/lpc11c24_files.gmk b/ref_app/target/micros/lpc11c24/make/lpc11c24_files.gmk
index fda7e5b7e..8818d3ba2 100644
--- a/ref_app/target/micros/lpc11c24/make/lpc11c24_files.gmk
+++ b/ref_app/target/micros/lpc11c24/make/lpc11c24_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2007 - 2018.
+# Copyright Christopher Kormanyos 2007 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the stm32f100 files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/riscvfe310/make/riscvfe310_files.gmk b/ref_app/target/micros/riscvfe310/make/riscvfe310_files.gmk
index b524a0f7e..52e5cd9a8 100644
--- a/ref_app/target/micros/riscvfe310/make/riscvfe310_files.gmk
+++ b/ref_app/target/micros/riscvfe310/make/riscvfe310_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2022.
+# Copyright Christopher Kormanyos 2022 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the stm32f100 files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/riscvfe310/make/riscvfe310_flags.gmk b/ref_app/target/micros/riscvfe310/make/riscvfe310_flags.gmk
index 7ff5fefd1..bf223c937 100644
--- a/ref_app/target/micros/riscvfe310/make/riscvfe310_flags.gmk
+++ b/ref_app/target/micros/riscvfe310/make/riscvfe310_flags.gmk
@@ -1,4 +1,4 @@
-# Copyright Christopher Kormanyos 2022 - 2024.
+# Copyright Christopher Kormanyos 2022 - 2025.
# 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)
@@ -11,7 +11,7 @@
GCC_TARGET := riscv-none-elf
GCC_PREFIX := riscv-none-elf
-GCC_VERSION := 14.2.0
+GCC_VERSION := 15.2.0
TGT_SUFFIX = elf
diff --git a/ref_app/target/micros/rl78/make/rl78_files.gmk b/ref_app/target/micros/rl78/make/rl78_files.gmk
index a5b1861d6..dc517046a 100644
--- a/ref_app/target/micros/rl78/make/rl78_files.gmk
+++ b/ref_app/target/micros/rl78/make/rl78_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2007 - 2013.
+# Copyright Christopher Kormanyos 2007 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the rl78 files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/rpi_pico_rp2040/make/rpi_pico_rp2040_files.gmk b/ref_app/target/micros/rpi_pico_rp2040/make/rpi_pico_rp2040_files.gmk
index b7e6c25e5..5f86c57da 100644
--- a/ref_app/target/micros/rpi_pico_rp2040/make/rpi_pico_rp2040_files.gmk
+++ b/ref_app/target/micros/rpi_pico_rp2040/make/rpi_pico_rp2040_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2024.
+# Copyright Christopher Kormanyos 2024 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the stm32f1xx files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/$(TGT)/mcal_cpu_rp2040 \
diff --git a/ref_app/target/micros/rx63n/make/rx63n_files.gmk b/ref_app/target/micros/rx63n/make/rx63n_files.gmk
index 5f85efdc1..6a894be59 100644
--- a/ref_app/target/micros/rx63n/make/rx63n_files.gmk
+++ b/ref_app/target/micros/rx63n/make/rx63n_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2007 - 2013.
+# Copyright Christopher Kormanyos 2007 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the rl78 files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/stm32f100/make/stm32f100_files.gmk b/ref_app/target/micros/stm32f100/make/stm32f100_files.gmk
index 726f6b5da..fa3be41a9 100644
--- a/ref_app/target/micros/stm32f100/make/stm32f100_files.gmk
+++ b/ref_app/target/micros/stm32f100/make/stm32f100_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2007 - 2023.
+# Copyright Christopher Kormanyos 2007 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the stm32f1xx files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/stm32f407/make/stm32f407_files.gmk b/ref_app/target/micros/stm32f407/make/stm32f407_files.gmk
index e13695250..4958e583a 100644
--- a/ref_app/target/micros/stm32f407/make/stm32f407_files.gmk
+++ b/ref_app/target/micros/stm32f407/make/stm32f407_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2007 - 2022.
+# Copyright Christopher Kormanyos 2007 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the stm32f407 files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/stm32f429/make/stm32f429_files.gmk b/ref_app/target/micros/stm32f429/make/stm32f429_files.gmk
index fc7d54130..4958e583a 100644
--- a/ref_app/target/micros/stm32f429/make/stm32f429_files.gmk
+++ b/ref_app/target/micros/stm32f429/make/stm32f429_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2007 - 2023.
+# Copyright Christopher Kormanyos 2007 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the stm32f4xx files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/stm32f446/make/stm32f446_files.gmk b/ref_app/target/micros/stm32f446/make/stm32f446_files.gmk
index b41931372..fa3be41a9 100644
--- a/ref_app/target/micros/stm32f446/make/stm32f446_files.gmk
+++ b/ref_app/target/micros/stm32f446/make/stm32f446_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2007 - 2023.
+# Copyright Christopher Kormanyos 2007 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the stm32f4xx files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/stm32h7a3/make/stm32h7a3_files.gmk b/ref_app/target/micros/stm32h7a3/make/stm32h7a3_files.gmk
index 4d5f4c4c2..fa3be41a9 100644
--- a/ref_app/target/micros/stm32h7a3/make/stm32h7a3_files.gmk
+++ b/ref_app/target/micros/stm32h7a3/make/stm32h7a3_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2007 - 2022.
+# Copyright Christopher Kormanyos 2007 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the stm32h7a3 files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/stm32l100c/make/stm32l100c_files.gmk b/ref_app/target/micros/stm32l100c/make/stm32l100c_files.gmk
index f913a8764..fa3be41a9 100644
--- a/ref_app/target/micros/stm32l100c/make/stm32l100c_files.gmk
+++ b/ref_app/target/micros/stm32l100c/make/stm32l100c_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2007 - 2023.
+# Copyright Christopher Kormanyos 2007 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the stm32l1xx files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/stm32l432/make/stm32l432_files.gmk b/ref_app/target/micros/stm32l432/make/stm32l432_files.gmk
index 3603435e4..fa3be41a9 100644
--- a/ref_app/target/micros/stm32l432/make/stm32l432_files.gmk
+++ b/ref_app/target/micros/stm32l432/make/stm32l432_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2007 - 2024.
+# Copyright Christopher Kormanyos 2007 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the stm32f4xx files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/v850es_fx2/make/v850es_fx2_files.gmk b/ref_app/target/micros/v850es_fx2/make/v850es_fx2_files.gmk
index f86e62c3f..314239909 100644
--- a/ref_app/target/micros/v850es_fx2/make/v850es_fx2_files.gmk
+++ b/ref_app/target/micros/v850es_fx2/make/v850es_fx2_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2007 - 2021.
+# Copyright Christopher Kormanyos 2007 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the rl78 files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/wch_ch32v307/make/wch_ch32v307_files.gmk b/ref_app/target/micros/wch_ch32v307/make/wch_ch32v307_files.gmk
index 022f3e2ca..03e25aefb 100644
--- a/ref_app/target/micros/wch_ch32v307/make/wch_ch32v307_files.gmk
+++ b/ref_app/target/micros/wch_ch32v307/make/wch_ch32v307_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2022 - 2024.
+# Copyright Christopher Kormanyos 2022 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the stm32f100 files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/wch_ch32v307/make/wch_ch32v307_flags.gmk b/ref_app/target/micros/wch_ch32v307/make/wch_ch32v307_flags.gmk
index f33d0993d..daa9a8f93 100644
--- a/ref_app/target/micros/wch_ch32v307/make/wch_ch32v307_flags.gmk
+++ b/ref_app/target/micros/wch_ch32v307/make/wch_ch32v307_flags.gmk
@@ -1,4 +1,4 @@
-# Copyright Christopher Kormanyos 2022 - 2024.
+# Copyright Christopher Kormanyos 2022 - 2025.
# 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)
@@ -11,7 +11,7 @@
GCC_TARGET := riscv-none-elf
GCC_PREFIX := riscv-none-elf
-GCC_VERSION := 14.2.0
+GCC_VERSION := 15.2.0
TGT_SUFFIX = elf
diff --git a/ref_app/target/micros/wch_ch32v307_llvm/make/wch_ch32v307_llvm_files.gmk b/ref_app/target/micros/wch_ch32v307_llvm/make/wch_ch32v307_llvm_files.gmk
index 022f3e2ca..03e25aefb 100644
--- a/ref_app/target/micros/wch_ch32v307_llvm/make/wch_ch32v307_llvm_files.gmk
+++ b/ref_app/target/micros/wch_ch32v307_llvm/make/wch_ch32v307_llvm_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2022 - 2024.
+# Copyright Christopher Kormanyos 2022 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the stm32f100 files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/x86_64-w64-mingw32/make/x86_64-w64-mingw32_files.gmk b/ref_app/target/micros/x86_64-w64-mingw32/make/x86_64-w64-mingw32_files.gmk
index bdfeca9e6..f7a6ef21b 100644
--- a/ref_app/target/micros/x86_64-w64-mingw32/make/x86_64-w64-mingw32_files.gmk
+++ b/ref_app/target/micros/x86_64-w64-mingw32/make/x86_64-w64-mingw32_files.gmk
@@ -1,12 +1,12 @@
#
-# Copyright Christopher Kormanyos 2019.
+# Copyright Christopher Kormanyos 2019 - 2025.
# 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)
#
# ------------------------------------------------------------------------------
-# File list of the x86_64-w64-mingw32 files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/$(TGT)/mcal_wdg_watchdog
diff --git a/ref_app/target/micros/xtensa32/make/xtensa32_files.gmk b/ref_app/target/micros/xtensa32/make/xtensa32_files.gmk
index 65d9b2d2c..69a45e26e 100644
--- a/ref_app/target/micros/xtensa32/make/xtensa32_files.gmk
+++ b/ref_app/target/micros/xtensa32/make/xtensa32_files.gmk
@@ -6,7 +6,7 @@
#
# ------------------------------------------------------------------------------
-# File list of the xtensa32 esspressif ESP32 files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT = $(PATH_APP)/mcal/$(TGT)/from_sdk/esp32-hal-gpio \
diff --git a/ref_app/target/micros/xtensa_esp32_s3/make/xtensa_esp32_s3_files.gmk b/ref_app/target/micros/xtensa_esp32_s3/make/xtensa_esp32_s3_files.gmk
index 13d0131c9..2bb3fa47a 100644
--- a/ref_app/target/micros/xtensa_esp32_s3/make/xtensa_esp32_s3_files.gmk
+++ b/ref_app/target/micros/xtensa_esp32_s3/make/xtensa_esp32_s3_files.gmk
@@ -6,7 +6,7 @@
#
# ------------------------------------------------------------------------------
-# File list of the ESP32-S3 files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_TGT := $(PATH_APP)/mcal/mcal_gcc_cxx_completion \
diff --git a/ref_app/target/micros/xtensa_esp32_s3_riscv_cop/make/xtensa_esp32_s3_riscv_cop_files.gmk b/ref_app/target/micros/xtensa_esp32_s3_riscv_cop/make/xtensa_esp32_s3_riscv_cop_files.gmk
index 81f51e798..63e472ac5 100644
--- a/ref_app/target/micros/xtensa_esp32_s3_riscv_cop/make/xtensa_esp32_s3_riscv_cop_files.gmk
+++ b/ref_app/target/micros/xtensa_esp32_s3_riscv_cop/make/xtensa_esp32_s3_riscv_cop_files.gmk
@@ -6,7 +6,7 @@
#
# ------------------------------------------------------------------------------
-# File list of the ESP32-S3 RISC-V coprocessor files in the project
+# File list of the target-specific files in the project
# ------------------------------------------------------------------------------
FILES_CPP :=
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 1571a9098..89cfcb7dc 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
@@ -11,7 +11,7 @@
GCC_TARGET := riscv-none-elf
GCC_PREFIX := riscv-none-elf
-GCC_VERSION := 14.2.0
+GCC_VERSION := 15.2.0
TGT_SUFFIX := elf