Интересная функция в avr-gcc 4.7

AVR
Недавно обнаружил в avr-gcc 4.7 новую встроенную функцию __builtin_avr_insert_bits.
В заголовок <avr/builtins.h>, где находятся остальные встроенные функции, эту функцию пока не включили и объявлять ее прототип придётся самостоятельно:
unsigned char __builtin_avr_insert_bits (unsigned long map, unsigned char bits, unsigned char val);

Эта функция делает вставку отдельных бит из параметра bits в значение val, при этом параметр map задаёт способ вставки бит. Каждые 4 бита в map отвечают за отображение одного бита:
  • Если значение тетрады 0xf, то в соответствующий выходной бит копируется значение соответствующего бита из val
  • Если значение тетрады в диапазоне 0-7, то в соответствующий выходной бит копируется значение бита с номером равном этой тетраде из bits
  • Для остальных значений выход не определен.

Основное назначение этой функции — работа с несмежными линиями ввода-вывода. То есть то, что я делал тут и тут.
Достоинства:
  • Предельно эффективный генерируемый машинный код. Используются инструкции, которые нельзя сгенерировать с помощью стандартного Си кода, например, BST и BLD.
  • Способ отображения бит хранится в целочисленной 32-х битной константе, которую можно вынести из места использования куда-нибудь в заголовок.
Недостатки:
  • Только 8-ми битные значения.
  • Совершенно непереносимо — поддерживается только в одном компиляторе — avr-gcc 4.7.
Искать эту функцию в WinAVR или в AVR Toolchain от Atmel не стоит — там используется avr-gcc 4.5.x.
Достать avr-gcc 4.7. собранный под Windows можно тут.
  • +6
  • 19 мая 2012, 22:10
  • neiver

Комментарии (5)

RSS свернуть / развернуть
исходя из того, что параметр map 32хбитный, и сдвиг у AVR только 1-битный, эта ф-я ещё и тормозная.
0
Я бы порекомендовал сначала посмотреть машинный код, который она производит… Приятный сюрприз будет.
Параметр map — константа времени компиляции, в машинном коде от нее и следа не остаётся.
0
Это можно в WinAVR заменить соответствующие файлы, и тогда можно пользоваться этой функцией из AVRStudio?
0
В общем случае да, только вот версия недопилена, раздутый код получается. У меня где-то 15% разницы получилось.
0
15% это много, пока надо подождать с этим релизом)))
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.