#include <avr/io.h>
#include <avr/pgmspace.h>
Функции
этого модуля
обеспечивают
возможность
обращения к
данным,
хранимым в
пространстве
программ (flash). Для
выполнения этх
функций,
микроконтроллер
должен
поддерживать
команды LPM
или ELPM
.
Примечание:
Эти функции - попытка обеспечить совместимость с header файлами, идущими с IAR C, чтобы сделать проще перенесения приложений между различными компиляторами. Совместимость не 100% (GCC не имеет полной поддержки множественнх адреснх пространств).
Если Вы работаете со строками, полностью расположенными в ОЗУ, используйте стандартные функции для работы со строками <string.h>.
По
возможности,
помещайте
константы в
нижние 64 KB и
используйте pgm_read_byte_near()
или pgm_read_word_near()
а не pgm_read_byte_far()
или pgm_read_word_far(),
тогда Вы
сможете
использовать
верхние 64 К
для
исполняемого
кода. Все
функции,
которые
прибавлены
к _
P
require
как
параметры
для
нахождения в нижних 64 KB flash ROM,
поскольку
они не
используют
команды ELPM. Это -
обычно не
большое
беспокойство,
поскольку
установка
компоновщика
упорядочивает
любые
объявленные
константы
пространства
программ,
используя
макрос от этого
header
файла, так
что они
помещены
справа после
векторов
прерывания, и
перед любым
выполнимым
кодом. Однако
это может
стать
проблемой, если
имеется
слишком
много
констант, или
для bootloaders на
устройствах
с больше чем 64 KB ROM. Все
эти функции
не будут
работать в
такой ситуации.
Макроопределения |
|
#define |
PROGMEM __ATTR_PROGMEM__ |
#define |
PSTR(s) ((const
PROGMEM char *)(s)) |
#define |
pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) |
#define |
pgm_read_word_near(address_short) __LPM_word((uint16_t)(address_short)) |
#define |
pgm_read_dword_near(address_short) __LPM_dword((uint16_t)(address_short)) |
#define |
pgm_read_byte_far(address_long) __ELPM((uint32_t)(address_long)) |
#define |
pgm_read_word_far(address_long) __ELPM_word((uint32_t)(address_long)) |
#define |
pgm_read_dword_far(address_long) __ELPM_dword((uint32_t)(address_long)) |
#define |
pgm_read_byte(address_short) pgm_read_byte_near(address_short) |
#define |
pgm_read_word(address_short) pgm_read_word_near(address_short) |
#define |
pgm_read_dword(address_short) pgm_read_dword_near(address_short) |
#define |
|
#define |
PGM_VOID_P const prog_void * |
Типоопределения |
|
typedef void PROGMEM |
|
typedef char PROGMEM |
|
typedef unsigned char PROGMEM |
|
typedef int8_t PROGMEM |
|
typedef uint8_t PROGMEM |
|
typedef int16_t PROGMEM |
|
typedef uint16_t PROGMEM |
|
typedef int32_t PROGMEM |
|
typedef uint32_t PROGMEM |
|
typedef int64_t PROGMEM |
|
typedef uint64_t PROGMEM |
|
Функции |
|
PGM_VOID_P |
memchr_P (PGM_VOID_P s, int val,
size_t len) __ATTR_CONST__ |
int |
memcmp_P (const void *, PGM_VOID_P, size_t)
__ATTR_PURE__ |
void * |
memcpy_P (void *, PGM_VOID_P, size_t) |
PGM_VOID_P |
memrchr_P (PGM_VOID_P s, int val, size_t len)
__ATTR_CONST__ |
int |
strcasecmp_P (const char *, PGM_P) __ATTR_PURE__ |
char * |
strcat_P (char *, PGM_P) |
PGM_P |
strchr_P (PGM_P s, int val) __ATTR_CONST__ |
PGM_P |
strchrnul_P (PGM_P s, int val) __ATTR_CONST__ |
int |
strcmp_P (const char *, PGM_P) __ATTR_PURE__ |
char * |
strcpy_P (char *, PGM_P) |
size_t |
strcspn_P (const char *s, PGM_P reject) __ATTR_PURE__ |
size_t |
strlcat_P (char *, PGM_P, size_t) |
size_t |
strlcpy_P (char *, PGM_P, size_t) |
size_t |
strlen_P (PGM_P) __ATTR_CONST__ |
int |
strncasecmp_P (const char *, PGM_P, size_t)
__ATTR_PURE__ |
char * |
strncat_P (char *, PGM_P, size_t) |
int |
strncmp_P (const char *, PGM_P,
size_t) __ATTR_PURE__ |
char * |
strncpy_P (char *, PGM_P, size_t) |
size_t |
strnlen_P (PGM_P, size_t) __ATTR_CONST__ |
char * |
strpbrk_P (const char *s, PGM_P accept) __ATTR_PURE__ |
PGM_P |
strrchr_P (PGM_P s, int val) __ATTR_CONST__ |
char * |
strsep_P (char **sp, PGM_P delim) |
size_t |
strspn_P (const char *s, PGM_P accept) __ATTR_PURE__ |
char * |
strstr_P (const char *, PGM_P)
__ATTR_PURE__ |
void * |
memmem_P (const void *, size_t, PGM_VOID_P, size_t)
__ATTR_PURE__ |
char * |
strcasestr_P (const char *, PGM_P) __ATTR_PURE__ |
#define
PGM_P const prog_char * |
Используется для объявления переменных, которые являются указателями на строку в памяти программ.
Считывает байт из памяти программ по 16-разрядно-му ("ближнему") адресу.
Примечание: адрес - адрес байта. Адрес находится в пространстве программ.
( |
address_long |
|
) |
__ELPM((uint32_t)(address_long)) |
Считывает байт из памяти программ по 32-х разрядно-му ("дальнему") адресу.
Примечание: адрес - адрес байта. Адрес находится в пространстве программ.
( |
address_short |
|
) |
__LPM((uint16_t)(address_short)) |
Считывает байт из памяти программ по 16-тиразрядно-му ("ближнему") адресу.
Примечание: адрес - адрес байта. Адрес находится в пространстве программ.
Считывает слово из памяти программ по 16-и разрядному («ближнему») адресу.
Примечание: адрес - адрес байта. Адрес находится в пространстве программ.
( |
address_long |
|
) |
__ELPM_dword((uint32_t)(address_long)) |
Считывает двойное слово из памяти программ по 32-разрядному («дальнему») адресу.
Примечание: адрес - адрес байта. Адрес находится в пространстве программ.
( |
address_short |
|
) |
__LPM_dword((uint16_t)(address_short)) |
Считывает двойное слово из памяти программ по 16-разрядному («ближнему») адресу.
Примечание: адрес - адрес байта. Адрес находится в пространстве программ.
Считывает слово из памяти программ по 16-разрядному («ближнему») адресу.
Примечание: адрес - адрес байта. Адрес находится в пространстве программ.
( |
address_long |
|
) |
__ELPM_word((uint32_t)(address_long)) |
Считывает слово из памяти программ по 32-bit («дальнему») адресу.
Примечание: адрес - адрес байта. Адрес находится в пространстве программ.
( |
address_short |
|
) |
__LPM_word((uint16_t)(address_short)) |
Считывает слово из памяти программ по 16-тиразряд-ному ("ближнему") адресу.
Примечание: адрес - адрес байта. Адрес находится в пространстве программ
#define
PGM_VOID_P const prog_void * |
Используется
для
объявления
обобщенных указателей
на некоторый
объект в
памяти программ.
Припишите
к
использованию,
чтобы
объявить
объект,
располагаемый
во flash ROM.
Используется для объявления статических указателей на некоторую строку в памяти программ.
Тип
объекта "char",
расположенного
во flash ROM.
Тип
объекта "int16_t"
расположенного
во flash ROM.
Тип
объека
"int32_t" расположенного
во flash ROM.
Тип объекта "int64_t", расположенного во flash ROM.
Note:
This type is not available when the
compiler option -mint8 is in effect.
Тип
объекта "int8_t",
расположенного
во flash ROM.
Тип
объект " unsigned char "
расположенного
во flash ROM.
Тип
объекта "uint16_t",
расположенного
во flash ROM.
Тип
объекта "uint32_t",
расположенного
во flash ROM.
Тип объекта "uint64_t", расположенного во flash ROM.
Примечание:
Этот
тип не
доступен, при
опции
компилятора
-mint8.
Тип
объекта "uint8_t",
расположенного
во flash ROM.
Тип объекта “void”, расположенного вj flash ROM. Не имеет смысла отдельно, но может использоваться, чтобы объявить "void *" объект во flash ROM.
Просмотр флэш-памяти для символа.
Функция
memchr_P()
ищет первые len
байт
из
флэш-памяти
область, на
которую
указывают s
до
символа val
.
Первый байт,
который
будет
соответствовать
val
(интерпретируемый,
поскольку
символ без знака)
останавливает
операцию.
Возвращения:
Функция
memchr_P()
возвращает
указатель на
байт
соответствия
или NULL
если
символ не
найден в
данной
области памяти.
Сравнение областей памяти.
Функция
memcmp_P()
сравнивает
первые len
байт из
областей
памяти s
1
и flash s
2
.
сравнение выполненяется,
с
использованием
операций для
символа без
знака.
Returns:
Функция
memcmp_P()
возвращает
целое число меньше
чем, равный,
или больше
чем нуль, если
первые len
байты s1
найден,
соответственно,
чтобы быть
меньше чем,
чтобы
соответствовать,
или больше
чем первый len
байты s2.
Копирует n байтов из области памяти программ, на которую ссылается src, в область памяти, на которую ссылается dest. Функция возвращает указатель на dest. Функция memcpy_P () подобна memcpy (), кроме строки src проживает в месте программы.
Пример использования: #include <stdio.h>
#include
<avr/io.h>
#include
<avr/pgmspace.h> const char src [ ] = "Source string";
char
dest[] = "Destination string";
void
main(void)
{
memcpy_P(dest,
src, strlen(src)); printf("dest = %s", dest);
//Результат:
"dest = Source stringtring"
}
Функция
memmem_P()
подобна memmem() за
исключением
того, что
указателем
на строку в
пространстве
программ
является s2.
Функция memrchr_P() похжа на функцию memchr_P(), за исключением того, что это ищет назад с конца len байты, на которые указывают src вместо вперед от передней стороны. (Glibc, расширение ГНУ.)
Возвращения:
Функция
memrchr_P()
возвращает
указатель на
байт
соответствия
или NULL
если
символ не
найден в
данной
области памяти.
Сравнивает две строки без учета регистра символов и возвращает число <0, если sl< s2; 0, если sl=s2 или число > 0, если s1 > s2.
Строка
s1
размещена в
памяти SRAM, а строка s2 — во
флэш-памяти.
Пример
использования: #include <stdio.h>
#include
<avr/io.h>
#include
<avr/pgmspace.h>
char s1[]
= "STRING 1";
const char
s2[] = "String 2";
int res;
void
main(void)
{
res =
strcasecmp_P(si, s2);
printf("res=%d",
res);
//Результат: "res=-l"
}
Эта
функция
подобна strcasestr() за
исключением
того, что s2 является
указателем
на строку в
пространстве
программ.
Добавляет
строку src,
размещенную
в памяти программ, в
конец
строки dest.
Строка dest
должна
иметь достаточную
длину.
Функция
возвращает
указатель на
dest
Пример
использования: #include <stdio.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
const char
src[] = "String 1";
char
dest[20] = "String 2";
void main(void)
{
strcat
P(dest, src);
printf("dest=%s",
dest);
//Результат:
"dest = String 2Stringl"
}
Ф-ия strcat_P()
похожа на
функцию strcat()
за
исключением
того, что
строка src должна
быть
расположена
в
пространстве
программ (flash).
Определяет местонахождение символа в строке пространства программ.
Функция strchr_P() определяет местонахождение первого возникновения val (преобразован в символ) в строке, на которую указывают s в пространстве программ. Нуль конца строки рассматривается как часть строки.
Функция strchr_P() походит на strchr() за исключением того, что s является указателем на строку в пространстве программ.
Возвращения:
Функция
strchr_P
()
возвращает
указатель на
согласованный
символ или NULL
если
символ не
найден.
Функция strchrnul_P()i походит на strchr_P() за исключением того, что, если c не найден в s, тогда возвращается указатель на нулевой байт в конце s, а не NULL. (Glibc, расширение ГНУ.)
Возвращения:
Функция
strchrnul_P()
возвращает
указатель на
согласованный
символ, или
указатель на
нулевой байт
в конце s
(то есть, s
+
strlen
(s))
если символ
не найден.
Сравнивает две строки (s2 размещена в памяти программ) и возвращает число <0, если sl< s2; 0, если s1=s2 или число > 0, если s1 > s2
Пример использования; #include <stdio.h>
#include
<avr/io.h>
#include
<avr/pgmspace.h>
char s1 []
= "String 1";
const char
s2[] = "String 2";
int res;
void
main(void)
{
res =
strcmp_P(sl, s2);
printf("res=%d,
res); // "res=-l"
}
Функция
strcmp_P()
является
подобным strcmp()
за
исключением
того, что s2 является
указателем
на строку в
пространстве
программ.
Копирует src из памяти программ в dest с учетом символа завершения строки "\0". Функция возвращает указатель на dest
Пример использования: #include <stdio.h>
#include
<avr/io.h>
#include
<avr/pgmspace.h>
const char
src[] = "Source string";
char
dest[] = "Destination string";
void
main(void)
{
strcpy_P(dest,
src) ;
printf("dest
= %s", dest);
//Результат:
"dest = Source string\Oring"
}
Функция strcpy_P() подобнf strcpy() за исключением того, что src - указатель на строку в пространстве программ.
Функция
strcspn_P()
вычисляет
длину
начальной
доли s
который
состоит
полностью из
символов не в
reject
.
Эта функция
подобна strcspn() за
исключением
того, что reject
является
указателем
на строку в
пространстве
программ.
Возвращения:
Функция
strcspn_P()
возвращает
число
символов в
начальной доле
s
которые
не находятся
в строке reject
.
Нуль конца
строки не рассматривается
как часть
строки.
Добавляет строку src из памяти программ в конец строки dest размером siz. Функция возвращает значение strlen(scr) + MIN(siz, strlen(initial dist). Если возвращаемое значение >= siz, строка урезается.
Пример использования: #include <stdio.h>
#include
<avr/io.h>
#include
<avr/pgmspace.h>
const char
src[] = "String 1";
char
dest[ll] = "String 2";
void
main(void)
{
strlcat_P(dest,
src, 14);
printf("dest
= %s", dest);
//Результат:
"dest = String 2Str", - в dest поместились только 3 символа
}
Связывает
две строки.
Функция strlcat_P()
подобна strlcat(),
за исключением
того, что src
строка
должна быть
расположена
в пространстве
программ (flash).
Копирует
строку src из памяти
программ в
строку dest в памяти SRAM
размером siz (с
учетом
символа
конца строки
"\0"). Функция возвращает
значение strlenP(src). Если
возвращаемое
значение >= siz,
строка
урезается.
Пример использования: #include <stdio.h>
#include
<avr/io.h>
#include
<avr/pgmspace.h>
const char
src[] = "Source string";
char
dest[] = "Destination string";
void
main(void)
{
strlcpy_P(dest,
src, strlen_P(src));
printf("dest
= %s", dest);
//Результат:
"dest = Source string\Oring"
}
Возвращает
количество
символов в src, не
включая
символ конца
строки "\0".
Пример
использования: #include <stdio.h>
#include
<avr/io.h>
#include
<avr/pgmspace.h>
const char
src[] = "Source string";
char dest
[ ] = "Destination string";
void
main(void)
{
strlcpy_P(dest,
src, strlen_P(src));
printf("dest
= %s", dest);
//Результат:
"dest = Source string\0ring"
}
Функция
strlen_P()
подобна strlen(),
за
исключением
того, что src -
указатель на
строку в
пространстве
программ.
Возвращения: функция strlen() возвращает число символов в src.
Сравнивает
первые n символов
двух строк без
учета
регистра
символов и
возвращает число
<0, если sl< s2;
0, если sl=s2 или
число > 0, если s1 > s2.
Строка s1 — в памяти SRAM,
строка s2 — во
флэш-памяти
Пример
использования: #include <stdio.h>
#include
<avr/io.h>
#include
<avr/pgmspace.h>
char sl[]
= "STRING 1";
const char
s2[] = "String 2";
int res;
void
main(void)
{
res =
strncasecmp P(sl, s2, 6);
printf("res=%d",
res); // "res=0"
}
Сравает
две строки, игнорируюя
регистр.
Функция strncasecmp_P() подобна strcasecmp_P(), только сравниваются перве n символов s1.
Добавляет
первые len символов
строки src из памяти
программ в конец
строки dest в памяти SRAM.
Строка-приемник
должна иметь
достаточную
длину. Функция
возвращает
указатель на dest.
Пример
использования: #include <stdio.h>
#include <avr/io.h> #include
<avr/pgmspace.h>
const char
src[] = "String 1";
char dest[20]
= "String 2"; void main(void)
{
strncat_P(dest, src,
3);
printf("dest=%s", dest);
//Результат:
"dest = String 2Str"
}
Сравнивает первые len символов строк s1 и s2 и возвращает число <0, если sl< s2; 0, если sl=s2 или число > 0, если s1 > s2. Строка s1 — в памяти SRAM, строка s2 — во флэш-памяти.
Пример использования: #include <stdio . h>
#include <avr/io.h>
#include
<avr/pgmspace.h>
char s1[]
= "String 1";
const char
s2[] = "String 2";
inr res;
void main(void)
{
res =
strncmp_P(s1, s2, 6);
printf("res=%d,
res); //Результат:
"res=0"
}
Функция strncmp_P() подобна strcmp_P() но сравниваются первые (не более) n символы из s1 и s2.
Копирует n символов строки src из памяти программ в строку dest в памяти SRAM с учетом символа завершения строки "\0". Функция возвращает указатель на dest. В случае, если длина src - меньше чем это n, остаток от dest дополнятся с пустыми указателями.
Пример использования: #include <stdio . h>
#include
<avr/io.h>
#include
<avr/pgmspace.h>
const char
src[] = "Source string";
char dest[]
= "Destination string";
void
main(void)
{
strncpy_P(dest,
src, 7);
printf("dest
= Is", dest);
//Результат:
"dest = Source tion string"
}
Функция strncpy_P() подобна strcpy_P() за исключением того, что не больше чем n байт src копируются. Таким образом, если нет никакого нулевого байта среди первых n байтов src, результат не будет с нулевым символом в конце.
Определение длины строки, установка размера.
Функция strnlen_P() похожа на strnlen(), за исключением того, что src является указателем на строку в пространстве программ.
Возвращения:
Функция
strnlen_P возвращения
количество
символов в src, не
включая
символ конца
строки "\0", но
не больше,
чем len.
Функция
strpbrk_P()
определяет
местонахождение
первого возникновения
в строке s
из любого из
символов в
перепрограммируемой
строке accept
.
Эта функция
подобна strpbrk() за
исключением
того, что accept
является
указателем
на строку в
пространстве
программ.
Возвращения:
Функция
strpbrk_P()
возвращает
указатель на
символ в s
это
соответствует
одному из
символов в accept
,
или NULL
если
никакой
такой символ
не найден.
Нуль конца строки
не
рассматривается
как часть
строки: если
один или оба
параметра
пусты,
результат
будет NULL
.
Поиск символа в строке.
Функция strrchr_P() возвращает указатель на последнее возникновение символа val в строке s flash.
Возвращения:
Функция
strrchr_P()
возвращает
указатель на
соответствующий
символ или NULL
если
символ не
найден.
Анализирует строку в лексемах(маркерах).
Функция
strsep_P()
ищет, в
строке
содержание *
sp
,
первое
возникновение
любого из
символов
строки delim
(или символ
конца строки
'\0') и заменяет
это на '\0'.
Местоположение
следующего
символа после
символа -
разделителя
(или NULL
, если
конец строки
был
достигнут)
сохранен в *
sp
.
"Пустое"
поле, то есть
один вызванный
двумя
смежными
символами -
разделителями,
может быть
обнаружено,
сравнивая местоположение,
на которое
упоминает
указатель,
возвращенный
в *sp к '\0'. Эта
функция
подобна strsep
() за
исключением
того, что delim
является
указателем
на строку в
пространстве(пробеле)
программы.
Возвращения:
Функция
strsep_P()
возвращает
указатель на
первоначальное
значение *
sp
.
Если*sp
является NULL
, strsep_P()
возвращает NULL
.
Функция
strspn_P()
вычисляет
длину
начальной
доли s
которая
состоит
полностью из
символов в accept
.
Эта функция
подобна strspn() за
исключением
того, что accept является
указателем на
строку в
пространств
программ.
Возвращения:
Функция
strspn_P() returns число
символов
в начальной
доле s которые
состоят
только из
символов от accept. Нуль
конца строки
не рассматривают
как часть
строки.
Поиск подстроки.
Функция strstr_P() находит первое возникновение подстроки s2 в строке s1. Символы конца строки '\0' не сравниваются. Функция strstr_P () подобна strstr () за исключением того, что s2 является указателем на строку в пространстве программ.
Возвращения:
Функция strstr_P() возвращает указатель на начало подстроки, или NULL если подстрока не найдена. Если s2 пункты к строке нулевой длины, функция возвращает s1.