From 1e4118948098b1f0897fb28e26eb0fc5dbc5a90b Mon Sep 17 00:00:00 2001 From: dario Date: Wed, 26 Jun 2024 11:29:23 +0200 Subject: [PATCH] Updated printable to reduce mutex operations when printing newlines --- include/sta/debug/debug.hpp | 15 ++-- include/sta/debug/printing/printable.hpp | 64 ++++++++++------ .../sta/debug/printing/printable_printf.hpp | 11 ++- include/sta/debug/printing/printable_uart.hpp | 11 ++- src/debug/printing/printable.cpp | 73 +++++++++---------- src/debug/printing/printable_printf.cpp | 12 ++- src/debug/printing/printable_uart.cpp | 12 ++- 7 files changed, 126 insertions(+), 72 deletions(-) diff --git a/include/sta/debug/debug.hpp b/include/sta/debug/debug.hpp index 7a09609..9cc3654 100644 --- a/include/sta/debug/debug.hpp +++ b/include/sta/debug/debug.hpp @@ -19,7 +19,7 @@ namespace sta * * @ingroup sta_core_debug */ -# define STA_DEBUG_PRINT(...) sta::Debug->print(__VA_ARGS__) +# define STA_DEBUG_PRINT(...) sta::Debug->print(__VA_ARGS__) /** * @brief Debug print message followed by new-line to UART. @@ -28,7 +28,7 @@ namespace sta * * @ingroup sta_core_debug */ -# define STA_DEBUG_PRINTLN(...) sta::Debug->println(__VA_ARGS__) +# define STA_DEBUG_PRINTLN(...) sta::Debug->println(__VA_ARGS__) /** * @brief Formatted debug printing with new-line. @@ -36,13 +36,16 @@ namespace sta * @param fmt See @ref sta::PrintableUART::printf * @param ... See @ref sta::PrintableUART::printf */ -# define STA_DEBUG_PRINTF(fmt, ...) sta::Debug->printf(fmt, __VA_ARGS__) +# define STA_DEBUG_PRINTF(fmt, ...) sta::Debug->printf(fmt, __VA_ARGS__) + +# define STA_DEBUG_READ(buffer, length) sta::Debug->read(buffer, length) #else // !STA_DEBUGGING_ENABLED -# define STA_DEBUG_PRINT(...) ((void)0) -# define STA_DEBUG_PRINTLN(...) ((void)0) -# define STA_DEBUG_PRINTF(fmt, ...) ((void)0) +# define STA_DEBUG_PRINT(...) ((void)0) +# define STA_DEBUG_PRINTLN(...) ((void)0) +# define STA_DEBUG_PRINTF(fmt, ...) ((void)0) +# define STA_DEBUG_READ(buffer, length) ((void)0) #endif // STA_DEBUGGING_ENABLED diff --git a/include/sta/debug/printing/printable.hpp b/include/sta/debug/printing/printable.hpp index 531522f..30995db 100644 --- a/include/sta/debug/printing/printable.hpp +++ b/include/sta/debug/printing/printable.hpp @@ -40,62 +40,70 @@ namespace sta /** * @brief Print single character. * - * @param c Character to print + * @param c Character to print + * @param newline If true, send a \r\n to start a new line. */ - void print(char c); + void print(char c, bool newline = false); /** * @brief Print boolean value. * - * @param b Boolean value + * @param b Boolean value + * @param newline If true, send a \r\n to start a new line. */ - void print(bool b); + void print(bool b, bool newline = false); /** * @brief Print floating point value. * - * @param d Floating point value + * @param d Floating point value + * @param newline If true, send a \r\n to start a new line. */ - void print(double d); + void print(double d, bool newline = false); /** * @brief Print integer in selected base. * - * @param num 8-bit unsigned integer - * @param base Integer base + * @param num 8-bit unsigned integer + * @param base Integer base + * @param newline If true, send a \r\n to start a new line. */ - void print(uint8_t num, IntegerBase base = IntegerBase::DEC); + void print(uint8_t num, IntegerBase base = IntegerBase::DEC, bool newline = false); /** * @brief Print integer in selected base. * - * @param num 16-bit unsigned integer - * @param base Integer base + * @param num 16-bit unsigned integer + * @param base Integer base + * @param newline If true, send a \r\n to start a new line. */ - void print(uint16_t num, IntegerBase base = IntegerBase::DEC); + void print(uint16_t num, IntegerBase base = IntegerBase::DEC, bool newline = false); /** * @brief Print integer in selected base. * - * @param num 32-bit unsigned integer - * @param base Integer base + * @param num 32-bit unsigned integer + * @param base Integer base + * @param newline If true, send a \r\n to start a new line. */ - void print(uint32_t num, IntegerBase base = IntegerBase::DEC); + void print(uint32_t num, IntegerBase base = IntegerBase::DEC, bool newline = false); /** * @brief Print c-string. * - * @param str Null terminated string + * @param str Null terminated string + * @param newline If true, send a \r\n to start a new line. */ - void print(const char * str); + void print(const char * str, bool newline = false); /** * @brief Print string. * * @param str String buffer * @param length String length + * @param newline If true, send a \r\n to start a new line. */ - virtual void print(const char * str, size_t length) = 0; + virtual void print(const char * str, size_t length, bool newline = false) = 0; /** * @brief Print new-line. @@ -161,6 +169,14 @@ namespace sta * @param length String length */ void println(const char * str, size_t length); + public: + /** + * @brief Read string. + * + * @param str String buffer + * @param length String length + */ + virtual void read(char* str, size_t length) = 0; private: /** @@ -170,32 +186,36 @@ namespace sta * @param base Integer base * @param fmt printf format string for base 10 * @param size Size of value in bytes + * @param newline If true, send a \r\n to start a new line. */ - void printBase(uintmax_t value, IntegerBase base, const char * fmt, size_t size); + void printBase(uintmax_t value, IntegerBase base, const char * fmt, size_t size, bool newline = false); /** * @brief Print unsigned integer in base 10. * * @param value Unsigned integer value * @param fmt printf format string + * @param newline If true, send a \r\n to start a new line. */ - void printDec(uintmax_t value, const char * fmt); + void printDec(uintmax_t value, const char * fmt, bool newline = false); /** * @brief Print unsigned integer in base 2. * * @param value Unsigned integer value * @param digits Number of digits to print + * @param newline If true, send a \r\n to start a new line. */ - void printBin(uintmax_t value, size_t digits); + void printBin(uintmax_t value, size_t digits, bool newline = false); /** * @brief Print unsigned integer in base 16. * * @param value Unsigned integer value * @param digits Number of digits to print + * @param newline If true, send a \r\n to start a new line. */ - void printHex(uintmax_t value, size_t digits); + void printHex(uintmax_t value, size_t digits, bool newline = false); }; } // namespace sta diff --git a/include/sta/debug/printing/printable_printf.hpp b/include/sta/debug/printing/printable_printf.hpp index a0de3cd..a570bd0 100644 --- a/include/sta/debug/printing/printable_printf.hpp +++ b/include/sta/debug/printing/printable_printf.hpp @@ -23,8 +23,17 @@ namespace sta * * @param str String buffer * @param length String length + * @param newline If true, send a \r\n to start a new line. */ - void print(const char * str, size_t length) override; + void print(const char * str, size_t length, bool newline = false) override; + + /** + * @brief Print string. + * + * @param str String buffer + * @param length String length + */ + void read(char * str, size_t length) override; }; } // namespace sta diff --git a/include/sta/debug/printing/printable_uart.hpp b/include/sta/debug/printing/printable_uart.hpp index 93f92c5..0559607 100644 --- a/include/sta/debug/printing/printable_uart.hpp +++ b/include/sta/debug/printing/printable_uart.hpp @@ -32,8 +32,17 @@ namespace sta * * @param str String buffer * @param length String length + * @param newline If true, send a \r\n to start a new line. */ - void print(const char * str, size_t length) override; + void print(const char * str, size_t length, bool newline = false) override; + + /** + * @brief Read string. + * + * @param str String buffer + * @param length String length + */ + void read(char * str, size_t length) override; private: UART * intf_; diff --git a/src/debug/printing/printable.cpp b/src/debug/printing/printable.cpp index a3206bb..73b4c5d 100644 --- a/src/debug/printing/printable.cpp +++ b/src/debug/printing/printable.cpp @@ -27,82 +27,76 @@ namespace sta println(str); } - void Printable::print(char c) + void Printable::print(char c, bool newline /* = false */) { - print(&c, 1); + print(&c, 1, newline); } - void Printable::print(bool b) + void Printable::print(bool b, bool newline /* = false */) { - print(b ? "true" : "false"); + print(b ? "true" : "false", newline); } - void Printable::print(double d) + void Printable::print(double d, bool newline /* = false */) { char buffer[64]; snprintf(buffer, sizeof(buffer), "%f", d); - print(buffer); + print(buffer, newline); } - void Printable::print(uint8_t num, IntegerBase base) + void Printable::print(uint8_t num, IntegerBase base, bool newline /* = false */) { - printBase(num, base, "%" PRIu8, sizeof(num)); + printBase(num, base, "%" PRIu8, sizeof(num), newline); } - void Printable::print(uint16_t num, IntegerBase base) + void Printable::print(uint16_t num, IntegerBase base, bool newline /* = false */) { - printBase(num, base, "%" PRIu16, sizeof(num)); + printBase(num, base, "%" PRIu16, sizeof(num), newline); } - void Printable::print(uint32_t num, IntegerBase base) + void Printable::print(uint32_t num, IntegerBase base, bool newline /* = false */) { - printBase(num, base, "%" PRIu32, sizeof(num)); + printBase(num, base, "%" PRIu32, sizeof(num), newline); } - void Printable::print(const char * str) + void Printable::print(const char * str, bool newline /* = false */) { - print(str, strlen(str)); + print(str, strlen(str), newline); } void Printable::println() { - print("\r\n", 2); + print("\r\n", 2, false); } void Printable::println(char c) { - print(&c, 1); - println(); + print(&c, 1, true); } void Printable::println(bool b) { - print(b); - println(); + print(b, true); } void Printable::println(double d) { - print(d); - println(); + print(d, true); } void Printable::println(uint8_t num, IntegerBase base) { - print(num, base); - println(); + print(num, base, true); } void Printable::println(uint16_t num, IntegerBase base) { - print(num, base); - println(); + print(num, base, true); } void Printable::println(uint32_t num, IntegerBase base) { - print(num, base); - println(); + print(num, base, true); } void Printable::println(const char * str) @@ -112,26 +106,25 @@ namespace sta void Printable::println(const char * str, size_t length) { - print(str, length); - println(); + print(str, length, true); } - void Printable::printBase(uintmax_t num, IntegerBase base, const char * fmt, size_t size) + void Printable::printBase(uintmax_t num, IntegerBase base, const char * fmt, size_t size, bool newline /* = false */) { switch (base) { case IntegerBase::DEC: - printDec(num, fmt); + printDec(num, fmt, newline); break; case IntegerBase::BIN: // Digits in base 2 = size in bytes * 8 - printBin(num, size * 8); + printBin(num, size * 8, newline); break; case IntegerBase::HEX: // Digits in base 16 = size in bytes * 2 - printHex(num, size * 2); + printHex(num, size * 2, newline); break; default: @@ -139,14 +132,14 @@ namespace sta } } - void Printable::printDec(uintmax_t num, const char * fmt) + void Printable::printDec(uintmax_t num, const char * fmt, bool newline /* = false */) { char buffer[64]; snprintf(buffer, sizeof(buffer), fmt, static_cast(num)); - print(buffer); + print(buffer, newline); } - void Printable::printBin(uintmax_t value, size_t digits) + void Printable::printBin(uintmax_t value, size_t digits, bool newline /* = false */) { // Need 8 digits for every byte char buffer[sizeof(value) * 8]; @@ -168,10 +161,10 @@ namespace sta buffer[i] = '0' + ((value >> (digits - 1 - i)) & 0x1); } - print(buffer, digits); + print(buffer, digits, newline); } - void Printable::printHex(uintmax_t value, size_t digits) + void Printable::printHex(uintmax_t value, size_t digits, bool newline /* = false */) { // Need 2 digits for every byte char buffer[sizeof(value) * 2]; @@ -179,7 +172,7 @@ namespace sta // Check bounds if (digits > sizeof(buffer)) { - print(""); + print("", newline); return; } // Nothing to do @@ -197,7 +190,7 @@ namespace sta buffer[i] = '0' + hex; } - print(buffer, digits); + print(buffer, digits, newline); } } // namespace sta diff --git a/src/debug/printing/printable_printf.cpp b/src/debug/printing/printable_printf.cpp index 07357f5..9c8a8d8 100644 --- a/src/debug/printing/printable_printf.cpp +++ b/src/debug/printing/printable_printf.cpp @@ -1,5 +1,6 @@ #include #include +#include #include @@ -10,11 +11,20 @@ namespace sta } - void PrintablePrintf::print(const char * str, size_t length) + void PrintablePrintf::print(const char * str, size_t length, bool newline /* = false */) { STA_ASSERT(str != nullptr); STA_ASSERT(length > 0); printf("%.*s", length, str); + printf("\r\n"); + } + + void PrintablePrintf::read(char * str, size_t length) + { + STA_ASSERT(str != nullptr); + STA_ASSERT(length > 0); + + STA_NOT_IMPLEMENTED(); } } // namespace sta diff --git a/src/debug/printing/printable_uart.cpp b/src/debug/printing/printable_uart.cpp index f3f7453..2877c82 100644 --- a/src/debug/printing/printable_uart.cpp +++ b/src/debug/printing/printable_uart.cpp @@ -17,11 +17,21 @@ namespace sta STA_ASSERT(intf->settings().mode == UARTMode::RX || intf->settings().mode == UARTMode::RX_TX); } - void PrintableUART::print(const char * str, size_t length) + void PrintableUART::print(const char * str, size_t length, bool newline /* = false */) { + const char * linebreak = "\r\n"; + intf_->acquire(); intf_->transfer(reinterpret_cast(str), length); + intf_->transfer(reinterpret_cast(linebreak), 2); intf_->release(); } + void PrintableUART::read(char * str, size_t length) + { + intf_->acquire(); + intf_->receive(reinterpret_cast(str), length); + intf_->release(); + } + } // namespace sta