Домашняя страница библиотеки_c AVR

Синтаксис языка C

Библиотека языка C GNU glibc

 Страницы развития библиотеки_с AVR

Главная страница

Инструкция пользователя

Содержание библиотеки_c

Часто задаваемые вопросы

Содержание по алфавиту

Демонстрационные проекты


<avr/pgmspace.h>:

Работа со строками, хранимыми во flash – памяти.

Детальное Описание

    #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 

PGM_P   const prog_char *

#define 

PGM_VOID_P   const prog_void *

 

Типоопределения

typedef void PROGMEM 

prog_void

typedef char PROGMEM 

prog_char

typedef unsigned char PROGMEM 

prog_uchar

typedef int8_t PROGMEM 

prog_int8_t

typedef uint8_t PROGMEM 

prog_uint8_t

typedef int16_t PROGMEM 

prog_int16_t

typedef uint16_t PROGMEM 

prog_uint16_t

typedef int32_t PROGMEM 

prog_int32_t

typedef uint32_t PROGMEM 

prog_uint32_t

typedef int64_t PROGMEM 

prog_int64_t

typedef uint64_t PROGMEM 

prog_uint64_t

 

Функции

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 *

Используется  для  объявления   переменных,  которые являются указателями на строку в памяти программ.

#define pgm_read_byte

(

address_short 

 

 ) 

   pgm_read_byte_near(address_short)

Считывает байт из памяти программ по 16-разрядно-му ("ближнему") адресу.

Примечание: адрес - адрес байта. Адрес находится в пространстве программ.

#define pgm_read_byte_far

(

address_long 

 

 ) 

   __ELPM((uint32_t)(address_long))

Считывает байт из памяти программ по 32-х разрядно-му ("дальнему") адресу.

Примечание: адрес - адрес байта. Адрес находится в пространстве программ.

#define pgm_read_byte_near

(

address_short 

 

 ) 

   __LPM((uint16_t)(address_short))

Считывает байт из памяти программ по 16-тиразрядно-му ("ближнему") адресу.

Примечание: адрес - адрес байта. Адрес находится в пространстве программ.

#define pgm_read_dword

(

address_short 

 

 ) 

   pgm_read_dword_near(address_short)

Считывает слово из памяти программ по 16-и разрядному («ближнему») адресу.  

Примечание: адрес - адрес байта. Адрес находится в пространстве программ.

#define pgm_read_dword_far

(

address_long 

 

 ) 

   __ELPM_dword((uint32_t)(address_long))

Считывает двойное слово из памяти программ по 32-разрядному («дальнему») адресу.

Примечание: адрес - адрес байта. Адрес находится в пространстве программ.

#define pgm_read_dword_near

(

address_short 

 

 ) 

   __LPM_dword((uint16_t)(address_short))

Считывает двойное слово из памяти программ по 16-разрядному («ближнему») адресу.

Примечание: адрес - адрес байта. Адрес находится в пространстве программ.

 

#define pgm_read_word

(

address_short 

 

 ) 

   pgm_read_word_near(address_short)

Считывает слово из памяти программ по 16-разрядному («ближнему») адресу.

Примечание: адрес - адрес байта. Адрес находится в пространстве программ. 

#define pgm_read_word_far

(

address_long 

 

 ) 

   __ELPM_word((uint32_t)(address_long))

Считывает слово из памяти программ по 32-bit («дальнему») адресу.

Примечание: адрес - адрес байта. Адрес находится в пространстве программ. 

 

#define pgm_read_word_near

(

address_short 

 

 ) 

   __LPM_word((uint16_t)(address_short))

Считывает слово из памяти программ по 16-тиразряд-ному ("ближнему") адресу.

Примечание: адрес - адрес байта. Адрес находится в пространстве программ

#define PGM_VOID_P   const prog_void *

Используется для объявления обобщенных указателей на некоторый объект в памяти программ.

#define PROGMEM   __ATTR_PROGMEM__

Припишите к использованию, чтобы объявить объект, располагаемый во flash ROM.

#define PSTR

(

s 

 

 ) 

   ((const PROGMEM char *)(s))

Используется для объявления статических указателей на некоторую строку в памяти программ.


Документация типоопределений

prog_char

Тип объекта "char", расположенного во flash ROM.

prog_int16_t

Тип объекта "int16_t" расположенного во flash ROM.

prog_int32_t

Тип объека "int32_t" расположенного во flash ROM.

prog_int64_t

Тип объекта "int64_t", расположенного во flash ROM.

Note:

This type is not available when the compiler option -mint8 is in effect.

prog_int8_t

Тип объекта "int8_t", расположенного во flash ROM.

prog_uchar

Тип объект " unsigned char " расположенного во flash ROM.

prog_uint16_t

Тип объекта "uint16_t", расположенного во flash ROM.

prog_uint32_t

Тип объекта "uint32_t", расположенного во flash ROM.

prog_uint64_t

Тип объекта "uint64_t", расположенного во flash ROM.

Примечание:

Этот тип не доступен, при опции компилятора -mint8.

prog_uint8_t

Тип объекта "uint8_t", расположенного во flash ROM.

prog_void

Тип объекта “void”, расположенного вj flash ROM. Не имеет смысла отдельно, но может использоваться, чтобы объявить "void *" объект во flash ROM.


Документация функций

PGM_VOID_P memchr_P

(

PGM_VOID_P 

s,

 

 

 

int 

val,

 

 

 

size_t 

len

 

 

)

 

 

 

Просмотр флэш-памяти для символа.

Функция memchr_P() ищет первые len байт из флэш-памяти область, на которую указывают s до символа val. Первый байт, который будет соответствовать val (интерпретируемый, поскольку символ без знака) останавливает операцию.

Возвращения:

Функция memchr_P() возвращает указатель на байт соответствия или NULL если символ не найден в данной области памяти.

int memcmp_P

(

const void

s1,

 

 

 

PGM_VOID_P 

s2,

 

 

 

size_t 

len

 

 

)

 

 

 

Сравнение областей памяти.

Функция memcmp_P() сравнивает первые len байт из областей памяти s1 и flash s2. сравнение выполненяется, с использованием операций для символа без знака.

Returns:

Функция memcmp_P() возвращает целое число меньше чем, равный, или больше чем нуль, если первые len байты s1 найден, соответственно, чтобы быть меньше чем, чтобы соответствовать, или больше чем первый len байты s2.

void * memcpy_P

(

void

dest,

 

 

 

PGM_VOID_P 

src,

 

 

 

size_t 

n

 

 

)

 

 

 

Копирует 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"

}

void * memmem_P

(

const void

s1,

 

 

 

size_t 

len1,

 

 

 

PGM_VOID_P 

s2,

 

 

 

size_t 

len2

 

 

)

 

 

 

Функция memmem_P() подобна memmem() за исключением того, что указателем на строку в пространстве программ является s2.

PGM_VOID_P memrchr_P

(

PGM_VOID_P 

src,

 

 

 

int 

val,

 

 

 

size_t 

len

 

 

)

 

 

 

Функция memrchr_P() похжа на функцию memchr_P(), за исключением того, что это ищет назад с конца len байты, на которые указывают src вместо вперед от передней стороны. (Glibc, расширение ГНУ.)

Возвращения:

Функция memrchr_P() возвращает указатель на байт соответствия или NULL если символ не найден в данной области памяти.

int strcasecmp_P

(

const char

s1,

 

 

 

PGM_P 

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";

int res;

void main(void)

{

res = strcasecmp_P(si, s2);

printf("res=%d", res);

//Результат: "res=-l"

}

char * strcasestr_P

(

const char * 

s1,

 

 

 

PGM_P 

s2

 

 

)

 

 

 

Эта функция подобна strcasestr() за исключением того, что s2 является указателем на строку в пространстве программ.

char * strcat_P

(

char

dest,

 

 

 

PGM_P 

src

 

 

)

 

 

 

Добавляет строку 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).

PGM_P strchr_P

(

PGM_P 

s,

 

 

 

int 

val

 

 

)

 

 

 

Определяет местонахождение символа в строке пространства программ.

Функция strchr_P() определяет местонахождение первого возникновения val (преобразован в символ) в строке, на которую указывают s в пространстве программ. Нуль конца строки рассматривается как часть строки.

Функция strchr_P() походит на strchr() за исключением того, что s является указателем на строку в пространстве программ.

Возвращения:

Функция strchr_P () возвращает указатель на согласованный символ или NULL если символ не найден.

PGM_P strchrnul_P

(

PGM_P 

s,

 

 

 

int 

c

 

 

)

 

 

 

Функция strchrnul_P()i походит на strchr_P() за исключением того, что, если c не найден в s, тогда возвращается указатель на нулевой байт в конце s, а не NULL. (Glibc, расширение ГНУ.)

Возвращения:

Функция strchrnul_P() возвращает указатель на согласованный символ, или указатель на нулевой байт в конце s (то есть, s+strlen(s)) если символ не найден.

int strcmp_P

(

const char

s1,

 

 

 

PGM_P 

s2

 

 

)

 

 

 

