Встроенные (built-in) функции

Компилятор поддерживает специальные встроенные функции двух видов:

- предназначенные для доступа и модификации битов системных регистров;

- работы с индексами круговых буферов.

Использование встроенных функций в принципе идентично использованию ассемблерных инструкций чтений/модификации системных регистров и указателей буферов данных, однако более предпочтительно в программе на С/С++, чем ассемблерные вставки.

Для работы с built-in функциями необходимо подключить заголовочный файл sysreg.h.

Функции доступа к системным регистрам аналогичны основным инструкциям ассемблера, предназначенным дл этих же целей, например:

int sysreg_read(const int SR_number) = sysreg чтение системного регистра sysreg
sysreg_write(const int SR_number, const int new_value) sysreg = запись системного регистра sysreg
sysreg_bit_clr(const int SR_number, const int bit_mask) bit clr sysreg bitmask очистка всех битов системного регистра, которые установлены в битовой маске
sysreg_bit_set(const int SR_number, const int bit_mask) bit set sysreg bitmask установка всех битов системного регистра, которые установлены в битовой маске
sysreg_bit_tgl(const int SR_number, const int bit_mask) bit tgl sysreg bitmask инверсия всех битов системного регистра, которые установлены в битовой маске
int sysreg_bit_tst(const int SR_number, const int bit_mask) bit tst sysreg bitmask возвращает ненулевое значение, если все биты системного регистра, которые установлены в битовой маске, равны единице в системном регистре

Для всех функций есть варианты с _nop на конце функции. Использование такого варианта приводит к генерации команды nop после инструкции bit...

В качестве наименований системных регистров используются:

в ADSP-21060 в ADSP-21160
sysreg_IMASK sysreg_IMASKP sysreg_ASTAT sysreg_STKY sysreg_USTAT1 sysreg_USTAT2 sysreg_LIRPTL sysreg_MMASK sysreg_ASTATY sysreg_FLAGS sysreg_STKYY sysreg_USTAT3 sysreg_USTAT4

В файлах def21060.h и def21160.h содержатся константы для указания номером битов в системных регистров (полезно для установки маски прерываний).

Функций работы с адресами в циклических буферах всего две: одна предполагает модификацию индекса, другая – указателя.

int circindex(int index, int incr, int num_items) index += incr; if (index<0) index += num_items; else if (index>=num_items) index -= num_items;
int circptr(void *ptr, size_t incr, void *base, size_t buflen) ptr += incr; if (ptr<base) ptr += buflen; else if (ptr>= (base+buflen)) ptr -= buflen;

При использовании встроенных функций в теле программы ее имя (вызов) должно начинаться с __built_in.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: