|
printf в IAR C, как победить ошибку |
|
|
|
Dec 7 2005, 09:40
|

Участник

Группа: Свой
Сообщений: 58
Регистрация: 6-12-05
Из: Санкт-Петербург
Пользователь №: 11 878

|
Цитата(skopus @ Dec 7 2005, 12:36)  В мануале нашел, что надо сделать. Нужно написать свою функцию putchar в отдельном файле putchar.c, поместить этот файл в папку проекта, добавить в проект и перестроить его За полчаса до этого: Цитата(Rash @ Dec 7 2005, 11:57)  тебе надо переопределить функцию putchar(), т.к. твоя система не знает куда ей выводлить, а вообще на ftp IARa есть обновлённые библиотеки 50Мб, рекомендую скачать, эта тема уже обсуждалась, но к твоей проблеме это не относится, вроде
--------------------
|
|
|
|
|
Dec 7 2005, 10:15
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(IgorKossak @ Dec 7 2005, 11:08)  В таких случаях я обычно использую sprintf - вывод в стринг. А уж из этого стринга можно выводить в любое устройство вывода (через драйвер): UART, LCD,... Да, нормальный подход. Если поуниверсальнее, то свой аналог printf(), как обертка на vsprintf() Что-то типа: void bprintf( char *arg_list, ...) { va_list arg_buffer; va_start( arg_buffer, arg_list ); vsprintf( tobuff, arg_list, arg_buffer ); // тут пользуем получившуюся в tobuff строку ........ // Причем не обязательно многократно вызывая посимвольную печать, // как это навязывается "готовым" ptintf() Да и использовать не использовать стек // можно выбирать.... } Цитата(BVU @ Dec 7 2005, 11:08)  А лучше написать свою (sprintf), что будет экономнее, как для обьема кода (не надо использовать лишние библиотеки) и не требует лишних затрат на размер стэка. Напишет, со временем, если будет увереность, что сможет шустрее и/или компактнее написать а пока достаточно обратить внимание на предоставляемые в некоторых пакетах облегченные вариаты ..printf() с отсутствием плавающей точки, даты,.... Кстати, в Pro версии IAR исходники библиотек вроде даются? А на здешнем FTP, для ARM они случаем не лежат? Чувствую необходимость почитать....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 7 2005, 10:21
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560

|
Цитата(skopus @ Dec 7 2005, 12:36)  В мануале нашел, что надо сделать. Нужно написать свою функцию putchar в отдельном файле putchar.c, поместить этот файл в папку проекта, добавить в проект и перестроить его Не обязательно называть этот файл так. У меня работает putchar обьявленный в файле buff232.c Главное чтобы функция была обьявлена в проекте. D.
|
|
|
|
|
Dec 7 2005, 10:36
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(IgorKossak @ Dec 7 2005, 12:25)  У меня есть полные версии для АРМ 4.20а .... Выложить, к сожалению, не могу - сижу за корпоративным файрволом. То, что 'старенькие' не страшно, мне почитать/оценить/поучиться? Кроме того, не думаю, что там что-то уже серьезно менялось. А на почтовый адрес переслать?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 9 2005, 08:43
|
Группа: Участник
Сообщений: 14
Регистрация: 23-07-05
Пользователь №: 7 039

|
Для форматированного вывода куда угодно в IARe под AVR (пробовал в 2.23, 4.10, 411)можно использовать следуюшие финты ушами: - определяешь функцию для вывода байта туда куда тебе нужно, например в UART (mega 32), но можно куда угодно (я прикручивал для вывода на LCD, на термопринтер, в UART одном проекте) void PC_TX(uchar ch) { UCSRA=b01000000; UDR=ch; while(!(UCSRA & b01000000)); }
- определаяшь функцию для подстановки в библиотечную функцию _formatted_write_P, которая собственно и делает форматированный вывод (строка хранится во флеш). Нужно подключить библиотеку #include <iccutl_p.h> static void put_one_char(char ch, void *dummy) { PC_TX(ch); } - а вот функция, вызываемая в проекте для форматированного вывода. Если хочешь в одном проекте делать форматированный вывод на разные железяки, то объявляй функции типа printk, put_one_char,PC_TX, только с разными именами void printk(char flash *format, ...) { va_list ap; va_start (ap, format); _formatted_write_P(format, put_one_char, (void *) 0, ap); va_end (ap); }
а вот пример вызова: unsigned int a; printk((char flash*)"Сообщение %u",a);
|
|
|
|
|
Jun 11 2010, 08:49
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 11-06-10
Пользователь №: 57 870

|
Здравствуйте. Пытаюсь использовать приведенную методику Цитата void PC_TX(uchar ch) { UCSRA=b01000000; UDR=ch; while(!(UCSRA & b01000000)); } Цитата static void put_one_char(char ch, void *dummy) { PC_TX(ch); } Цитата void printk(char flash *format, ...) { va_list ap; va_start (ap, format); _formatted_write_P(format, put_one_char, (void *) 0, ap); va_end (ap); } в одном сишнике. в соответствующем хидере идут прототипы этих функции. даже в проге пока printk() еще нигде не вызывается а иар уже пишет ошибку Цитата Error[Pe018]: expected a ")" С какого перепугу ему там скобку хотеть?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|