alux 0 26 июля, 2007 Опубликовано 26 июля, 2007 · Жалоба Необходимо инициализировать время в 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spf 0 26 июля, 2007 Опубликовано 26 июля, 2007 · Жалоба Лучше делать через явный буфер и sscanf. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 26 июля, 2007 Опубликовано 26 июля, 2007 · Жалоба Лучше делать через явный буфер и sscanf. Расскажите, пожалуйста, подробней, как осуществить форматированный ввод через заполнение буфера? А что, на счет остальных вопросов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 26 июля, 2007 Опубликовано 26 июля, 2007 · Жалоба Про scanf не знаю, никогда не использовал, а printf и sprintf в IAR требуют иногда до 1,5кБ стековой памяти. Причем ошибки переполнения стека компилятор не выдает. Поэтому на мелких контроллерах применять их не имеет смысла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 26 июля, 2007 Опубликовано 26 июля, 2007 · Жалоба to rezident Вы наверно не внимательно читали мой вопрос. Я использую printf_P. С этим проблем нет. Проблема с scanf_P. Как верно подметил spf , можно сделать через sscanf. Вопрос только как? И что за модификатор такой "%bx" ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spf 0 26 июля, 2007 Опубликовано 26 июля, 2007 · Жалоба Как верно подметил spf , можно сделать через sscanf. Вопрос только как? И что за модификатор такой "%bx" ? Руками :) То, что надо обработать считывается в буфер(стороку), потом указатель на это буфер передается первым параметром sscanf'у. "%bx" опечатка или расширение компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 26 июля, 2007 Опубликовано 26 июля, 2007 · Жалоба Вероятно, %bx означает аргумент типа char, шестнадцатеричное число (очевидно, год закодирован в байте с использованием формата BCD). Такие вещи пишут в руководствах на вашу среду программирования, так что и их будет почитать полезно. Кстати, если всё, что нужно, - это преобразовать строку в число, то atoi() - более легковесная альтернатива sscanf(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
exSSerge 0 26 июля, 2007 Опубликовано 26 июля, 2007 (изменено) · Жалоба На мелких контроллерах обычно не удаётся с пользой применить ни 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. Изменено 26 июля, 2007 пользователем exSSerge Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться