Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AVR_01-2010.doc
Скачиваний:
10
Добавлен:
19.09.2019
Размер:
368 Кб
Скачать
☆

Isr_alias()

ISR_ALIAS(vector, target_vector) - мак­рос, связывающий два вектора в один об­работчик. Не рекомендуется использование в новых разработках. В качестве парамет­ра vector и target_vector используется лю­бая из констант, как и для ISR(), причем параметр target_vector к моменту вызова макроса должен быть уже определен (см. врезку ISR_ALIAS):

Isr_aliasof()

ISR_ALIASOF(target_vector) - макрос, используемый в качестве опционального параметра ISR() для того, чтобы связать об­работчик, определенный ISR(), еще и с век­тором target_vector (см. врезку ISR_ALIASOF).

BADISR_vect

BADISR_vect - константа «псевдовек­тора», обозначающая любой явно не задан­ный вектор. По умолчанию соответствует переходу на начало программной памяти, вызывая переинициализацию всего кода при поступлении «необрабатываемого» прерывания.

Isr_block

ISR_BLOCK - опциональный атрибут, используемый в ISR(), и обозначающий, что прерывания будут запрещены в течение работы всего обработчика прерывания. Если этот атрибут не задан явно (т.е. исполь­зуется ISR() без атрибутов вообще), преры­вания все равно будут запрещены.

Isr_noblock

ISR_NOBLOCK - опциональный атри­бут, используемый в ISR(), и обозначающий, что прерывания будут разрешены в тече­ние работы всего обработчика прерывания. Это позволит быстрее отреагировать на ожидающие в очереди другие запросы пре­рываний, однако увеличивает требования к объему стека.

Isr_naked

ISR_NAKED - опциональный атрибут, используемый в ISR(), и обозначающий, что компилятор не должен добавлять пролог и эпилог к функции. В этом случае програм­мист обязан сам выполнить все необходи­мые меры, включая выход из обработчика макросом reti().

avr/io.h - Специфичные

для AVR функции ввода-вывода

Этот заголовочный файл по существу реализует автоматическое подключение одного конкретного файла, соответствую­щего выбранному микроконтроллеру. Во всяком случае, для определения констант и макросов портов ввода-вывода и т.п. пери­ферии программист более не должен при­менять никаких усилий, кроме подключения этого файла к проекту и задания типа мик­роконтроллера. Фактически происходит подключение целого ряда заголовочных файлов, в которых определены константы и макросы для обращения к различной пе­риферии микроконтроллера (см. например avr/sfr_defs.h - Регистры специальных фун­кций AVR).

Рассмотрение всех этих определений опущено, т.к. подразумевается, что про­граммист, работающий с AVR, вполне ин­формирован о его периферии. Из прочего стоит обратить внимание лишь на следую­щие константы:

RAMEND - соответствует адресу пос­ледней существующей ячейки ОЗУ, т.е. в сущности, определяет размер ОЗУ выбран­ного микроконтроллера.

XRAMEND - соответствует адресу пос­ледней существующей ячейки внешнего или дополнительно адресуемого ОЗУ (если его поддержка имеется в микроконтролле­ре).

E2END - соответствует адресу после­дней ячейки встроенного EEPROM

FLASHEND - соответствует адресу пос­ледней ячейки памяти программ, т.е. фак­тически определяет размер сегмента кода.

SPM_PAGESIZE - соответствует разме­ру страницы для операций самопрограмми­рования (т.е. записи из программы в сег­мент кода).

avr/pgmspace.h - Поддержка

обращения к сегменту кода AVR

В этом модуле определяются ряд фун­кций и макросов, позволяющих обращать­ся к данным, хранящимся в памяти про­грамм, т.е. сегменте кода. Для этого необ­ходимо, чтобы микроконтроллер поддержи­вал инструкции LPM или ELPM.

Функции этого модуля - попытка облег­чить процесс адаптации программ для IAR, однако полной совместимости нет по прин­ципиальным особенностям GCC.

Если вы работаете со строками, кото­рые постоянно размещены в ОЗУ, вы мо­жете использовать функции для работы с ними из модуля string.h - Строки, но для неизменных строк более удачным будет размещение их в сегменте кода. В этом слу­чае вы можете работать с ними при помо­щи функций этого модуля, которые совпа­дают по имени с аналогичными из string.h, но имеют суффикс _Р - признак того, что строка находится в программной памяти (такой принцип так же использовался и в модуле stdio.h - Стандартный ввод-вывод).

Однако следует учитывать, что функции из настоящего модуля могут работать толь­ко со строками, размещенными в первых 64К адресного пространства микроконтрол­лера, т.к. не используют инструкцию ELPM. Это не страшно в обычных случаях. Но мо­жет вызвать проблемы, если имеется много текстовых констант или же используется са­мозагрузка кода. При написании программы вы не должны беспокоиться о месте разме­щения строк, т.к. компоновщик автоматичес­ки разместит все данные в программной памяти сразу после векторов прерывания.

Так же следует помнить о том, что все используемые для обращения к сегменту кода указатели представляют себя адре­са байтов (хотя программная адресация у AVR - 16-битная).

Определения модуля

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

PROGMEM

PROGMEM - макрос, устанавливающий атрибут, указывающий, что переменная на самом деле представляет собой константу в сегменте кода

PSTR()

PSTR(s) - макрос, используемый для определения указателя на строку s, разме­щенную в сегменте кода

PGM_P

PGM_P - макрос, определяющий ука­затель на символ в сегменте кода

PGM_VOID_P

PGM_VOID_P - макрос, определяющий указатель на объект в сегменте кода

pgm_read_byte_near()

pgm_read_byte_near(address_short) - макрос, возвращающий значение байта, считанного из программной памяти по ад­ресу address_short (в первых 64К).

pgm_read_word_near()

pgm_read_word_near(address_short) - макрос, возвращающий значение 16-битно­го числа, считанного из программной памя­ти по адресу address_short (в первых 64К).

pgm_read_dword_near()

pgm_read_dword_near(address_short) - макрос, возвращающий значение 32-бит­ного числа, считанного из программной па­мяти по адресу address_short (в первых 64К).

pgm_read_byte_far()

pgm_read_byte_far(address_long) - мак­рос, возвращающий значение байта, счи­танного из программной памяти по адресу address_long (32 бита, нет ограничения в 64К).

pgm_read_word_far()

pgm_read_word_far(address_long) - мак­рос, возвращающий значение 16-битного числа, считанного из программной памяти по адресу address_long (32 бита, нет огра­ничения в 64К).

pgm_read_dword_far()

pgm_read_dword_far(address_long) - макрос, возвращающий значение 32-битно­го числа, считанного из программной памя­ти по адресу address_long (32 бита, нет ог­раничения в 64К).

pgm_read_byte()

pgm_read_byte(address_short) - аналог pgm_read_byte_near()

pgm_read_word()

pgm_read_word(address_short) - аналог pgm_read_word_near()

pgm_read_dword()

pgm_read_dword(address_short) - ана­лог pgm_read_dword_near()

Типы, вводимые модулем

Модуль вводит ряд типов, которые про­сто облегчают определение констант в сег­менте кода. По смыслу все эти типы анало­гичны определенным в inttypes.h - Целочис­ленные преобразования, только содержат префикс prog_, означающий, что соответ­ствующий объект размещается в памяти программ. В связи с этим расшифровка значения типов не приводится. prog_void prog_char prog_uchar prog_int8_t prog_uint8_t prog_int16_t

prog_uint16_t

prog_int32_t

prog_uint32_t

prog_int64_t

prog_uint64_t

Функции модуля

Так как все функции не более чем ана­логи string.h - Строки, вместо подробного описания будут указаны ссылки на функ­ции для работы со строками в ОЗУ. Един­ственное, на что должен обратить програм­мист, это типы передаваемых в функции па­раметров и возвращаемых значений: как правило, все указатели в функциях этого модуля - это указатели на объекты в сег­менте кода.

memchr_P()

PGM_VOID_P memchr_P (PGM_VOID_P s, int val, size_t len)

Функция ищет в области программной памяти s символ, возвращая указатель на него или NULL, если не найдено. Подробно­сти см. в memrchr()

memcmp_P()

int memcmp_P (const void *s1, PGM_VOID_P s2, size_t len)

Функция сравнивает область ОЗУ s1 и памяти программ s2. Подробности см. в memcmp()

memcpy_P()

void * memcpy_P (void *dest, PGM_VOID_P src, size_t len)

Функция копирует в область ОЗу dest содержимое области памяти программ src. Подробности см. в memcpy()

memrchr_P()

PGM_VOID_P memrchr_P (PGM_VOID_P s, int val, size_t len)

Функция ищет в области программной памяти s символ. Подробности см. в memrchr() и memchr_P()

strcasecmp_P()

int strcasecmp_P (const char *s1, PGM_P

s2)

Функция сравнивает строку s1 в ОЗУ со строкой в памяти программ s2 без учета регистра символов. См. strcasecmp()

strcat_P()

