mirror of https://github.com/ARMmbed/mbed-os.git
commit
e698f0b29f
|
|
@ -134,6 +134,23 @@ void UARTSerial::sigio(Callback<void()> func)
|
||||||
core_util_critical_section_exit();
|
core_util_critical_section_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Special synchronous write designed to work from critical section, such
|
||||||
|
* as in mbed_error_vprintf.
|
||||||
|
*/
|
||||||
|
ssize_t UARTSerial::write_unbuffered(const char *buf_ptr, size_t length)
|
||||||
|
{
|
||||||
|
while (!_txbuf.empty()) {
|
||||||
|
tx_irq();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t data_written = 0; data_written < length; data_written++) {
|
||||||
|
SerialBase::_base_putc(*buf_ptr++);
|
||||||
|
data_written++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
ssize_t UARTSerial::write(const void *buffer, size_t length)
|
ssize_t UARTSerial::write(const void *buffer, size_t length)
|
||||||
{
|
{
|
||||||
size_t data_written = 0;
|
size_t data_written = 0;
|
||||||
|
|
@ -143,6 +160,10 @@ ssize_t UARTSerial::write(const void *buffer, size_t length)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (core_util_in_critical_section()) {
|
||||||
|
return write_unbuffered(buf_ptr, length);
|
||||||
|
}
|
||||||
|
|
||||||
api_lock();
|
api_lock();
|
||||||
|
|
||||||
// Unlike read, we should write the whole thing if blocking. POSIX only
|
// Unlike read, we should write the whole thing if blocking. POSIX only
|
||||||
|
|
|
||||||
|
|
@ -238,6 +238,9 @@ private:
|
||||||
/** Release mutex */
|
/** Release mutex */
|
||||||
virtual void api_unlock(void);
|
virtual void api_unlock(void);
|
||||||
|
|
||||||
|
/** Unbuffered write - invoked when write called from critical section */
|
||||||
|
ssize_t write_unbuffered(const char *buf_ptr, size_t length);
|
||||||
|
|
||||||
/** Software serial buffers
|
/** Software serial buffers
|
||||||
* By default buffer size is 256 for TX and 256 for RX. Configurable through mbed_app.json
|
* By default buffer size is 256 for TX and 256 for RX. Configurable through mbed_app.json
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -18,13 +18,8 @@
|
||||||
#include "platform/mbed_wait_api.h"
|
#include "platform/mbed_wait_api.h"
|
||||||
#include "platform/mbed_toolchain.h"
|
#include "platform/mbed_toolchain.h"
|
||||||
#include "platform/mbed_interface.h"
|
#include "platform/mbed_interface.h"
|
||||||
|
#include "platform/mbed_retarget.h"
|
||||||
#include "platform/mbed_critical.h"
|
#include "platform/mbed_critical.h"
|
||||||
#include "hal/serial_api.h"
|
|
||||||
|
|
||||||
#if DEVICE_SERIAL
|
|
||||||
extern int stdio_uart_inited;
|
|
||||||
extern serial_t stdio_uart;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
WEAK void mbed_die(void)
|
WEAK void mbed_die(void)
|
||||||
{
|
{
|
||||||
|
|
@ -55,36 +50,41 @@ void mbed_error_printf(const char *format, ...)
|
||||||
{
|
{
|
||||||
va_list arg;
|
va_list arg;
|
||||||
va_start(arg, format);
|
va_start(arg, format);
|
||||||
mbed_error_vfprintf(format, arg);
|
mbed_error_vprintf(format, arg);
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mbed_error_vprintf(const char *format, va_list arg)
|
||||||
|
{
|
||||||
|
core_util_critical_section_enter();
|
||||||
|
char buffer[132];
|
||||||
|
int size = vsnprintf(buffer, sizeof buffer, format, arg);
|
||||||
|
if (size >= sizeof buffer) {
|
||||||
|
/* Output was truncated - indicate by overwriting last 4 bytes of buffer
|
||||||
|
* with ellipsis and newline.
|
||||||
|
* (Note that although vsnprintf always leaves a NUL terminator, we
|
||||||
|
* don't need a terminator and can use the entire buffer)
|
||||||
|
*/
|
||||||
|
memcpy(&buffer[sizeof buffer - 4], "...\n", 4);
|
||||||
|
size = sizeof buffer;
|
||||||
|
}
|
||||||
|
#if MBED_CONF_PLATFORM_STDIO_CONVERT_NEWLINES || MBED_CONF_PLATFORM_STDIO_CONVERT_TTY_NEWLINES
|
||||||
|
char stdio_out_prev = '\0';
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
if (buffer[i] == '\n' && stdio_out_prev != '\r') {
|
||||||
|
const char cr = '\r';
|
||||||
|
write(STDERR_FILENO, &cr, 1);
|
||||||
|
}
|
||||||
|
write(STDERR_FILENO, &buffer[i], 1);
|
||||||
|
stdio_out_prev = buffer[i];
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
write(STDERR_FILENO, buffer, size);
|
||||||
|
#endif
|
||||||
|
core_util_critical_section_exit();
|
||||||
|
}
|
||||||
|
|
||||||
void mbed_error_vfprintf(const char *format, va_list arg)
|
void mbed_error_vfprintf(const char *format, va_list arg)
|
||||||
{
|
{
|
||||||
#if DEVICE_SERIAL
|
mbed_error_vprintf(format, arg);
|
||||||
#define ERROR_BUF_SIZE (128)
|
|
||||||
core_util_critical_section_enter();
|
|
||||||
char buffer[ERROR_BUF_SIZE];
|
|
||||||
int size = vsnprintf(buffer, ERROR_BUF_SIZE, format, arg);
|
|
||||||
if (size > 0) {
|
|
||||||
if (!stdio_uart_inited) {
|
|
||||||
serial_init(&stdio_uart, STDIO_UART_TX, STDIO_UART_RX);
|
|
||||||
}
|
|
||||||
#if MBED_CONF_PLATFORM_STDIO_CONVERT_NEWLINES
|
|
||||||
char stdio_out_prev = '\0';
|
|
||||||
for (int i = 0; i < size; i++) {
|
|
||||||
if (buffer[i] == '\n' && stdio_out_prev != '\r') {
|
|
||||||
serial_putc(&stdio_uart, '\r');
|
|
||||||
}
|
|
||||||
serial_putc(&stdio_uart, buffer[i]);
|
|
||||||
stdio_out_prev = buffer[i];
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
for (int i = 0; i < size; i++) {
|
|
||||||
serial_putc(&stdio_uart, buffer[i]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
core_util_critical_section_exit();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ WEAK void error(const char *format, ...)
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
va_list arg;
|
va_list arg;
|
||||||
va_start(arg, format);
|
va_start(arg, format);
|
||||||
mbed_error_vfprintf(format, arg);
|
mbed_error_vprintf(format, arg);
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
#endif
|
#endif
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ extern "C" {
|
||||||
#else //MBED_CONF_PLATFORM_MAX_ERROR_FILENAME_LEN
|
#else //MBED_CONF_PLATFORM_MAX_ERROR_FILENAME_LEN
|
||||||
#if MBED_CONF_PLATFORM_MAX_ERROR_FILENAME_LEN > 64
|
#if MBED_CONF_PLATFORM_MAX_ERROR_FILENAME_LEN > 64
|
||||||
//We have to limit this to 64 bytes since we use mbed_error_printf for error reporting
|
//We have to limit this to 64 bytes since we use mbed_error_printf for error reporting
|
||||||
//and mbed_error_vfprintf uses 128bytes internal buffer which may not be sufficient for anything
|
//and mbed_error_vprintf uses 128bytes internal buffer which may not be sufficient for anything
|
||||||
//longer that 64 bytes with the current implementation.
|
//longer that 64 bytes with the current implementation.
|
||||||
#error "Unsupported error filename buffer length detected, max supported length is 64 chars. Please change MBED_CONF_PLATFORM_MAX_ERROR_FILENAME_LEN or max-error-filename-len in configuration."
|
#error "Unsupported error filename buffer length detected, max supported length is 64 chars. Please change MBED_CONF_PLATFORM_MAX_ERROR_FILENAME_LEN or max-error-filename-len in configuration."
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "mbed_toolchain.h"
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
|
|
||||||
/* Mbed interface mac address
|
/* Mbed interface mac address
|
||||||
|
|
@ -146,9 +147,15 @@ void mbed_error_printf(const char *format, ...);
|
||||||
* @param arg Variable arguments list
|
* @param arg Variable arguments list
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
void mbed_error_vprintf(const char *format, va_list arg);
|
||||||
|
|
||||||
|
/** @deprecated Renamed to mbed_error_vprintf to match functionality */
|
||||||
|
MBED_DEPRECATED_SINCE("mbed-os-5.11",
|
||||||
|
"Renamed to mbed_error_vprintf to match functionality.")
|
||||||
void mbed_error_vfprintf(const char *format, va_list arg);
|
void mbed_error_vfprintf(const char *format, va_list arg);
|
||||||
/** @}*/
|
/** @}*/
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1250,6 +1250,8 @@ extern "C" void exit(int return_code)
|
||||||
#if MBED_CONF_PLATFORM_STDIO_FLUSH_AT_EXIT
|
#if MBED_CONF_PLATFORM_STDIO_FLUSH_AT_EXIT
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
|
fsync(STDOUT_FILENO);
|
||||||
|
fsync(STDERR_FILENO);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,6 @@
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "platform/mbed_error.h"
|
#include "platform/mbed_error.h"
|
||||||
#include "platform/mbed_interface.h"
|
#include "platform/mbed_interface.h"
|
||||||
#include "hal/serial_api.h"
|
|
||||||
|
|
||||||
#ifndef MBED_FAULT_HANDLER_DISABLED
|
#ifndef MBED_FAULT_HANDLER_DISABLED
|
||||||
#include "mbed_rtx_fault_handler.h"
|
#include "mbed_rtx_fault_handler.h"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue