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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> printf в IAR C, как победить ошибку
skopus
сообщение Dec 7 2005, 08:47
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124



хочу в проекте использовать 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\

может есть патч какой?
Go to the top of the page
 
+Quote Post
Rash
сообщение Dec 7 2005, 08:57
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



тебе надо переопределить функцию putchar(), т.к. твоя система не знает куда ей выводлить, а вообще на ftp IARa есть обновлённые библиотеки 50Мб, рекомендую скачать, эта тема уже обсуждалась, но к твоей проблеме это не относится, вроде
Go to the top of the page
 
+Quote Post
skopus
сообщение Dec 7 2005, 09:08
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124



хорошо, а где и как я должен ее переопределить. мою функцию putchar компилятор то ли игнорирует, то ли не понимает, что должен перегрузить
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 7 2005, 09:08
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



В таких случаях я обычно использую sprintf - вывод в стринг.
А уж из этого стринга можно выводить в любое устройство вывода (через драйвер): UART, LCD,...
Go to the top of the page
 
+Quote Post
BVU
сообщение Dec 7 2005, 09:20
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Цитата(IgorKossak @ Dec 7 2005, 12:08) *
В таких случаях я обычно использую sprintf - вывод в стринг.
А уж из этого стринга можно выводить в любое устройство вывода (через драйвер): UART, LCD,...

А лучше написать свою (sprintf), что будет экономнее, как для обьема кода (не надо использовать лишние библиотеки) и не требует лишних затрат на размер стэка.


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
skopus
сообщение Dec 7 2005, 09:36
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124



В мануале нашел, что надо сделать. Нужно написать свою функцию putchar в отдельном файле putchar.c, поместить этот файл в папку проекта, добавить в проект и перестроить его
Go to the top of the page
 
+Quote Post
GxOST
сообщение Dec 7 2005, 09:40
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 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Мб, рекомендую скачать, эта тема уже обсуждалась, но к твоей проблеме это не относится, вроде

glare.gif


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 7 2005, 10:15
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Mty
сообщение Dec 7 2005, 10:21
Сообщение #9


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

Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560



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


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

D.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 7 2005, 10:25
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

У меня есть полные версии для АРМ 4.20а и для АВР 3.20д.
Ничего новее не попадалось уже очень долго.
Выложить, к сожалению, не могу - сижу за корпоративным файрволом.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 7 2005, 10:36
Сообщение #11


Гуру
******

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



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

То, что 'старенькие' не страшно, мне почитать/оценить/поучиться?
Кроме того, не думаю, что там что-то уже серьезно менялось.
А на почтовый адрес переслать?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 7 2005, 11:15
Сообщение #12


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(zltigo @ Dec 7 2005, 12:36) *
...А на почтовый адрес переслать?

Можно, отправьте адрес на PM, только здесь сообщения не оставляйте.
Go to the top of the page
 
+Quote Post
compas
сообщение Dec 9 2005, 08:43
Сообщение #13





Группа: Участник
Сообщений: 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);
Go to the top of the page
 
+Quote Post
SatMinistry
сообщение Jun 11 2010, 08:49
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 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 ")"


С какого перепугу ему там скобку хотеть? crying.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 11 2010, 09:15
Сообщение #15


Гуру
******

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



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

А как ему еще реагировать на некое непонятное ему словечко flash? Как на некий неправильно указанный параметр и реагирует.
Загляните help, какоe ключевое слово принято в IAR в качестве квалификатора flash.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th June 2025 - 05:44
Рейтинг@Mail.ru


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