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

 
 
 
Reply to this topicStart new topic
> Как приручить scanf ?, Пересброс мк
alux
сообщение Jul 26 2007, 07:57
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Необходимо инициализировать время в 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" ?
Прикрепленные файлы
Прикрепленный файл  3482Fig01.zip ( 6.5 килобайт ) Кол-во скачиваний: 56
 
Go to the top of the page
 
+Quote Post
spf
сообщение Jul 26 2007, 08:43
Сообщение #2


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Лучше делать через явный буфер и sscanf.


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
alux
сообщение Jul 26 2007, 11:59
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(spf @ Jul 26 2007, 11:43) *
Лучше делать через явный буфер и sscanf.

Расскажите, пожалуйста, подробней, как осуществить форматированный ввод через заполнение буфера? А что, на счет остальных вопросов?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 26 2007, 15:18
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Про scanf не знаю, никогда не использовал, а printf и sprintf в IAR требуют иногда до 1,5кБ стековой памяти. Причем ошибки переполнения стека компилятор не выдает. Поэтому на мелких контроллерах применять их не имеет смысла.
Go to the top of the page
 
+Quote Post
alux
сообщение Jul 26 2007, 15:29
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



to rezident Вы наверно не внимательно читали мой вопрос. Я использую printf_P. С этим проблем нет. Проблема с scanf_P. Как верно подметил spf , можно сделать через sscanf. Вопрос только как? И что за модификатор такой "%bx" ?
Go to the top of the page
 
+Quote Post
spf
сообщение Jul 26 2007, 16:30
Сообщение #6


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(alux @ Jul 26 2007, 21:29) *
Как верно подметил spf , можно сделать через sscanf. Вопрос только как? И что за модификатор такой "%bx" ?

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

"%bx" опечатка или расширение компилятора.


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 26 2007, 17:09
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Вероятно, %bx означает аргумент типа char, шестнадцатеричное число (очевидно, год закодирован в байте с использованием формата BCD). Такие вещи пишут в руководствах на вашу среду программирования, так что и их будет почитать полезно.
Кстати, если всё, что нужно, - это преобразовать строку в число, то atoi() - более легковесная альтернатива sscanf().
Go to the top of the page
 
+Quote Post
exSSerge
сообщение Jul 26 2007, 17:39
Сообщение #8


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

Группа: Новичок
Сообщений: 136
Регистрация: 18-08-06
Из: Novosibirsk
Пользователь №: 19 655



На мелких контроллерах обычно не удаётся с пользой применить ни 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.

Сообщение отредактировал exSSerge - Jul 26 2007, 17:43
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 07:29
Рейтинг@Mail.ru


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