char * strcat_P (char *dest, PGM_P src) Функция осуществляет конкатенацию строки src из памяти программ к строке dest в ОЗУ. См. strcat()

strchr_P()

PGM_P strchr_P (PGM_P s, int val) Функция ищет символ в строке s в про­граммной памяти. См. strchr()

strchrnul_P()

PGM_P strchrnul_P (PGM_P s, int val) Функция, аналогичная strchr_P(), за ис­ключением того, что всегда возвращает не- NULL указатель: если символ не найден, возвращается указатель на завершающий ноль строки s

strcmp_P()

int strcmp_P (const char *s1, PGM_P s2)

Функция аналогична strcmp(), за исклю­чением того, что s2 находится в программ­ной памяти.

strcpy_P()

char * strcpy_P (char *s1, PGM_P s2)

Функция аналогична strcpy(), за исклю­чением того, что s2 находится в программ­ной памяти.

strcspn_P()

size_t strcspn_P (const char *s, PGM_P reject)

Функция аналогична strcspn(), за исклю­чением того, что reject находится в про­граммной памяти.

strlcat_P()

size_t strlcat_P (char *dest, PGM_P src, size_t siz)

Функция аналогична strlcat(), за исклю­чением того, что src находится в программ­ной памяти

strlcpy_P()

size_t strlcpy_P (char *dest, PGM_P src, size_t siz)

Функция аналогична strlcpy(), за исклю­чением того, что src находится в программ­ной памяти

strlen_P()

size_t strlen_P (PGM_P s)

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

strncasecmp_P()

int strncasecmp_P (const char *s1, PGM_P s2, size_t n)

Функция аналогична strncasecmp(), за исключением того, что s2 находится в про­граммной памяти

strncat_P()

char * strncat_P (char *dest, PGM_P src, size_t len)

Функция аналогична strncat(), за исклю­чением того, что src находится в программ­ной памяти

strncmp_P()

int strncmp_P (const char *s1, PGM_P s2, size_t n)

Функция аналогична strncmp(), за ис­ключением того, что s2 находится в про­граммной памяти

strncpy_P()

char * strncpy_P (char *dest, PGM_P src, size_t n)

Функция аналогична strncpy(), за исклю­чением того, что src находится в программ­ной памяти

strnlen_P()

size_t strnlen_P (PGM_P src, size_t len)

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

strpbrk_P()

char * strpbrk_P (const char *s, PGM_P accept)

Функция аналогична strpbrk(), за исклю­чением того, что accept находится в про­граммной памяти

strrchr_P()

PGM_P strrchr_P (PGM_P s, int val)

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

strsep_P()

char * strsep_P (char **sp, PGM_P delim)

Функция аналогична strsep(), за исклю­чением того, что delim находится в про­граммной памяти

strspn_P()

size_t strspn_P (const char *s, PGM_P accept)

Функция аналогична strspn(), за исклю­чением того, что accept находится в про­граммной памяти

strstr_P()

char * strstr_P (const char *s1, PGM_P s2)

Функция аналогична strstr(), за исклю­чением того, что s2 находится в программ­ной памяти

memmem_P()

void * memmem_P (const void *s1, size_t len1, PGM_VOID_P s2, size_t len2)

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

strcasestr_P()

char * strcasestr_P (const char *s1, PGM_P

s2)

Функция аналогична strcasestr(), за ис­ключением того, что s2 находится в про­граммной памяти

p^ Продолжение в N92/2011

1 Значение может отличаться в зависимости от стандарта, которому соответствует компилятор.

2 Разделителями считаются любые скобки - круглые, фигурные и квадратные, одна­ко не всегда и не все из них могут использоваться произвольно - существует ряд ограни­чений, которые будут упомянуты по мере изложения основ языка.

3 Список служебных слов может несколько отличаться в зависимости от конкретного компилятора (как правило в сторону расширения).

4 Приведены типы, являющиеся стандартными в версии Си для микроконтроллеров

AVR

5 Ключевое слово short имеет важную роль в системах, для которых тип int не являет­ся 16-битным числом (например, для PC-компьютеров). В этом случае тип char соответ­ственно может быть 16-битным, и тогда для получения однобайтного типа необходимо использование short char.

6 Двоичные константы определены для GNU-расширений Си.

7 Здесь и далее, если иное не оговорено, используется традиционный формат опи­сания шаблонов выражений: в угловых скобках указываются обязательные элементы, в квадратных - опциональные, все прочие символы вне скобок являются обязательными.

8 Вспоминается шутка математиков: «представьте себе проекцию семимерного куба на пятимерную плоскость»...

Радиолюбитель - 01/2010 U 63