Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: sprntf не работает в IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
SortoVaritu
Использую IAR 5.10
Не работает функция sprintf

при таком коде

char L[10]

sprintf(L,"СПРИНТФ");

в L записывается какая то ерунда. Причем в дебугере все нормально, а вот после прошивки в железо к сожалению результата нет.
Изучал форумы. Стэки закрутил побольше - все равно ничего не выходит.
В чем может быть проблема?
IgorKossak
Если у Вас установлена опция располагать стринги во флеш, то Вам больше подойдёт функция sprintf_P
SortoVaritu
Цитата(IgorKossak @ Nov 4 2010, 21:25) *
Если у Вас установлена опция располагать стринги во флеш, то Вам больше подойдёт функция sprintf_P


а что это за опция и где она?
SortoVaritu
Цитата(SortoVaritu @ Nov 5 2010, 00:34) *
а что это за опция и где она?

Все... Я уже нашел
Nikkolaj
Добрый день.
Я сейчас впервые попробовал использовать функцию sprintf ();
Текст самый простой:

char L[10];
sprintf (L, "787878");

При компиляции IAR выдаёт:

Warning[w6]: Type conflict for external/entry "sprintf", in module main against external/entry in module ?sprintf; types have different type attributes

Подскажите пожалуйста, что я делаю не правильно.
Сергей Борщ
QUOTE (Nikkolaj @ Nov 16 2010, 08:19) *
Warning[w6]: Type conflict for external/entry "sprintf", in module main against external/entry in module ?sprintf; types have different type attributes
Забыли #include <stdio.h> Перед этим при компиляции он должен был ругаться что function declared implicitly.
Nikkolaj
QUOTE (Сергей Борщ @ Nov 16 2010, 11:55) *
Забыли #include <stdio.h> Перед этим при компиляции он должен был ругаться что function declared implicitly.

Спасибо за ответ.
Но, #include <stdio.h> был подключен.
Причина в чём то другом, а в чём - не знаю.
На всякий случай подключил библиотеку FullDLIB, опция Lardge.
Увеличил CSTACK, и RSTACK. Но результат такой же.
Подскажите пожалуйста, что не так.
IgorKossak
QUOTE (Nikkolaj @ Nov 16 2010, 08:19) *
Warning[w6]: Type conflict for external/entry "sprintf", in module main against external/entry in module ?sprintf; types have different type attributes

Очевидно, что атрибуты типов данных разные. sprintf ожидает указатель на данные, размещённые в ОЗУ, а ему скорее всего передаётся указатель на flash если в настройках проекта установлена опция держать строки во flash. Читайте тему с самого начала.
Сергей Борщ
QUOTE (IgorKossak @ Nov 16 2010, 11:45) *
Очевидно, что атрибуты типов данных разные. sprintf ожидает указатель на данные, размещённые в ОЗУ, а ему скорее всего передаётся указатель на flash если в настройках проекта установлена опция держать строки во flash. Читайте тему с самого начала.
Тогда бы компилятор ругался на несоответствие параметров. А это ругань линкера на то, что при компиляции был указан один тип параметров, а функция в библиотеке была скомпилирована с другими типами.
Nikkolaj
Спасибо за ответы.

В настройках проэкта установлены 2 галочки:
1. Place string literals constants in initialized RAM.
2. Place aggregate initializers in flash memory.

Спасибо за ответы.

Сергей, Вы правы, ругается действительно линкер.

Может эта информация что нибудь подскажет.
Когда первую галочку снял (1. Place string literals constants in initialized RAM.),
то ликер выдал Error:
Fatal Error[e72]: Segment NEAR_C must be defined in a segment definition option (-Z, -b or -P)
Error while running Linker


Да, галочки находятся в Project \ Options \ C/C++ Compiler \ Code
Правильно ?
Сергей Борщ
QUOTE (Nikkolaj @ Nov 16 2010, 12:37) *
Может эта информация что нибудь подскажет.
Когда первую галочку снял (1. Place string literals constants in initialized RAM.),
то ликер выдал Error:
Fatal Error[e72]: Segment NEAR_C must be defined in a segment definition option (-Z, -b or -P)
Error while running Linker
А вы используете свой скрипт линкера или штатный? Давно с ИАРом не работал, подзабыл кое-что. Помню, что у меня эта галочка была недоступна.
IgorKossak
QUOTE (Nikkolaj @ Nov 16 2010, 12:37) *
Fatal Error[e72]: Segment NEAR_C must be defined in a segment definition option (-Z, -b or -P)

Модель памяти какая в настройках задана?
Если tiny, то сегмента NEAR_C в ней не будет.
Nikkolaj
Спасибо за ответы.

Модель памяти Small.
Скрипт линкера штатный.
Версия IAR 5.50.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.