Всем привет!
Подскажите где я не прав.
Имеется примерно такой код для LPC1768 с FreeRTOS:
Код
uint_fast8_t syslog_write(SysLogRecordType type, const signed char * const threadname, const char *fmt, ...)
{
/* whatever */
char string[SYSLOG_MAXLINE] = {0};
taskENTER_CRITICAL();
va_list args;
va_start(args, fmt);
length = format_string(string, sizeof string, type, threadname, fmt, args);
va_end(args);
taskEXIT_CRITICAL();
/* whatever */
}
Вызывается это из разных задач.
Функция format_string():
Код
static size_t format_string(char *buffer, size_t size, SysLogRecordType type, const char * const threadname, const char *fmt, va_list args)
{
/* whatever */
vsprintf(buffer, fmt, args);
/* whatever */
}
Проблема в том что когда syslog_write() вызывается в разных потоках, то в vsprintf() происходит HardFault (CFSR = 0x8200). Если заменить эту функцию на что угодно типа sprintf(buffer, "hi there") то всё работает стабильно. Т.е. связано это как-то с va_list. Я честно говоря плохо понимаю как эта фишка работае. При этом вызов её обёрнут в taskENTER_CRITICAL();
Если же syslog_write() вызывается только в одном потоке, то никаких проблем. Но стоит ему вызываться в разных вытесняющих друг друга - периодические фолты.