MiniMax (15.04.2007 11:16, просмотров: 1) ответил AlexandrY на va_end( arglist ); - должен быть последним оператором в теле функции
Здесь похоже проблема все-таки в выделяемом стеке. Но не могу понять причины 1) Такая комбинация работает ( стек = 128 и буфер для печати = 64)
xTaskCreate( vKeypad, ( const signed portCHAR * const )"Keypad" , ( ( unsigned portSHORT ) 128 ), NULL,tskIDLE_PRIORITY,NULL);
void lcd_printf( const char *format, ... )
{
char msgBuf[64] = {0};
va_list arglist;
va_start( arglist, format );
vsprintf(msgBuf,format,arglist );
WriteLCD(msgBuf);
va_end( arglist );
}
2) Допустим, что необходимо печатать 128 символов за один проход
Такая комбинация не работает (256 и 128)
xTaskCreate( vKeypad, ( const signed portCHAR * const )"Keypad" , ( ( unsigned portSHORT ) 256 ), NULL,tskIDLE_PRIORITY,NULL);
void lcd_printf( const char *format, ... )
{
char msgBuf[128] = {0};
va_list arglist;
va_start( arglist, format );
vsprintf(msgBuf,format,arglist );
WriteLCD(msgBuf);
va_end( arglist );
}
Программа терпит крах. Все другие задачи останавливаются, что естественно.
Если закомментировать ( //vsprintf(msgBuf,format,arglist );),
то все работает ( без печати конечно-же).
Т.е. причина всего этого безобразия vsprintf.
Но почему ???
Памяти хватает, проблем с выравниванием не видно,...