Компилятор поддерживает специальные встроенные функции двух видов:
- предназначенные для доступа и модификации битов системных регистров;
- работы с индексами круговых буферов.
Использование встроенных функций в принципе идентично использованию ассемблерных инструкций чтений/модификации системных регистров и указателей буферов данных, однако более предпочтительно в программе на С/С++, чем ассемблерные вставки.
Для работы с 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.