Avoid ISR blocking and add overflow protection

This commit is contained in:
2026-07-07 14:45:15 +02:00
parent 3e1bcd6195
commit 3780497e8d
+10 -2
View File
@@ -40,17 +40,24 @@ extern osSemaphoreId_t xUARTDMASemaphore;
*/ */
void uart_printf(const char *fmt, ...) void uart_printf(const char *fmt, ...)
{ {
if (__get_IPSR() != 0) return;
char buffer[128]; char buffer[128];
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
int len = vsnprintf(buffer, sizeof(buffer), fmt, args); int len = vsnprintf(buffer, sizeof(buffer), fmt, args);
va_end(args); va_end(args);
if (len > 0) if (len > 0)
{ {
if (osKernelGetState() == osKernelRunning && __get_IPSR() == 0) // 2. OVERFLOW PROTECTION: Cap length to prevent reading stack garbage
if (len >= sizeof(buffer)) len = sizeof(buffer) - 1;
if (osKernelGetState() == osKernelRunning)
{ {
if (osSemaphoreAcquire(xUARTDMASemaphore, 100U) == osOK) // 3. RELIABILITY: Wait indefinitely so debug prints aren't silently dropped
if (osSemaphoreAcquire(xUARTDMASemaphore, osWaitForever) == osOK)
{ {
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, len, HAL_MAX_DELAY); HAL_UART_Transmit(&huart1, (uint8_t*)buffer, len, HAL_MAX_DELAY);
osSemaphoreRelease(xUARTDMASemaphore); osSemaphoreRelease(xUARTDMASemaphore);
@@ -58,6 +65,7 @@ void uart_printf(const char *fmt, ...)
} }
else else
{ {
// RTOS hasn't started yet (boot sequence), safe to poll directly
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, len, HAL_MAX_DELAY); HAL_UART_Transmit(&huart1, (uint8_t*)buffer, len, HAL_MAX_DELAY);
} }
} }