Перейти к содержанию
    

Как приручить scanf ?

Необходимо инициализировать время в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Расскажите, пожалуйста, подробней, как осуществить форматированный ввод через заполнение буфера? А что, на счет остальных вопросов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про scanf не знаю, никогда не использовал, а printf и sprintf в IAR требуют иногда до 1,5кБ стековой памяти. Причем ошибки переполнения стека компилятор не выдает. Поэтому на мелких контроллерах применять их не имеет смысла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

to rezident Вы наверно не внимательно читали мой вопрос. Я использую printf_P. С этим проблем нет. Проблема с scanf_P. Как верно подметил spf , можно сделать через sscanf. Вопрос только как? И что за модификатор такой "%bx" ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как верно подметил spf , можно сделать через sscanf. Вопрос только как? И что за модификатор такой "%bx" ?

Руками :)

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вероятно, %bx означает аргумент типа char, шестнадцатеричное число (очевидно, год закодирован в байте с использованием формата BCD). Такие вещи пишут в руководствах на вашу среду программирования, так что и их будет почитать полезно.

Кстати, если всё, что нужно, - это преобразовать строку в число, то atoi() - более легковесная альтернатива sscanf().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...