ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
3 июля
86506 Топик полностью
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. Но почему ??? Памяти хватает, проблем с выравниванием не видно,...