Книга по работе с WinAVR и AVR Studio / AVR_11-2010
.pdfСПРАВОЧНЫЙ МАТЕРИАЛ
|
|
Роман Абраш |
Книга по работе |
|
|
|
|||
|
|
|
|
|
|
|
|
||
|
|
г. Новочеркасск |
с WinAVR и AVR Studio |
||||||
|
|
E-mail: arv@radioliga.com |
|||||||
|
|
|
|
символы перевода строки и возврата карет- |
|
Имеется возможность связать с пото- |
|||
|
|
Продолжение. |
|
|
|||||
|
|
|
ки следует вставлять принудительно. |
ком дополнительные пользовательские дан- |
|||||
|
|
Начало в №1-10/2010 |
|
||||||
|
|
|
|
Первое обращение к fdevopen() для чте- |
ные при помощи fdev_set_udata(), которые |
||||
|
|
|
|
ния приведет к фактической связи с пото- |
затем могут быть извлечены в реализаци- |
||||
|
stdio.h – Стандартный |
ком stdin. Обращение же к fdevopen() на |
ях функций ввода-вывода символа при по- |
||||||
|
ввод-вывод |
запись приведет к тому, что результирую- |
мощи fdev_get_udata() и обработаны, как |
||||||
|
В силу направленности avr-libc на мик- |
щий поток будет связан с stdin и stderr, т.е. |
требуется. Это, например, позволит реали- |
||||||
|
роконтроллеры, т.е. на среду без операци- |
фактически оба этих потока будут на самом |
зовать одну функцию ввода-вывода, рабо- |
||||||
|
онной системы и любых стандартных |
деле одним (stdin и stderr в данном контек- |
тающую с различными UART. В этом слу- |
||||||
|
средств ввода-вывода, имеются большие |
сте – просто синонимы). Соответственно |
чае функции ввода-вывода сохраняют кон- |
||||||
|
отличия в реализации функций модуля по |
закрытие функцией fclose() любого из этих |
текст различных UART в области данных |
||||||
|
сравнению с требованиями стандарта. Ре- |
потоков фактически закроет и его синоним. |
пользователя между своими вызовами. |
||||||
|
ализован только необходимый минимум |
Данный подход позволил существенно оп- |
|
По умолчанию fdevopen() подразумева- |
|||||
|
функций. Имеется ряд условностей и огра- |
тимизировать результирующий код: во-пер- |
ет использование malloc(), что часто очень |
||||||
|
ничений, связанных с аппаратной и архи- |
вых, за счет исключения дублирования |
нежелательно в ограниченных ресурсах |
||||||
|
тектурной особенностью среды. |
структур данных потоков; во-вторых, нет |
микроконтроллера. Поэтому в библиотеке |
||||||
|
Для максимальной компактности гене- |
необходимости в функции fprintf(); в-треть- |
реализован опциональный вариант |
||||||
|
рируемого кода многие возможности усе- |
их, можно отказаться от передачи через |
fdevopen() без использования malloc(). Мак- |
||||||
|
чены или исключены полностью, например, |
стек лишнего параметра (указателя на ис- |
рос fdev_setup_stream() позволяет настро- |
||||||
|
касающиеся форматированного ввода-вы- |
пользуемый поток). В сущности, это оправ- |
ить стандартные функции ввода-вывода для |
||||||
|
вода функциями printf() и scanf(). Часть воз- |
дано особенностями архитектуры микро- |
работы с подготовленным заранее буфером |
||||||
|
можностей этих функций может быть вклю- |
контроллера. |
файла. Пример см. на врезке. |
||||||
|
чена или выключена путем задания опре- |
|
|
|
|
|
|
||
|
деленных опций (параметров) компилято- |
|
Врезка. Пример: |
||||||
|
ра, чтобы получать код минимального раз- |
|
|||||||
|
|
#include <stdio.h> // подключение модуля ввода-вывода |
|||||||
|
мера с необходимым минимумом функцио- |
|
|||||||
|
нальности. |
|
static int uart_putchar(char c, FILE *stream); |
// определяемая пользователем |
|||||
|
Стандартные потоки stdin, stdout и stderr |
|
|
|
// функция вывода символа |
||||
|
поддерживаются «виртуально», т.к. нет ни- |
|
// подготовка при помощи макроса структуры «файла» для ввода-вывода |
||||||
|
какой аппаратной их поддержки, нет и ни- |
|
|||||||
|
|
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); |
|||||||
|
какой инициализации этих потоков; т.к. нет |
|
// реализация функции вывода символа |
|
|
|
|
||
|
реально существующих файлов вообще – |
|
|
|
|
|
|||
|
нет и fopen() и т.п. Имеется функция |
|
static int uart_putchar(char c, FILE *stream){ |
|
|
|
|||
|
|
// принудительная вставка символа «возврат каретки» после символа |
|||||||
|
fdevopen(), которая позволяет связать стан- |
|
// «перевод строки» для нормального отображения в терминальной программе |
||||||
|
дартные функции ввода-вывода с реализу- |
|
if (c == ’\n’) |
|
|
|
|
||
|
емыми программистом средствами поддер- |
|
uart_putchar(’\r’, stream); |
|
|
|
|
||
|
|
loop_until_bit_is_set(UCSRA, UDRE); // ожидание готовности UART |
|||||||
|
жки конкретной аппаратуры. В качестве |
|
|||||||
|
альтернативы можно использовать макрос |
|
UDR = c; // вывод символа |
|
|
|
|
||
|
fdev_setup_stream(), при помощи которого |
|
|
|
|
|
|||
|
|
return 0; |
|
|
|
|
|||
|
производится инициализация средств вво- |
|
|
|
|
|
|||
|
да-вывода. В любом случае программист |
|
} |
|
|
|
|
||
|
самостоятельно должен реализовать фун- |
|
// основная функция |
|
|
|
|
||
|
кцию ввода, вывода или обе только для од- |
|
int main(void){ |
|
|
|
|
||
|
ного символа (нет различий между символь- |
|
init_uart(); // инициализация UART |
|
|
|
|
||
|
ным и двоичным потоками), которая затем |
|
stdout = &mystdout; // связывание потока stdout с подготовленным «файлом» |
||||||
|
|
printf(«Hello, world!\n»); // использование стандартной функции вывода |
|||||||
|
и используется для работы со стандартны- |
|
return 0; |
|
|
|
|
||
|
ми потоками. Более подробно об этом бу- |
|
} |
|
|
|
|
||
|
дет сказано далее, при рассмотрении соот- |
|
|
|
|
|
|
||
|
ветствующих функций. |
|
Приведенный пример выводит в стан- |
|
Определения модуля |
||||
|
|
|
|||||||
|
Так же с целью получения наиболее ком- |
дартный поток, связанный с аппаратно-ре- |
|
В модуле определены следующие кон- |
|||||
|
пактного кода, имеется ряд функций, спо- |
ализованным UART микроконтроллера, тек- |
станты и макросы: |
||||||
|
собных работать сразу со строковыми кон- |
стовое сообщение. |
|
|
|
|
|||
|
стантами, определенными в сегменте кода |
|
В примере применена инициализа- |
|
FILE |
||||
|
программы. |
ция потока mystdout макросом |
|
FILE – определение структуры «файл», |
|||||
|
Реализация библиотеки, как было ска- |
FDEV_SETUP_STREAM() вместо макроса |
т.е. структуры, передаваемой в различные |
||||||
|
зано ранее, не делает различий между тек- |
fdev_setup_stream(), поэтому вся инициали- |
функции ввода-вывода в качестве иденти- |
||||||
|
стовыми и двоичными операциями ввода- |
зация потока происходит в момент инициа- |
фикатора файла. |
||||||
|
вывода, поэтому следует быть осторожны- |
лизации переменных С-программы, т.е. со- |
|
|
|
|
|||
|
ми при использовании автоматических пре- |
вершенно прозрачно для пользователя. |
|
stdin |
|||||
|
образований, реализуемых функциями вво- |
|
Если инициализированный таким обра- |
|
stdin – поток, используемый упрощен- |
||||
|
да-вывода, например, автоматической |
зом поток более не нужен, он может быть |
ными (т.е. не требующими параметра |
||||||
|
вставки символа перевода строки. Этот |
разрушен макросом fdev_close(). Не требу- |
stream) функциями ввода. |
||||||
|
символ будет нарушать нормальную двоич- |
ется использование fclose(), т.к. это потре- |
|
|
|
|
|||
|
ную последовательность, поэтому для дво- |
бует от компоновщика подключения моду- |
|
stdout |
|||||
|
ичных потоков надо исключить любую «ав- |
ля stdlib.h – Стандартные возможности для |
|
stdout – поток, используемый упрощен- |
|||||
|
томатику» преобразований. Если же после |
«освобождения» памяти, что в данном слу- |
ными (т.е. не требующими параметра |
||||||
|
этого потребуется выводить текст в потоки, |
чае совершенно лишнее. |
stream) функциями вывода. |
||||||
5 6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Радиолюбитель – 11/2010 |
|
|
|
|
|
|
|
|
|
|
СПРАВОЧНЫЙ МАТЕРИАЛ
stderr |
ничего, но введен для совместимости с бу- |
Ширина – это десятичное число, кото- |
stderr – поток, используемый для вы- |
дущими реализациями. |
рое определяет минимальное количество |
вода сообщений об ошибках. По умолчанию |
|
символов, требуемое для представления |
соответствует stdout. Если необходимо на- |
putc() |
числа. Если число может быть представле- |
править сообщения об ошибках в другой, |
putc(c, stream) – макрос «упрощенно- |
но меньшим количеством символов – оно |
отличный от stdout, поток, необходимо при- |
го» вывода в поток, полностью аналогич- |
дополняется слева или справа (в зависимо- |
своить ему другое значение, возвращен- |
ный (и являющийся синонимом) fputc(). |
сти от префикса) пробелами (или нулями – |
ное fdevopen(), не закрывая имеющееся |
|
см. префикс 0). Если для представления |
(т.к. иначе это привело бы к закрытию |
putchar() |
числа необходимо больше символов, то зна- |
stdout). |
putchar(c) – макрос вывода символа в |
чение ширины игнорируется. Т.е. если ука- |
|
поток stdout. |
зана ширина 3 и задан префикс 0, то число |
EOF |
|
1 будет выведено как “001”. |
EOF – константа «конец файла». Это |
getc() |
Точность – это десятичное число, оп- |
значение возвращается функциями ввода |
getc(stream) – макрос «упрощенного» |
ределяющее символов в представлении |
в качестве индикатора ошибки. Так как в |
ввода из поток, полностью аналогичный (и |
для достижения заданной точности. Для |
текущей реализации для AVR не существу- |
являющийся синонимом) fgetc(). |
строковых аргументов определяет макси- |
ет реального понятия «файл», иное исполь- |
|
мальную длину строки, для числовых – ми- |
зование этой константы – бессмысленно. |
getchar() |
нимальное кол-во значащих цифр. Пару |
|
getchar() – макрос, возвращающий сим- |
ширина-точность для чисел с плавающей |
fdev_set_udata() |
вол, считанный из потока stdin. |
точкой можно рассматривать как пару |
fdev_set_udata(stream, u) – макрос |
|
«общее кол-во знаков»-«кол-во знаков |
вставки пользовательских данных (указа- |
Спецификация строки формата |
после точки». |
тель) u во внутреннюю структуру файла |
для функций форматированного |
Суффикс – это символ h или l. h – иг- |
stream. Использование этих данных воз- |
вывода |
норируется, а l означает, что аргумент име- |
можно в функциях get() и put(). |
Строка формата ввода-вывода состо- |
ет тип long, а не int. |
|
ит из последовательностей символов двух |
Тип – это символ, который определяет |
fdev_get_udata() |
типов: обычных, которые копируются в по- |
тип очередного элемента в списке выводи- |
fdev_get_udata(stream) – макрос воз- |
ток непосредственно, и последовательнос- |
мых аргументов. Определены следующие |
врата пользовательских данных (указате- |
тей символов-директив (или управляющих |
типы (должен указываться любой из пере- |
ля) из внутренней структуры файла stream. |
символов), которые в процессе обработки |
численных): |
|
заменяются другими в соответствии с оп- |
diouxX – целое число. Аргумент рас- |
fdev_setup_stream() |
ределенными правилами. Формат управля- |
сматривается, как целое число, и выводит- |
fdev_setup_stream(stream, put, get, |
ющей последовательности следующий (в |
ся в десятичном со знаком(di), десятичном |
rwflag) – макрос, настраивающий буфер для |
[квадратных скобках] указаны элементы, |
без знака (u), восьмеричном (о) или шест- |
использования стандартными функциями |
которые могут отсутствовать, жирным вы- |
надцатеричном (xX) формате. Тип Х озна- |
ввода-вывода. |
делены элементы-модификаторы, прочие |
чает, что шестнадцатеричные цифры-бук- |
Аргумент stream типа FILE должен быть |
символы – обязательные): |
вы должны выводиться в верхнем регистре |
заранее подготовлен пользователем, в от- |
%[префикс][ширина][.точность][суф- |
(т.е. число 0x0a1b2c3d будет выведено как |
личие от аналогичной структуры, выделяе- |
фикс]тип |
“A1B2C3D”). Если задана точность, то пред- |
мой fdevopen() динамически. |
Префикс определяет общие характе- |
ставление числа дополняется слева нуля- |
Аргументы put и get аналогичны пере- |
ристики преобразования формата. Список |
ми для ее достижения. |
даваемым в fdevopen(). |
префиксов (может быть одновременно не- |
p – указатель. Аргумент трактуется, как |
Аргумент rwflag – это флаги-признаки |
сколько): |
void * и выводится, как обычное десятич- |
режима открытия потока. Может принимать |
# – использовать альтернативный фор- |
ное число в шестнадцатеричном формате, |
одно из трех значений: |
мат. Для типов c, d, i, и s игнорируется. Для |
т.е. последовательность %р полностью ана- |
· _FDEV_SETUP_READ – для чтения |
типа o означает, что точность представле- |
логична управляющей последовательности |
· _FDEV_SETUP_WRITE – для записи |
ния числа должна быть увеличена так, что- |
%#x |
· _FDEV_SETUP_RW – записи и чтения |
бы первый выводимый символ был нулем. |
с – символ. Аргумент трактуется как |
|
Для типов x или X означает, что выводимое |
unsigned char и выводится соответствую- |
_FDEV_ERR |
число будет предваряться символами “0x” |
щий символ. |
_FDEV_ERR – константа ошибки чтения |
или “0X” соответственно. |
s – строка. Аргумент трактуется как ука- |
потока. Используется в функции чтения |
0 – выравнивание нулями. Означает, что |
затель на строку. В поток выводятся все |
fdevopen(). |
если задана минимальная ширина пред- |
символы вплоть до завершающего строку |
|
ставления числа, то все незначащие левые |
символа NULL (который не выводится). |
_FDEV_EOF |
символы будут заменены нулями (вместо |
Если задана точность – выводится не бо- |
_FDEV_EOF – константа ошибки при |
пробелов). Для типов d, i, o, u, i, x, и X дан- |
лее указанного количества символов, при |
попытке чтения за концом потока. Исполь- |
ный модификатор игнорируется. |
этом наличие символа NULL в строке не |
зуется в функции чтения fdevopen(). |
- – флаг отрицательного значения. Оз- |
требуется. |
|
начает, что выводимое значение выравни- |
S – строка в сегменте кода. Аргумент |
FDEV_SETUP_STREAM() |
вается влево в пределах заданной шири- |
трактуется как указатель на строку, разме- |
FDEV_SETUP_STREAM(put, get, |
ны, дополняясь справа пробелами. Если |
щенную в сегменте кода (см. тип s), в отли- |
rwflag) – макрос, аналогичный |
применяются оба модификатора 0 и -, пос- |
чие от стандартного размещения в ОЗУ. |
fdev_setup_stream(), только инициализиру- |
ледний имеет приоритет. |
% – символ %. Никаких преобразова- |
ющий переменную потока путем присвое- |
“ “ (пробел) – означает, что положитель- |
ний не требуется, очередной аргумент так |
ния ей «возвращаемого» значения макро- |
ное число должно предваряться слева про- |
же не требуется – это просто вывод симво- |
са. Параметры макроса аналогичны пара- |
белом (т.е. резервирует место под возмож- |
ла % в поток (т.е. управляющая последова- |
метрам fdev_setup_stream(). |
ный символ минуса для отрицательных чи- |
тельность %% предназначена для вывода |
|
сел). Применяется для типов d или i. |
в поток одного символа %). |
fdev_close() |
+ – означает, что положительные числа |
eE – экспоненциальная форма записи |
fdev_close() – макрос, освобождающий |
всегда должны предваряться знаком плюс. |
числа с плавающей точкой. Аргумент типа |
любые ресурсы, связанные с открытым по- |
Если использованы оба модификатора + и |
double при необходимости округляется и |
током. В текущей реализации он не делает |
пробел, первый имеет приоритет. |
выводится в формате [-]d.ddde±dd, где d – |
|
|
|
5 7 |
Радиолюбитель – 11/2010 |
|
|
|
|
|
|
СПРАВОЧНЫЙ МАТЕРИАЛ
цифра. Число цифр после точки определя- |
быть проигнорирован, т.е. не должен поме- |
обработанных к настоящему моменту сим- |
ется точностью (если не задана – принима- |
щаться в элемент списка аргументов |
волов потока. Никаких преобразований не |
ется равной 6), если точность равна 0, то |
h – означает, что аргумент в списке |
выполняется. Это действие может быть про- |
дробная часть не выводится и десятичная |
имеет тип short int (а не int) |
пущено при использовании префикса *. |
точка так же не выводится. Если тип Е, то в |
hh – означает, что аргумент имеет тип |
[множество] – означает, что должна |
экспоненциальной форме используется этот |
char (а не int) |
быть введена последовательность, состоя- |
символ (взамен е). Показатель степени – |
l – означает, что аргумент имеет тип long |
щая из символов, указанных между скоб- |
всегда 2 знака. |
int (а не int) для целочисленного ввода или |
ками []. Аргумент должен указывать на бу- |
fF – простая форма записи числа с пла- |
что аргумент имеет тип double для ввода |
фер достаточного объема. Чтобы вместить |
вающей точкой. Аргумент типа double при |
чисел с плавающей точкой. |
все символы, включая автоматически до- |
необходимости округляется и выводится в |
Размер – это десятичное число от 1 до |
бавляемый NULL в конце. Множество фор- |
формате [-]ddd.ddd, где d – цифра. Число |
255, которое показывает, какое минималь- |
мируется путем простого перечисления сим- |
цифр после точки определяется точностью |
ное количество символов потока должно |
волов в виде строки, однако, есть особен- |
(если не задана – принимается равной 6), |
быть считано для интерпретации соответ- |
ности: |
если точность равна 0, то дробная часть |
ствующего значения. |
1. Если первый символ за открывающей |
не выводится и десятичная точка так же |
Тип – это один из следующих символов: |
скобкой «^» (птичка), то остальные симво- |
не выводится. Если выводится точка, то ми- |
% – означает, что должен быть введен |
лы образуют множество символов, исклю- |
нимум одна цифра всегда выводится пе- |
символ процента, преобразование не осу- |
чаемых из числа вводимых. |
ред ней. |
ществляется |
2. В множество не включается символ |
gG – версия fF или eE (соответственно |
d – означает, что должно быть введено |
закрывающей квадратной скобки. Чтобы |
с учетом регистра) с некоторыми особен- |
целое (возможно, со знаком) число в деся- |
все же добавить его в множество, следует |
ностями. Число цифр после точки опреде- |
тичном представлении, т.е. очередной ар- |
поместить его сразу после открывающей |
ляется точностью (если не задана – прини- |
гумент в списке имеет тип int |
скобкой или после «птички». В любом ином |
мается равной 6), если точность равна 0, то |
i – означает, что должно быть введено |
случае эта скобка обозначит конец мно- |
она принимается равной 1. выбор между |
целое (возможно со знаком) число в деся- |
жества. |
вариантами fF и eE осуществляется авто- |
тичном, восьмеричном или шестнадцате- |
3. Чтобы добавить в множество набор |
матически: форма fF используется, если |
ричном формате, аргумент имеет тип int. |
подряд идущих символов, следует указать |
число не более 1000000, или показатель сте- |
Формат числа определяется по первым сим- |
первый символ, затем через дефис – пос- |
пени 10 для числа меньше или равен зна- |
волам: если число начинается с 0x или 0X - |
ледний. |
чению точности. |
принимается шестнадцатеричный формат, |
Примеры использования множеств: |
Примечания. |
если число начинается с 0 (????) – восьме- |
[[0-9] – ввод последовательности, состо- |
1. Ни при каких условиях не происходит |
ричный, иначе принимается десятичный |
ящей из символов «0», «1», «2», «3», «4», |
усечения точности результата для вывода |
формат. |
«5», «6», «7», «8», «9» «[« |
чисел: если заданная ширина недостаточ- |
o – означает, что вводится восьмерич- |
[^0-9] – ввод последовательности из |
на для представления числа – она игнори- |
ное целое число (аргумент имеет тип |
любых символов, кроме цифр |
руется и выводится необходимое число |
unsigned int) |
[][] – ввод последовательности, состоя- |
знаков. |
u – означает, что вводится беззнаковое |
щей из символов квадратных скобок |
2. Для ширины и точности имеется ог- |
целое число, аргумент имеет тип unsigned |
|
раничение – они не могут быть более 255. |
int |
Функции модуля |
3. Если использована не полная вер- |
x – означает, что вводится число в шес- |
|
сия функции vprintf() при сборке проекта, |
тнадцатеричном представлении, аргумент |
fdevopen() |
а в списке аргументов присутствует чис- |
имеет тип unsigned int |
Определение: |
ло типа double, в потоке вывода на этом |
e или E, или f, или F, или g, или G – оз- |
FILE * fdevopen (int(*put)(char, FILE *), |
месте будет символ «?», т.е. краха не про- |
начает, что вводится число в формате с |
int(*get)(FILE *)) |
изойдет. |
плавающей точкой, аргумент имеет тип float |
Параметры: |
4. Так как суффикс h игнорируется (по |
s – означает, что вводится последова- |
int(*put)(char, FILE *) – указатель на фун- |
стандарту он предназначен для принуди- |
тельность символов, не содержащая раз- |
кцию вывода символа в поток (если имеет- |
тельного приведения к типу char), эффек- |
рывов, аргумент представляет собой ука- |
ся намерение использовать создаваемый |
тивность кода повысится, если никогда его |
затель на буфер достаточной длины, что- |
поток для вывода). Эта функция имеет два |
не использовать в строке формата. |
бы вместить всю последовательность вме- |
параметра: выводимый символ и указатель |
5. Суффикс l приведет к прекращению |
сте с завершающим символом NULL. Ввод |
на открытый поток. Эта функция должна |
вывода в поток. Т.к. текущая реализация |
строки прекращается, как только встретит- |
возвращать 0 в случае удачного вывода, и |
не поддерживает тип long long. |
ся любой символ разрыва строки, например, |
не ноль в случае ошибки. |
6. Переменная ширина или точность не |
пробел, табуляция и т.п. |
int(*get)(FILE *) – указатель на функцию |
реализованы, поэтому символ * в поле ши- |
с – означает, что должна быть введена |
для ввода символа (если имеется намере- |
рины или точности приведет к прекраще- |
последовательность символов, количество |
ние использовать поток для ввода). Эта |
нию вывода в поток. |
которых определено полем размер. Аргу- |
функция имеет один параметр – указатель |
|
мент, как и для s, должен указывать на бу- |
на открытый поток, и должна возвратить |
Спецификация строки формата |
фер достаточной длины, однако заверша- |
введенный символ в случае успешного за- |
для функций форматированного |
ющий NULL не вводится. Вводятся все сим- |
вершения. В случае попытки считать «за |
ввода |
волы, включая разделительные. Чтобы про- |
концом данных» функция должна вернуть |
Строка формата для функций ввода |
пустить начальные пробелы используйте |
_FDEV_EOF, в случае иных ошибок функ- |
имеет строение, аналогичное строке фор- |
принудительно вставленный в строку фор- |
ция должна возвращать _FDEV_ERR. |
мата вывода (см. Спецификация строки |
мата пробел перед управляющей последо- |
Возвращаемое значение: в случае |
формата для функций форматированно- |
вательностью. |
успеха – указатель на структуру открытого |
го вывода), но состоит из следующих час- |
p – означает, что вводится значение |
потока в динамической памяти, иначе NULL. |
тей: |
указателя. Ожидается, что последователь- |
Описание: Эта функция заменяет |
%[префикс][размер] [тип] |
ность символов будет соответствовать той, |
fopen(). Она позволяет открыть поток для |
Префикс – это одна или более из чис- |
что выводится в аналогичном случае функ- |
случая, когда необходимо реализовать соб- |
ла следующих последовательностей: |
цией vfprintf(). |
ственную поддержку аппаратной части для |
* – означает, что преобразование дол- |
n – не вводится ничего, вместо этого в |
ввода-вывода. В случае успешного завер- |
жно быть выполнено, но результат должен |
аргумент (типа int) заносится количество |
шения функция возвращает указатель на |
5 8 |
Радиолюбитель – 11/2010 |
|
СПРАВОЧНЫЙ МАТЕРИАЛ
структуру FILE, которая затем может ис- |
выбираемых компоновщиком во время |
vprintf() |
||
пользоваться, как соответствующий поток |
сборки проекта: |
Определение: |
||
в других функциях. Если недостаточно ди- |
- обычная (по умолчанию) – реализует |
int vprintf (const char *fmt, va_list ap) |
||
намической памяти, или не определена ни |
все виды преобразований, кроме предназ- |
Описание: данная функция осуществ- |
||
одна из функций put и get (т.е. попытка от- |
наченных для чисел с плавающей точкой; |
ляет форматированный вывод в поток |
||
крыть поток вообще без намерения его ис- |
- усеченная – реализует только базовые |
stdout. Параметры и подробности см. в опи- |
||
пользовать) – функция завершается не- |
преобразования форматов целых чисел и |
сании vfprintf(). |
||
удачно. |
|
|
строк, кроме того, может применяться толь- |
|
Первый поток, открытый для ввода ав- |
ко префикс # (см. Спецификация строки |
sprintf() |
||
томатически ассоциируется с потоком stdin, |
формата для функций форматированного |
Определение: |
||
первый поток, открытый для вывода, авто- |
вывода); |
int sprintf (char *s, const char *fmt,...) |
||
матически ассоциируется с потоками stdout |
- полная – реализующая полную специ- |
Описание: данная функция осуществ- |
||
и stderr. |
|
|
фикацию форматов. |
ляет форматированный вывод в строку s |
Примечания: |
|
Усеченная версия выбирается следую- |
(область памяти для строки-результата дол- |
|
1. Функция использует динамическое |
щими параметрами компилятора: |
жна иметь достаточный размер!). Подроб- |
||
выделение памяти при помощи calloc() (и/ |
-Wl,-u,vfprintf -lprintf_min |
ности об остальных параметрах функции и |
||
или malloc()). |
|
|
Полная версия выбирается следующи- |
ее особенностях см. в описании vfprintf(). |
2. Для совместимости с кодом, напи- |
ми параметрами компилятора: |
|
||
санным для avr-libc версии 1.2 или более |
-Wl,-u,vfprintf -lprintf_flt -lm |
sprintf_P() |
||
ранней, |
следует |
определить |
|
Определение: |
__STDIO_FDEVOPEN_COMPAT_12 до под- |
vfprintf_P() |
int sprintf_P (char *s, const char *fmt,...) |
||
ключения модуля stdio.h. Это делается ис- |
Определение: |
Описание: данная функция осуществ- |
||
ключительно для обеспечения совместимо- |
int vfprintf_P (FILE *stream, const char *fmt, |
ляет форматированный вывод в строку s |
||
сти и упрощения миграции кода, в новых |
va_list ap) |
(область памяти для строки-результата дол- |
||
проектах не используйте это! |
|
Параметры: |
жна иметь достаточный размер!), используя |
|
|
|
|
FILE *stream – указатель на открытый |
строку формата в сегменте кода. Подроб- |
fclose() |
|
|
для вывода поток |
ности об остальных параметрах функции и |
Определение: |
|
const char *fmt – указатель на строку |
ее особенностях см. в описании vfprintf_P(). |
|
int fclose (FILE *stream) |
|
формата в сегменте кода |
|
|
Параметры: |
|
va_list ap – указатель на список выво- |
snprintf() |
|
FILE *stream – указатель на ранее от- |
димых аргументов |
Определение: |
||
крытый поток |
|
|
Возвращаемое значение: число выве- |
int snprintf (char *s, size_t n, const char |
Возвращаемое значение: всегда 0 |
денных в поток символов в случае успеш- |
*fmt,...) |
||
Описание: функция закрывает поток, |
ного завершения или EOF в противном слу- |
Описание: вариант функции sprintf() с |
||
открытый функцией fdevopen() и тем самым |
чае (это может быть, если поток не открыт |
контролем размера строки. Параметр n оп- |
||
делает невозможной любой ввод-вывод |
для вывода). |
ределяет максимальное количество симво- |
||
через него. |
|
|
Описание: это версия функции vprintf(), |
лов (включая завершающий NULL), которое |
Примечания: эта функция не долж- |
которая использует строку формата, раз- |
будет помещено в строку s. В остальном |
||
на использоваться для потоков, открытых |
мещаемую не в ОЗУ, а в сегменте кода про- |
(по параметрам и поведению) полностью |
||
с помощью fdev_setup_stream() или |
граммы. |
аналогична функции sprintf(). |
||
FDEV_SETUP_STREAM(). |
|
|
|
|
|
|
|
fputc() |
snprintf_P() |
vfprintf() |
|
|
Определение: |
Определение: |
Определение: |
|
int fputc (int c, FILE *stream) |
int snprintf_P (char *s, size_t n, const char |
|
int vfprintf (FILE *stream, const char *fmt, |
Параметры: |
*fmt,...) |
||
va_list ap) |
|
|
int c – символ для вывода |
Описание: вариант функции sprintf_P() |
Параметры: |
|
FILE *stream – открытый для вывода |
с контролем размера строки. Параметр n |
|
FILE *stream – указатель на открытый |
поток. |
определяет максимальное количество сим- |
||
для вывода поток |
|
Возвращаемое значение: в случае |
волов (включая завершающий NULL), кото- |
|
const char *fmt – указатель на строку |
успеха возвращает выведенный символ, в |
рое будет помещено в строку s. В осталь- |
||
формата |
|
|
противном случае возвращает EOF. |
ном (по параметрам и поведению) полнос- |
va_list ap – указатель на список выво- |
Описание: Функция выводит в поток |
тью аналогична функции sprintf_P(). |
||
димых аргументов |
|
символ (1 байт, хотя параметр имеет тип |
|
|
Возвращаемое значение: число выве- |
int). |
vsprintf() |
||
денных в поток символов в случае успеш- |
Примечания: |
Определение: |
||
ного завершения или EOF в противном слу- |
|
int vsprintf (char *s, const char *fmt, |
||
чае (это может быть, если поток не открыт |
printf() |
va_list ap) |
||
для вывода). |
|
|
Определение: |
Описание: аналог функции snprintf(), |
Описание: это базовая функция фор- |
int printf (const char *fmt,...) |
но со списком аргументов, передаваемых |
||
матированного файлового вывода для |
Описание: данная функция осуществ- |
переменной ap. |
||
всего семейства printf-функций. Она реа- |
ляет форматированный вывод в поток |
|
||
лизует символьный вывод в поток stream |
stderr. Параметры и подробности см. в опи- |
vsprintf_P() |
||
списка аргументов, заданного как ap в со- |
сании vfprintf(). |
Определение: |
||
ответствии с форматом, заданным стро- |
|
int vsprintf_P (char *s, const char *fmt, |
||
кой fmt (см. Спецификация строки фор- |
printf_P() |
va_list ap) |
||
мата для функций форматированного |
Определение: |
Описание: вариант vsprintf(), но для |
||
вывода). |
|
|
int printf_P (const char *fmt,...) |
строки формата в сегменте кода. |
Примечания: полная реализация всех |
Описание: данная функция осуществ- |
|
||
возможностей форматирования требует |
ляет форматированный вывод в поток |
vsnprintf() |
||
больших затрат программной памяти. С |
stderr, используя строку формата в сегмен- |
Определение: |
||
целью минимизации ресурсов существует |
те кода. Параметры и подробности см. в |
int vsnprintf (char *s, size_t n, const char |
||
3 варианта реализации функции vfprintf(), |
описании vfprintf_P(). |
*fmt, va_list ap) |
|
|
|
5 9 |
Радиолюбитель – 11/2010 |
|
|
|
|
|
|
СПРАВОЧНЫЙ МАТЕРИАЛ
Описание: вариант snprintf() с контро- |
Описание: функция выводит в поток |
указатель на строку-результат, в против- |
лем количества выводимых символов, как |
stdout строку str из сегмента кода, допол- |
ном случае возвращает NULL. |
в snprintf() и списком аргументов, переда- |
няя ее символом перевода строки. |
Описание: функция считывает из по- |
ваемых переменной ap. |
|
тока stream не более size-1 байтов, раз- |
|
fwrite() |
мещая их в строке-результате str. Считы- |
vsnprintf_P() |
Определение: |
вание символов продолжается до тех пор, |
Определение: |
size_t fwrite (const void *ptr, size_t size, |
пока не встретится символ перевода стро- |
int vsnprintf_P (char *s, size_t n, const char |
size_t nmemb, FILE *stream) |
ки (который в результат не заносится). Если |
*fmt, va_list ap) |
Параметры: |
не было ошибок, строка-результат завер- |
Описание: вариант snprintf() с контро- |
const void *ptr – указатель на первый |
шается символом NULL, а функция возвра- |
лем количества выводимых символов, как |
выводимый элемент |
щает указатель на строку-результат. В слу- |
в snprintf() и списком аргументов, переда- |
size_t size – размер выводимого эле- |
чае ошибок возвращается NULL, и в пото- |
ваемых переменной ap. Строка формата |
мента |
ке устанавливается признак ошибки, что- |
размещается в сегменте кода. |
size_t nmemb – число выводимых эле- |
бы можно было использовать функцию |
|
ментов |
ferror(). |
fprintf() |
FILE *stream – указатель на поток, от- |
|
Определение: |
крытый для записи |
gets() |
int fprintf (FILE *stream, const char *fmt,...) |
Возвращаемое значение: в случае |
Определение: |
Описание: функция осуществляет фор- |
успеха возвращает значение nmemb |
char * gets (char *str) |
матированный вывод в поток stream. См. |
Описание: функция выводит в поток |
Параметры: |
подробности об особенностях и параметрах |
stream nmemb элементов, каждый из ко- |
char *str – строка-результат |
в vfprintf(). |
торых имеет размер size байт. Указатель |
Возвращаемое значение: в случае |
|
ptr должен указывать на первый выводи- |
успешного завершения возвращает указа- |
fprintf_P() |
мый элемент. |
тель на строку-результат, в противном слу- |
Определение: |
|
чае возвращает NULL |
int fprintf_P (FILE *stream, const char |
fgetc() |
Описание: функция действует анало- |
*fmt,...) |
Определение: |
гично fgets(), только строка читается из по- |
Описание: функция осуществляет фор- |
int fgetc (FILE *stream) |
тока stdin и количество считанных байт не |
матированный вывод в поток stream, при- |
Параметры: |
контролируется. |
чем строка формата размещается в сегмен- |
FILE *stream – указатель на поток, от- |
Примечания: отсутствие контроля |
те кода. См. подробности об особенностях |
крытый для чтения |
количества вводимых символов налага- |
и параметрах в vfprintf(). |
Возвращаемое значение: введенный |
ет большую ответственность на програм- |
|
символ или EOF в случае ошибки |
миста. |
fputs() |
Описание: функция считывает символ |
|
Определение: |
(байт) из потока stream. В случае ошибки |
fread() |
int fputs (const char *str, FILE *stream) |
или попытки чтения «за концом потока» |
Определение: |
Параметры: |
возвращается значение EOF, поэтому |
size_t fread (void *ptr, size_t size, size_t |
const char *str – указатель на строку |
следует использовать функции feof() и |
nmemb, FILE *stream) |
FILE *stream – указатель на открытый |
ferror() для определения истинной причи- |
Параметры: |
для вывода поток |
ны ошибки. |
void *ptr – указатель на буфер-прием- |
Возвращаемое значение: возвраща- |
|
ник |
ет 0 в случае успешного завершения, в про- |
ungetc() |
size_t size – размер каждого элемента |
тивном случае возвращает EOF. |
Определение: |
size_t nmemb – количество элементов |
Описание: Функция выводит в поток |
int ungetc (int c, FILE *stream) |
FILE *stream – указатель на поток. От- |
stream строку str. Завершающий символ |
Параметры: |
крытый для чтения |
NULL не выводится. |
int c – символ |
Возвращаемое значение: в случае |
|
FILE *stream – указатель на поток, от- |
успешного завершения возвращает значе- |
fputs_P() |
крытый для чтения |
ние nmemb |
Определение: |
Возвращаемое значение: в случае |
Описание: функция считывает из пото- |
int fputs_P (const char *str, FILE *stream) |
успеха возвращает символ с, в противном |
ка stream nmemb элементов, каждый из |
Описание: вариант fputs() для вывода |
случае возвращает EOF. |
которых имеет размер size байт и помеща- |
строки из сегмента кода. |
Описание: функция «заталкивает» в |
ет их в буфер ptr. |
|
поток, открытый для чтения, один символ с |
Примечания: буфер должен иметь до- |
puts() |
(преобразуемый в unsigned char), застав- |
статочный объем! |
Определение: |
ляя его стать следующим, считываемым при |
|
int puts (const char *str) |
вводе. Функция возвращает этот самый |
clearerr() |
Параметры: |
символ, если не было ошибки. |
Определение: |
const char *str – указатель на строку |
Примечания: если «заталкиваемый» |
void clearerr (FILE *stream) |
Возвращаемое значение: возвраща- |
символ равен EOF, функция завершается с |
Параметры: |
ет 0 в случае успешного завершения, в про- |
ошибкой, а поток остается неизмененным. |
FILE *stream – указатель на поток |
тивном случае возвращает EOF. |
|
Возвращаемое значение: нет |
Описание: функция выводит в поток |
fgets() |
Описание: функция сбрасывает при- |
stdout строку str, дополняя ее символом |
Определение: |
знаки любых ошибок потока stream. |
перевода строки. |
char * fgets (char *str, int size, FILE *stream) |
|
|
Параметры: |
feof() |
puts_P() |
char *str – указатель на строку-ре- |
Определение: |
Определение: |
зультат |
int feof (FILE *stream) |
int puts_P (const char *str) |
int size – количество вводимых байт |
Параметры: |
const char *str – указатель на строку |
FILE *stream – указатель на поток, от- |
FILE *stream – указатель на поток |
Возвращаемое значение: возвраща- |
крытый для чтения |
Возвращаемое значение: не нулевое |
ет 0 в случае успешного завершения, в про- |
Возвращаемое значение: в случае |
значение, если достигнут конец потока |
тивном случае возвращает EOF. |
успешного завершения возвращает |
stream |
6 0 |
Радиолюбитель – 11/2010 |
|
СПРАВОЧНЫЙ МАТЕРИАЛ
Описание: функция тестирует состоя- |
причем 0 так же допустим. Ноль возвра- |
|
scanf() |
ние флага EOF для указанного потока. |
щается, если поступавшие символы не |
|
Определение: |
Примечания: функция не сбрасывает |
могли быть интерпретированы в соответ- |
|
int scanf (const char *fmt,...) |
тестируемый флаг, для этого следует ис- |
ствии с заданным форматом. Функция воз- |
|
Описание: вариант fscanf() для ввода |
пользовать clearerr(). |
вращает EOF только в том случае, если |
|
из потока stdin. |
|
конец потока был достигнут прежде, чем |
|
|
ferror() |
завершено последнее преобразование |
|
scanf_P() |
Определение: |
формата. |
|
Определение: |
int ferror (FILE *stream) |
Примечания: полная реализация всех |
|
int scanf_P (const char *fmt,...) |
Параметры: |
возможностей форматирования ввода тре- |
|
Описание: вариант scanf(), использу- |
FILE *stream – указатель на поток |
бует больших затрат программной памяти. |
|
ющий строку формата в сегменте кода. |
Возвращаемое значение: не нулевое |
С целью минимизации ресурсов существу- |
|
|
значение, если установлен флаг ошибки в |
ет 3 варианта реализации функции |
|
vscanf() |
потоке stream |
vfscanf(), выбираемых компоновщиком во |
|
Определение: |
Описание: функция тестирует состоя- |
время сборки проекта: |
|
int vscanf (const char *fmt, va_list ap) |
ние флага ошибки для указанного потока. |
- обычная (по умолчанию) – реализует |
|
Описание: вариант vfscanf() для вво- |
Примечания: функция не сбрасывает |
все виды преобразований, кроме предназ- |
|
да из потока stdin. |
тестируемый флаг, для этого следует ис- |
наченных для чисел с плавающей точкой; |
|
|
пользовать clearerr(). |
- усеченная – реализует только базовые |
|
sscanf() |
|
преобразования форматов целых чисел и |
|
Определение: |
vfscanf() |
строк, кроме того, исключается управляю- |
|
int sscanf (const char *buf, const char |
Определение: |
щая последовательность %[ (см. Специфи- |
|
*fmt,...) |
int vfscanf (FILE *stream, const char *fmt, |
кация строки формата для функций фор- |
|
Параметры: |
va_list ap) |
матированного ввода); |
|
const char *buf – буфер для обработки |
Параметры: |
- полная – реализующая полную специ- |
|
const char *fmt – строка формата |
FILE *stream – указатель на поток, от- |
фикацию форматов, кроме того, снимаю- |
|
... – список вводимых аргументов |
крытый для чтения |
щая ограничение на размер в 255 симво- |
|
Описание: функция полностью анало- |
const char *fmt – указатель на строку- |
лов (размер ограничивается 65535). |
|
гичная vfscanf(), с той лишь разницей, что |
спецификатор формата |
Усеченная версия выбирается следую- |
|
вместо чтения из потока берутся символы |
va_list ap – список вводимых аргумен- |
щими параметрами компилятора: |
|
из буфера buf. |
тов |
-Wl,-u,vfscanf -lscanf_min –lm |
|
|
Возвращаемое значение: функция |
Полная версия выбирается следующи- |
|
sscanf_P() |
возвращает количество введенных элемен- |
ми параметрами компилятора: |
|
Определение: |
тов списка аргумента в случае успешного |
-Wl,-u,vfscanf -lscanf_flt -lm |
|
int sscanf_P (const char *buf, const char |
завершения или EOF в противном случае. |
|
|
*fmt,...) |
Описание: это базовая функция фор- |
vfscanf_P() |
|
Описание: вариант sscanf(), использу- |
матированного ввода для всего семейства |
Определение: |
|
ющий строку формата в сегменте кода. |
scanf-функций. Функция считывает симво- |
int vfscanf_P (FILE *stream, const char *fmt, |
|
|
лы из потока stream и преобразовывает их |
va_list ap) |
|
fflush() |
в соответствии с заданным форматом fmt, |
Описание: вариант функции vfscanf(), |
|
Определение: |
помещая результирующие значения в ар- |
использующий строку формата в сегменте |
|
int fflush (FILE *stream) |
гументы из списка ap. Все символы, не по- |
кода. |
|
Параметры: |
падающие под спецификацию управляю- |
|
|
FILE *stream – указатель на поток |
щей последовательности строки формата |
fscanf() |
|
Возвращаемое значение: |
(см. Спецификация строки формата для |
Определение: |
|
Описание: вызывает немедленный |
функций форматированного ввода) счита- |
int fscanf (FILE *stream, const char *fmt,...) |
|
«сброс» буферов чтения-записи для указан- |
ются текстом и проверяются на совпадение |
Описание: вариант функции vfscanf(), |
|
ного потока stream. |
с соответствующими символами строки |
использующий прямо указанный список |
|
Примечание: эта функция введена |
формата непосредственно. При этом про- |
вводимых аргументов. |
|
только для совместимости, т.к. никакой бу- |
бел в строке формата считается совпадаю- |
|
|
феризации ввода-вывода не реализовано. |
щим с любым символом «пустого места» в |
fscanf_P() |
|
Функция не делает ничего |
потоке, прочие же должны совпадать абсо- |
Определение: |
|
|
лютно. Если обнаруживается несовпадение |
int fscanf_P (FILE *stream, const char |
|
|
символов, либо достигается конец потока – |
*fmt,...) |
|
|
функция завершается по ошибке. |
Описание: вариант функции fscanf(), |
|
|
Функция возвращает количество счи- |
использующий строку формата в сегменте |
|
|
танных элементов в списке аргументов, |
кода. |
|
Продолжение в №12/2010 |
|
|
|
|
|
|
|
|
6 1
Радиолюбитель – 11/2010