Code: Select all
#define NUM_BUFFERS 16
#define BUFFERS_SIZE 16
static char buffers[NUM_BUFFERS][BUFFERS_SIZE];
static volatile uint32_t bufIndex;
static msg_t mbDebugQueue[NUM_BUFFERS];
static mailbox_t mbDebug;
uint32_t debugFlags;
void uart3Print(const char *string)
{
uartStartSend(&UARTD3, strlen(string), string);
}
THD_WORKING_AREA(waThreadDebug, 128);
THD_FUNCTION(threadDebug, arg)
{
msg_t msg;
console_t *con;
con = arg;
while (1)
{
if(chMBFetch(&mbDebug, &msg, TIME_INFINITE) == MSG_OK)
{
uart3Print((char *) msg);
}
chThdSleepMilliseconds(100);
}
}
void debugInit(void)
{
debugFlags = DEBUG_FLAGS_DEFAULT;
bufIndex = 0;
chMBObjectInit(&mbDebug, mbDebugQueue, NUM_BUFFERS);
}
void debug(const char *format, ...)
{
va_list ap;
va_start(ap, format);
vsnprintf(buffers[bufIndex % NUM_BUFFERS], BUFFERS_SIZE, format, ap);
if(chMBPost(&mbDebug, (msg_t) buffers[bufIndex % NUM_BUFFERS], TIME_INFINITE) == MSG_OK)
bufIndex++;
}
void debugI(const char *string)
{
memcpy(buffers[bufIndex % NUM_BUFFERS], string, BUFFERS_SIZE);
if(chMBPostI(&mbDebug, (msg_t) buffers[bufIndex % NUM_BUFFERS]) == MSG_OK)
bufIndex++;
}
It works correctly with simple task and version debugI from ISR - I got debug messages on console.
Code: Select all
THD_FUNCTION(threadLed, arg)
{
while (1)
{
debug("LED task\n\r");
LED1_ON;
chThdSleepMilliseconds(10);
LED1_OFF;
chThdSleepMilliseconds(1000);
}
}
But with threadCanRx2 task I got only one debug message on console and hard fault exception occurs. With commented out debug function, task works.
Do you have idea what can be wrong ?
Code: Select all
THD_WORKING_AREA(waCanRx2, 256);
THD_FUNCTION(threadCanRx2, arg)
{
event_listener_t evCan2rx, evCan2err;
CANRxFrame rxmsg;
eventmask_t mask;
(void) arg;
chRegSetThreadName("CAN2 RX");
chEvtRegister(&CAND2.rxfull_event, &evCan2rx, 0);
chEvtRegister(&CAND2.error_event, &evCan2err, 1);
while (1)
{
debug("CAN2 task\n\r");
if ((mask = chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(100))) == 0)
continue;
if (mask & EVENT_MASK(0))
{
if (canReceive(&CAND2, CAN_ANY_MAILBOX, &rxmsg, TIME_IMMEDIATE) == MSG_OK)
{
}
}
if (mask & EVENT_MASK(1))
{
errors |= chEvtGetAndClearFlags(&evCan2err);
}
chThdSleepMilliseconds(500);
}
chEvtUnregister(&CAND2.rxfull_event, &evCan2rx);
chEvtUnregister(&CAND2.rxfull_event, &evCan2err);
}