Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: printf в IAR C
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
skopus
хочу в проекте использовать printf для вывода данных через USART
версия IAR C 4.11A. В проекте используется библиотека Normal DLIB

а когда компилятор натыкается на printf, выдает следующую ошибку

Error[e46]: Undefined external "__write" referred in ?putchar ( F:\Program Files\IAR Systems\Embedded Workbench 4.0 Evaluation\avr\LIB\DLIB\

может есть патч какой?
Rash
тебе надо переопределить функцию putchar(), т.к. твоя система не знает куда ей выводлить, а вообще на ftp IARa есть обновлённые библиотеки 50Мб, рекомендую скачать, эта тема уже обсуждалась, но к твоей проблеме это не относится, вроде
skopus
хорошо, а где и как я должен ее переопределить. мою функцию putchar компилятор то ли игнорирует, то ли не понимает, что должен перегрузить
IgorKossak
В таких случаях я обычно использую sprintf - вывод в стринг.
А уж из этого стринга можно выводить в любое устройство вывода (через драйвер): UART, LCD,...
BVU
Цитата(IgorKossak @ Dec 7 2005, 12:08) *
В таких случаях я обычно использую sprintf - вывод в стринг.
А уж из этого стринга можно выводить в любое устройство вывода (через драйвер): UART, LCD,...

А лучше написать свою (sprintf), что будет экономнее, как для обьема кода (не надо использовать лишние библиотеки) и не требует лишних затрат на размер стэка.
skopus
В мануале нашел, что надо сделать. Нужно написать свою функцию putchar в отдельном файле putchar.c, поместить этот файл в папку проекта, добавить в проект и перестроить его
GxOST
Цитата(skopus @ Dec 7 2005, 12:36) *
В мануале нашел, что надо сделать. Нужно написать свою функцию putchar в отдельном файле putchar.c, поместить этот файл в папку проекта, добавить в проект и перестроить его

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

glare.gif
zltigo
Цитата(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 они
случаем не лежат? Чувствую необходимость почитать....
Mty
Цитата(skopus @ Dec 7 2005, 12:36) *
В мануале нашел, что надо сделать. Нужно написать свою функцию putchar в отдельном файле putchar.c, поместить этот файл в папку проекта, добавить в проект и перестроить его


Не обязательно называть этот файл так.
У меня работает putchar обьявленный в файле buff232.c
Главное чтобы функция была обьявлена в проекте.

D.
IgorKossak
Цитата(zltigo @ Dec 7 2005, 12:15) *
...Кстати, в Pro версии IAR исходники библиотек вроде даются? А на здешнем FTP, для ARM они
случаем не лежат? Чувствую необходимость почитать....

У меня есть полные версии для АРМ 4.20а и для АВР 3.20д.
Ничего новее не попадалось уже очень долго.
Выложить, к сожалению, не могу - сижу за корпоративным файрволом.
zltigo
Цитата(IgorKossak @ Dec 7 2005, 12:25) *
У меня есть полные версии для АРМ 4.20а ....
Выложить, к сожалению, не могу - сижу за корпоративным файрволом.

То, что 'старенькие' не страшно, мне почитать/оценить/поучиться?
Кроме того, не думаю, что там что-то уже серьезно менялось.
А на почтовый адрес переслать?
IgorKossak
Цитата(zltigo @ Dec 7 2005, 12:36) *
...А на почтовый адрес переслать?

Можно, отправьте адрес на PM, только здесь сообщения не оставляйте.
compas
Для форматированного вывода куда угодно в 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);
SatMinistry
Здравствуйте. Пытаюсь использовать приведенную методику
Цитата
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 ")"


С какого перепугу ему там скобку хотеть? crying.gif
zltigo
Цитата(SatMinistry @ Jun 11 2010, 11:49) *
С какого перепугу ему там скобку хотеть? crying.gif

А как ему еще реагировать на некое непонятное ему словечко flash? Как на некий неправильно указанный параметр и реагирует.
Загляните help, какоe ключевое слово принято в IAR в качестве квалификатора flash.
SatMinistry
скомпилилось таки после прямой замены на __farflash....хотя по дефайнам вроде было определено на него....зато пахать при вызове ф-ции не хочет пока что логично вроде... будем рыть..
upd:
Вот что надо было прописать:
#include <comp_a90.h>
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.