Сравнивает две строки (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 является указателем на строку в пространстве программ.

char * strcpy_P

(

char

dest,

 

 

 

PGM_P 

src

 

 

)

 

 

 

Копирует 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 - указатель на строку в пространстве программ.

size_t strcspn_P

(

const char * 

s,

 

 

 

PGM_P 

reject

 

 

)

 

 

 

Функция strcspn_P() вычисляет длину начальной доли s который состоит полностью из символов не в reject. Эта функция подобна strcspn() за исключением того, что reject является указателем на строку в пространстве программ.

Возвращения:

Функция strcspn_P() возвращает число символов в начальной доле s которые не находятся в строке reject. Нуль конца строки не рассматривается как часть строки.

size_t strlcat_P

(

char * 

dst,

 

 

 

PGM_P 

,

 

 

 

size_t 

siz

 

 

)

 

 

 

Добавляет строку 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).

size_t strlcpy_P

(

char * 

dst,

 

 

 

PGM_P 

,

 

 

 

size_t 

siz

 

 

)

 

 

 

Копирует строку 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"

}

size_t strlen_P

(

PGM_P 

src

 ) 

 

Возвращает количество символов в 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.

int strncasecmp_P

(

const char

s1,

 

 

 

PGM_P 

s2,

 

 

 

size_t 

n

 

 

)

 

 

 

Сравнивает первые 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.

char * strncat_P

(

char

dest,

 

 

 

PGM_P 

src,

 

 

 

size_t 

len

 

 

)

 

 

 

Добавляет первые 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"

}

int strncmp_P

(

const char

s1,

 

 

 

PGM_P 

s2,

 

 

 

size_t 

n

 

 

)

 

 

 

Сравнивает первые 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.

char * strncpy_P

(

char

dest,

 

 

 

PGM_P 

src,

 

 

 

size_t 

n

 

 

)

 

 

 

Копирует 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, результат не будет с нулевым символом в конце.

size_t strnlen_P

(

PGM_P 

src,

 

 

 

size_t 

len

 

 

)

 

 

 

Определение длины строки, установка размера.

Функция strnlen_P() похожа на strnlen(), за исключением того, что src является указателем на строку в пространстве программ.

Возвращения:

Функция strnlen_P возвращения количество символов в src, не включая символ конца строки "\0", но не больше, чем  len.

char * strpbrk_P

(

const char * 

s,

 

 

 

PGM_P 

accept

 

 

)

 

 

 

Функция strpbrk_P() определяет местонахождение первого возникновения в строке s из любого из символов в перепрограммируемой строке accept. Эта функция подобна strpbrk() за исключением того, что accept является указателем на строку в пространстве программ.

Возвращения:

Функция strpbrk_P() возвращает указатель на символ в s это соответствует одному из символов в accept, или NULL если никакой такой символ не найден. Нуль конца строки не рассматривается как часть строки: если один или оба параметра пусты, результат будет NULL.

PGM_P strrchr_P

(

PGM_P 

s,

 

 

 

int 

val

 

 

)

 

 

 

Поиск символа в строке.

Функция strrchr_P() возвращает указатель на последнее возникновение символа val в строке s flash.

Возвращения:

Функция strrchr_P() возвращает указатель на соответствующий символ или NULL если символ не найден.

char * strsep_P

(

char ** 

sp,

 

 

 

PGM_P 

delim

 

 

)

 

 

 

Анализирует строку в лексемах(маркерах).

Функция strsep_P() ищет, в строке содержание *sp, первое возникновение любого из символов строки delim (или символ конца строки '\0') и заменяет это на '\0'. Местоположение следующего символа после символа - разделителя (или NULL, если конец строки был достигнут) сохранен в *sp. "Пустое" поле, то есть один вызванный двумя смежными символами - разделителями, может быть обнаружено, сравнивая местоположение, на которое упоминает указатель, возвращенный в *sp к '\0'. Эта функция подобна strsep () за исключением того, что delim является указателем на строку в пространстве(пробеле) программы.

Возвращения:

Функция strsep_P() возвращает указатель на первоначальное значение *sp. Если*sp является NULL, strsep_P() возвращает NULL.

size_t strspn_P

(

const char

s,

 

 

 

PGM_P 

accept

 

 

)

 

 

 

Функция strspn_P() вычисляет длину начальной доли s которая состоит полностью из символов в accept. Эта функция подобна strspn() за исключением того, что accept является указателем на строку в пространств программ.

Возвращения:

Функция strspn_P() returns число символов в начальной доле s которые состоят только из символов от accept. Нуль конца строки не рассматривают как часть строки.

char * strstr_P

(

const char * 

s1,

 

 

 

PGM_P 

s2

 

 

)

 

 

 

Поиск подстроки.

Функция strstr_P() находит первое возникновение подстроки s2 в строке s1. Символы конца строки '\0'  не сравниваются. Функция strstr_P () подобна strstr () за исключением того, что s2 является указателем на строку в пространстве программ.

Возвращения:

Функция strstr_P() возвращает указатель на начало подстроки, или NULL если подстрока не найдена. Если s2 пункты к строке нулевой длины, функция возвращает s1.

 

Hosted by uCoz