реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Зависания на printf, нужен форматированный вывод в DBGU
athlon64
сообщение Jul 5 2010, 07:08
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Процессор SAM7X512, IAR 5.4.
В проекте используются порты COM0, COM1, PIT, TWI. Основой для проекта был пример из IAR "basic-usart-hw-handshaking-project". Приём в порты COM0, COM1 сделан через регистры побайтно, вывод - через DMA. Нужно для вывода отладочного лога в DBGU форматированный вывод.

При инициализации DBGU:
Код
  PIO_Configure  (DBGU_pins, PIO_LISTSIZE(DBGU_pins));
  DBGU_Configure (DBGU_STANDARD, 115200, BOARD_MCK);

и попытке вывести любую строку при помощи
Код
printf("TEST");
процессор зависает.
То же самое при выводе с помощью
Код
TRACE_INFO("TEST");
и соответствующей инициализацией из trace.c порта DBGU.
При этом в порт ничего не попадает.
А вот
Код
DBGU_PutChar(byte);
работает прекрасно.

Куда смотреть?


--------------------
Руслан
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jul 5 2010, 07:40
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



В размер стэка смотреть. Перво-наперво попробовать увеличить.
Go to the top of the page
 
+Quote Post
athlon64
сообщение Jul 5 2010, 08:02
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Ошибочка вышла - если выводим только текст, не виснет.
Так виснет:
Код
printf("-- TEST --\n\r");

а так - нет, но в порт ничего не выводится:
Код
printf("-- TEST --");

Цитата(jorikdima @ Jul 5 2010, 13:40) *
В размер стэка смотреть. Перво-наперво попробовать увеличить.

Если можно, для чайников - где он изменяется?


--------------------
Руслан
Go to the top of the page
 
+Quote Post
athlon64
сообщение Jul 6 2010, 03:11
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Увеличил размер стека в icf-файле с 4Кб до 8Кб. Не полегчало


--------------------
Руслан
Go to the top of the page
 
+Quote Post
athlon64
сообщение Jul 15 2010, 04:54
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Решения так и не нашёл, пока вывожу в цикле посимвольно пару строк раз в секунду.
Хотелось бы выводить полноценный лог в порт DBGU, для чего форматированный вывод очень нужен.
Может какие то принципиальные куски кода привести?


--------------------
Руслан
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jul 15 2010, 05:44
Сообщение #6


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Попробуйте так
Код
char format_buff[512];        //Сюда будет копироваться отформатированная строка

void out_fdbg(const char *args, ...)
{
   u32_t len;
   va_list ap;
   va_start(ap, args);
   len = vsprintf(format_buff,args,ap);
   va_end(ap);
   Uart1_SendData(format_buff,len);
}
Go to the top of the page
 
+Quote Post
athlon64
сообщение Jul 15 2010, 06:06
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Цитата(MALLOY2 @ Jul 15 2010, 11:44) *
Попробуйте так
Код
char format_buff[512];        //Сюда будет копироваться отформатированная строка

void out_fdbg(const char *args, ...)
{
   u32_t len;
   va_list ap;
   va_start(ap, args);
   len = vsprintf(format_buff,args,ap);
   va_end(ap);
   Uart1_SendData(format_buff,len);
}

IAR ругается на va_list, va_start, va_end. Где они лежат не понял sad.gif
Что кроме stdio.h нужно инклюдить?


--------------------
Руслан
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jul 15 2010, 07:47
Сообщение #8


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
#include <stdarg.h>


Смотрите, размер format_buff полностью на вашей ответственности, если результирующая строка не влезет в него сами виноваты.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 15 2010, 07:55
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(MALLOY2 @ Jul 15 2010, 11:47) *
Смотрите, размер format_buff полностью на вашей ответственности, если результирующая строка не влезет в него сами виноваты.

Поэтому проще использовать vsnprintf вместо vsprintf.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jul 15 2010, 07:59
Сообщение #10


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Согласен, забыл про нее, давно пользуюсь своей функцией
Go to the top of the page
 
+Quote Post
athlon64
сообщение Jul 15 2010, 08:15
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Цитата(MALLOY2 @ Jul 15 2010, 13:47) *
Смотрите, размер format_buff полностью на вашей ответственности, если результирующая строка не влезет в него сами виноваты.
это понятно

так и не понял как пользоваться
что такое args и ap в вашем коде?


--------------------
Руслан
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jul 15 2010, 08:21
Сообщение #12


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Это расписано почти в каждой книжке по С, stdarg.h
Go to the top of the page
 
+Quote Post
athlon64
сообщение Jul 15 2010, 09:45
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Код
void DBGU_fprint(const char *args, ...)
{
  char format_buff[512];        //Сюда будет копироваться отформатированная строка
  unsigned short int len,i_len;
  
  va_list ap;
  va_start(ap, args);
  len = vsprintf(format_buff, args, ap);
  va_end(ap);
  
  for (i_len=0; i_len < len; i_len++)
    DBGU_PutChar(format_buff[i_len]);
}

...
// Вызов:
  DBGU_fprint("TEST\n");

Во, заработало!! Спасибо
Пока этот вариант более чем устраивает smile.gif

Сообщение отредактировал athlon64 - Jul 15 2010, 10:09


--------------------
Руслан
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 15 2010, 10:35
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(athlon64 @ Jul 15 2010, 13:45) *
Пока этот вариант более чем устраивает smile.gif

Сделайте лучше:
Код
len = vsnprintf(format_buff, sizeof(format_buff), args, ap);
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jul 15 2010, 12:43
Сообщение #15


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



format_buff нестоит делать локальной!!!!! стека не напасетесь!!!!

Стоит также заменить vsprintf на vsnprintf, но есть НО, почитайте о результатах которые возвращет эта функция, она может вернуть -1, для вашего кода это будет баг. Надо перед отправкой в порт проверить значение len и тип len сменить на знаковый.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01488 секунд с 7
ELECTRONIX ©2004-2016