Skip to content

Commit 770ad61

Browse files
committed
Trap on RTX errors if enabled
If MBED_TRAP_ERRORS_ENABLED is defined to 1 then trap on RTX errors. This includes using mutexes in ISR context.
1 parent e48e599 commit 770ad61

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

platform/mbed_retarget.cpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,3 +1046,67 @@ void operator delete[](void *ptr)
10461046
free(ptr);
10471047
}
10481048
}
1049+
1050+
#if defined(MBED_CONF_RTOS_PRESENT) && defined(MBED_TRAP_ERRORS_ENABLED) && MBED_TRAP_ERRORS_ENABLED
1051+
1052+
static const char* error_msg(int32_t status)
1053+
{
1054+
switch (status) {
1055+
case osError:
1056+
return "Unspecified RTOS error";
1057+
case osErrorTimeout:
1058+
return "Operation not completed within the timeout period";
1059+
case osErrorResource:
1060+
return "Resource not available";
1061+
case osErrorParameter:
1062+
return "Parameter error";
1063+
case osErrorNoMemory:
1064+
return "System is out of memory";
1065+
case osErrorISR:
1066+
return "Not allowed in ISR context";
1067+
default:
1068+
return "Unknown";
1069+
}
1070+
}
1071+
1072+
extern "C" void EvrRtxKernelError (int32_t status)
1073+
{
1074+
error("Kernel error %i: %s\r\n", status, error_msg(status));
1075+
}
1076+
1077+
extern "C" void EvrRtxThreadError (osThreadId_t thread_id, int32_t status)
1078+
{
1079+
error("Thread %p error %i: %s\r\n", thread_id, status, error_msg(status));
1080+
}
1081+
1082+
extern "C" void EvrRtxTimerError (osTimerId_t timer_id, int32_t status)
1083+
{
1084+
error("Timer %p error %i: %s\r\n", timer_id, status, error_msg(status));
1085+
}
1086+
1087+
extern "C" void EvrRtxEventFlagsError (osEventFlagsId_t ef_id, int32_t status)
1088+
{
1089+
error("Event %p error %i: %s\r\n", ef_id, status, error_msg(status));
1090+
}
1091+
1092+
extern "C" void EvrRtxMutexError (osMutexId_t mutex_id, int32_t status)
1093+
{
1094+
error("Mutex %p error %i: %s\r\n", mutex_id, status, error_msg(status));
1095+
}
1096+
1097+
extern "C" void EvrRtxSemaphoreError (osSemaphoreId_t semaphore_id, int32_t status)
1098+
{
1099+
error("Semaphore %p error %i\r\n", semaphore_id, status);
1100+
}
1101+
1102+
extern "C" void EvrRtxMemoryPoolError (osMemoryPoolId_t mp_id, int32_t status)
1103+
{
1104+
error("Memory Pool %p error %i\r\n", mp_id, status);
1105+
}
1106+
1107+
extern "C" void EvrRtxMessageQueueError (osMessageQueueId_t mq_id, int32_t status)
1108+
{
1109+
error("Message Queue %p error %i\r\n", mq_id, status);
1110+
}
1111+
1112+
#endif

0 commit comments

Comments
 (0)