Skip to content

Commit 6796843

Browse files
committed
Do some more modernization
1 parent 0bb9eba commit 6796843

79 files changed

Lines changed: 963 additions & 687 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

code_snippets/appendix0a/appendix0a.sh

Lines changed: 47 additions & 47 deletions
Large diffs are not rendered by default.

code_snippets/chapter01/chapter01.sh

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,18 @@ fi
1515
if [[ "$2" != "" ]]; then
1616
STD="$2"
1717
else
18-
STD=c++14
18+
STD=c++20
1919
fi
2020

2121
mkdir -p bin
2222

2323
rm -f ./bin/*.*
2424

25-
echo build snippets with GCC=$GCC STD=$STD
25+
echo build snippets with GCC=${GCC} STD=${STD}
2626

27-
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter01_01-001_led_program.cpp -o ./bin/chapter01_01-001_led_program.exe
28-
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter01_07-001_namespace.cpp -o ./bin/chapter01_07-001_namespace.exe
29-
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter01_07-002_namespace.cpp -o ./bin/chapter01_07-002_namespace.exe
27+
${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter01_01-001_led_program.cpp -o ./bin/chapter01_01-001_led_program.exe
28+
${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter01_07-001_namespace.cpp -o ./bin/chapter01_07-001_namespace.exe
29+
${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter01_07-002_namespace.cpp -o ./bin/chapter01_07-002_namespace.exe
3030

3131
ls -la \
3232
./bin/chapter01_01-001_led_program.exe \
@@ -35,6 +35,6 @@ ls -la \
3535

3636
result_ls=$?
3737

38-
echo "result_ls: " "$result_ls"
38+
echo "result_ls: " "${result_ls}"
3939

40-
exit $result_ls
40+
exit ${result_ls}

code_snippets/chapter03/chapter03.sh

Lines changed: 49 additions & 47 deletions
Large diffs are not rendered by default.

code_snippets/chapter04/chapter04.sh

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
#!/usr/bin/env bash
22
#
3-
# Copyright Christopher Kormanyos 2023.
3+
# Copyright Christopher Kormanyos 2023 - 2025.
44
# Distributed under the Boost Software License,
55
# Version 1.0. (See accompanying file LICENSE_1_0.txt
66
# or copy at http://www.boost.org/LICENSE_1_0.txt)
77
#
8+
# cd /mnt/c/Users/ckorm/Documents/Ks/uC_Software/Boards/real-time-cpp/code_snippets/chapter04
9+
# ./chapter04.sh g++ c++20
10+
#
811

912
if [[ "$1" != "" ]]; then
1013
GCC="$1"
@@ -15,24 +18,24 @@ fi
1518
if [[ "$2" != "" ]]; then
1619
STD="$2"
1720
else
18-
STD=c++14
21+
STD=c++20
1922
fi
2023

2124
mkdir -p bin
2225

2326
rm -f ./bin/*.*
2427

25-
echo build snippets with GCC=$GCC STD=$STD
28+
echo build snippets with GCC=${GCC} STD=${STD}
2629

27-
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_01-001_led_hierarchy.cpp -o ./bin/chapter04_01-001_led_hierarchy.exe
28-
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_04-001_dynamic_polymorphism.cpp -o ./bin/chapter04_04-001_dynamic_polymorphism.exe
29-
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_04-002_dynamic_polymorphism_cast.cpp -o ./bin/chapter04_04-002_dynamic_polymorphism_cast.exe
30-
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_04-003_dynamic_polymorphism_ref.cpp -o ./bin/chapter04_04-003_dynamic_polymorphism_ref.exe
31-
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_07-001_led_hierarchy_uses_pwm.cpp -o ./bin/chapter04_07-001_led_hierarchy_uses_pwm.exe
32-
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_08-001_const_com_class.cpp -o ./bin/chapter04_08-001_const_com_class.exe
33-
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_08-002_nonconst_com_class.cpp -o ./bin/chapter04_08-002_nonconst_com_class.exe
34-
if [[ "$GCC" == "g++" ]]; then
35-
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_08-003_poll_communication.cpp -o ./bin/chapter04_08-003_poll_communication.exe
30+
${GCC} -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_01-001_led_hierarchy.cpp -o ./bin/chapter04_01-001_led_hierarchy.exe
31+
${GCC} -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_04-001_dynamic_polymorphism.cpp -o ./bin/chapter04_04-001_dynamic_polymorphism.exe
32+
${GCC} -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_04-002_dynamic_polymorphism_cast.cpp -o ./bin/chapter04_04-002_dynamic_polymorphism_cast.exe
33+
${GCC} -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_04-003_dynamic_polymorphism_ref.cpp -o ./bin/chapter04_04-003_dynamic_polymorphism_ref.exe
34+
${GCC} -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_07-001_led_hierarchy_uses_pwm.cpp -o ./bin/chapter04_07-001_led_hierarchy_uses_pwm.exe
35+
${GCC} -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_08-001_const_com_class.cpp -o ./bin/chapter04_08-001_const_com_class.exe
36+
${GCC} -std=$STD -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_08-002_nonconst_com_class.cpp -o ./bin/chapter04_08-002_nonconst_com_class.exe
37+
if [[ "${GCC}" == "g++" ]]; then
38+
${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter04_08-003_poll_communication.cpp -o ./bin/chapter04_08-003_poll_communication.exe
3639
fi
3740

3841

@@ -69,6 +72,6 @@ else
6972
echo Compile fail is OK
7073
fi
7174

72-
echo "result_all: " "$result_all"
75+
echo "result_all: " "${result_all}"
7376

74-
exit $result_all
77+
exit ${result_all}

code_snippets/chapter04/chapter04_01-001_led_hierarchy.cpp

Lines changed: 57 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,73 @@
11
///////////////////////////////////////////////////////////////////////////////
2-
// Copyright Christopher Kormanyos 2018 - 2023.
2+
// Copyright Christopher Kormanyos 2018 - 2025.
33
// Distributed under the Boost Software License,
44
// Version 1.0. (See accompanying file LICENSE_1_0.txt
55
// or copy at http://www.boost.org/LICENSE_1_0.txt)
66
//
77

88
// chapter04_01-001_led_hierarchy.cpp
9-
// See also https://godbolt.org/z/7MzKGEevh
9+
// See also https://godbolt.org/z/b4e5E1M8q
1010

1111
#include <algorithm>
1212
#include <cstdint>
13-
#include <iostream>
1413

1514
class led_base
1615
{
1716
public:
18-
virtual void toggle() = 0; // Pure abstract.
19-
virtual ~led_base() = default; // Virtual destructor.
17+
// Virtual default destructor.
18+
virtual ~led_base() = default;
19+
20+
// Pure virtual.
21+
virtual auto toggle() noexcept -> void = 0;
2022

2123
// Interface for querying the LED state.
22-
constexpr auto state_is_on() const noexcept -> bool { return is_on; }
24+
auto state_is_on() const noexcept
25+
-> bool { return is_on; }
2326

24-
// Non-implemented (deleted) copy constructors.
25-
led_base(const led_base&) = delete;
26-
led_base(led_base&&) noexcept = delete;
27+
protected:
28+
// A protected default constructor.
29+
led_base() = default;
2730

28-
// Non-implemented (deleted) assignment operators.
29-
constexpr auto operator=(const led_base&) -> led_base& = delete;
30-
constexpr auto operator=(led_base&&) noexcept -> led_base& = delete;
31+
auto set_is_on(const bool val) noexcept
32+
-> void { is_on = val; }
3133

32-
protected:
34+
private:
3335
bool is_on { };
3436

35-
// A protected default constructor.
36-
constexpr led_base() = default;
37+
// Private non-implemented copy constructor.
38+
led_base(const led_base&) = delete;
39+
40+
// Private non-implemented assignment operator.
41+
auto operator=(const led_base&)
42+
-> const led_base& = delete;
3743
};
3844

3945
class led_port : public led_base
4046
{
4147
public:
42-
using port_type = std::uint8_t;
43-
using bval_type = std::uint8_t;
48+
using port_type = std::uintptr_t;
49+
using bval_type = std::uintptr_t;
4450

45-
explicit constexpr led_port(const port_type p,
46-
const bval_type b = static_cast<bval_type>(UINT8_C(0)))
47-
: port(p),
48-
bval(b) { static_cast<void>(bval); }
51+
explicit led_port(const port_type p,
52+
const bval_type b) : port(p),
53+
bval(b)
54+
{
55+
// ...
56+
}
4957

5058
~led_port() override = default;
5159

52-
auto toggle() -> void override
60+
auto toggle() noexcept -> void override
5361
{
54-
// Toggle the is_on indication flag.
55-
is_on = (!is_on);
62+
// Toggle the LED.
63+
*reinterpret_cast<volatile bval_type*>(port)
64+
^= bval;
5665

57-
// Show the PC simulated port LED.
58-
std::cout << "LED port(" << std::showbase << std::hex << unsigned(port) << "): ";
66+
// Toggle the is_on indication flag.
67+
const bool val_on
68+
{ (!led_base::state_is_on()) };
5969

60-
std::cout << (is_on ? "is on" : "is off") << std::endl;
70+
led_base::set_is_on(val_on);
6171
}
6272

6373
private:
@@ -101,52 +111,53 @@ class led_pwm : public led_base
101111

102112
~led_pwm() override = default;
103113

104-
auto toggle() -> void override
114+
auto toggle() noexcept -> void override
105115
{
106116
// Toggle the duty cycle.
107-
const auto duty =
108-
static_cast<std::uint8_t>
109-
(
110-
(my_pwm->get_duty() > static_cast<std::uint8_t>(UINT8_C(0)))
111-
? static_cast<std::uint8_t>(UINT8_C(0))
112-
: static_cast<std::uint8_t>(UINT8_C(100))
113-
);
114-
115-
my_pwm->set_duty(duty);
117+
const std::uint8_t duty =
118+
(my_pwm->get_duty() > 0U) ? 0U : 100U;
116119

117120
// Toggle the LED with the PWM signal.
118-
is_on = (my_pwm->get_duty() > static_cast<std::uint8_t>(UINT8_C(0)));
121+
my_pwm->set_duty(duty);
119122

120-
// Show the PC simulated pwm LED.
121-
std::cout << "LED pwm(" << std::dec << static_cast<unsigned>(my_pwm->get_channel()) << "): ";
123+
const bool val_on { (duty != 0U) };
122124

123-
std::cout << (is_on ? "is on" : "is off") << std::endl;
125+
led_base::set_is_on(val_on);
124126
}
125127

126128
// This LED class also supports dimming.
127129
auto dimming(const std::uint8_t duty) -> void
128130
{
129131
my_pwm->set_duty(duty);
130-
131-
is_on = (duty != static_cast<std::uint8_t>(UINT8_C(0)));
132+
led_base::set_is_on(duty != 0U);
132133
}
133134

134135
private:
135-
pwm* my_pwm { nullptr };
136+
pwm* my_pwm { };
136137
};
137138

139+
namespace mcal
140+
{
141+
namespace reg
142+
{
143+
// Simulate the transmit and receive hardware buffers on the PC.
144+
std::uint8_t dummy_register_port0 { };
145+
std::uint8_t dummy_register_port1 { };
146+
}
147+
}
148+
138149
namespace
139150
{
140151
// Two simulated port LEDs.
141152
led_port led0
142153
{
143-
static_cast<led_port::port_type>(UINT8_C(0x12)),
154+
reinterpret_cast<led_port::port_type>(&mcal::reg::dummy_register_port0),
144155
static_cast<led_port::bval_type>(UINT8_C(1))
145156
};
146157

147158
led_port led1
148159
{
149-
static_cast<led_port::port_type>(UINT8_C(0x34)),
160+
reinterpret_cast<led_port::port_type>(&mcal::reg::dummy_register_port1),
150161
static_cast<led_port::bval_type>(UINT8_C(2))
151162
};
152163

0 commit comments

Comments
 (0)