Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как приручить scanf ?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
alux
Необходимо инициализировать время в DS1388 (часы реального времени). В прилагаемом апноте это реализовано при помощи printf/scanf:
Код
printf("\nEnter the year (0-99): ");
scanf("%bx", &yr);
.......

Чтобы не забивать ОЗУ применил --string_literals_in_flash и добавил суффиксы _P в функции printf/scanf.
С printf_P все работает , а вот при попытке вставить scanf_P происходит переполнение стека. Увеличение CSTACK, RSTACK не спасает положения. Думаю что scanf("%bx", &yr); создает копию строки в ОЗУ. Или я ошибаюсь? Переменная yr - глобальная. Странное и то, что отдельно ds1388.c с функциями scanf_P при компиляции показывает:
Цитата
1 356 bytes of CODE memory (+ 6 bytes shared)
8 bytes of DATA memory

Т.е. ОЗУ не занято. Слышал, что вместо scanf можно использовать frmrd.c с необходимыми параметрами.
Если подключить к проекту frmrd.c , как компилятор разберется откуда использовать функцию scanf ?
И напоследок пару вопросов по сути не относящихся:
1) Что за модификатор формата "%bx" ?
2) Откуда берется переменная RI в функции disp_clk_regs ?
Апнот для ds1388 прилагаю.
Спасибо.
P.S. Может "%bx" - это банальная очепятка и должно быть "%dx" ?
spf
Лучше делать через явный буфер и sscanf.
alux
Цитата(spf @ Jul 26 2007, 11:43) *
Лучше делать через явный буфер и sscanf.

Расскажите, пожалуйста, подробней, как осуществить форматированный ввод через заполнение буфера? А что, на счет остальных вопросов?
rezident
Про scanf не знаю, никогда не использовал, а printf и sprintf в IAR требуют иногда до 1,5кБ стековой памяти. Причем ошибки переполнения стека компилятор не выдает. Поэтому на мелких контроллерах применять их не имеет смысла.
alux
to rezident Вы наверно не внимательно читали мой вопрос. Я использую printf_P. С этим проблем нет. Проблема с scanf_P. Как верно подметил spf , можно сделать через sscanf. Вопрос только как? И что за модификатор такой "%bx" ?
spf
Цитата(alux @ Jul 26 2007, 21:29) *
Как верно подметил spf , можно сделать через sscanf. Вопрос только как? И что за модификатор такой "%bx" ?

Руками smile.gif
То, что надо обработать считывается в буфер(стороку), потом указатель на это буфер передается первым параметром sscanf'у.

"%bx" опечатка или расширение компилятора.
scifi
Вероятно, %bx означает аргумент типа char, шестнадцатеричное число (очевидно, год закодирован в байте с использованием формата BCD). Такие вещи пишут в руководствах на вашу среду программирования, так что и их будет почитать полезно.
Кстати, если всё, что нужно, - это преобразовать строку в число, то atoi() - более легковесная альтернатива sscanf().
exSSerge
На мелких контроллерах обычно не удаётся с пользой применить ни scanf() ни sscanf(). Да и от printf() толку мало - уж очень прожорлива насчёт стека.
В Вашем случае лучше вводить строку, потом скормить её функции int atoi(const char *nptr) или long atol(const char *nptr) - по вкусу.
Для разбора строк более чем с одним параметром хороша
long int strtol(const char *nptr, char **endptr, int base)
поскольку возвращает (через endptr) указатель на остаток строки. К тому-же strtol() сама разбирается с десятичным, шестнадцатиричным и восьмеричным представлением чисел.

В doc\clib.pdf описание очень уж краткие, зато достаточно подробное описание есть в doc\HelpDLIB.chm.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.