Преобразование битов из одного массива в другой?

Я строю библиотеку для этого вакуумного флуоресцентного дисплея. Это очень простой интерфейс, и у меня все функции работают.

Проблема, с которой я столкнулся сейчас, заключается в том, что я пытаюсь сделать код максимально компактным, но загрузка пользовательских символов не является интуитивно понятной. Это растровое изображение шрифта, которое отображается в совершенно разных битах и ​​байтах для самого дисплея. От IEE VFD Datasheet, когда вы прокручиваете вниз, вы видите, что биты отображаются повсеместно.

Код, который у меня есть, работает примерно так:

// input the font bitmap, the bit from that line of the bitmap and the bit it needs to go to
static unsigned char VFD_CONVERT(const unsigned char* font, unsigned char from, unsigned char to) {
return ((*font >> from) & 0x01) << to;
//return (*font & (1 << from)) ? (1<<to) : 0;
}
// macros to make it easyer to read and see
#define CM_01 font+0, 4
#define CM_02 font+0, 3
#define CM_03 font+0, 2
#define CM_04 font+0, 1
#define CM_05 font+0, 0

// One of the 7 lines I have to send
o = VFD_CONVERT(CM_07,6) | VFD_CONVERT(CM_13,5) | VFD_CONVERT(CM_30,4) | VFD_CONVERT(CM_23,3) | VFD_CONVERT(CM_04,2) | VFD_CONVERT(CM_14,1) | VFD_CONVERT(CM_33,0);
send(o);

Это, очевидно, не весь код. Вы можете увидеть все остальное мой репозиторий кода Google но это должно дать вам некоторое представление о том, что я делаю.

Поэтому у меня вопрос: есть ли лучший способ оптимизировать это или сделать перевод?

Изменение оператора возврата в VFD_CONVERT приводит к тому, что GCC сходит с ума (-O1, -O2, -O3 и -Os делают это) и расширяет код до 1400 байт. Если я использую оператор return со встроенным if, он уменьшает его до 800 байт. Я собирался, хотя asm сгенерировал операторы и текущие, я склонен просто написать все это в asm, поскольку я начинаю думать, что компилятор не знает, что он делает. Однако я подумал, что, может быть, это я, и я не знаю, что я делаю, и это сбивает с толку компилятор.

Как примечание, код там работает, оба оператора возврата загружают пользовательский символ, и он отображается (со странной ошибкой, когда я должен отправить его дважды, но это отдельная проблема).

1

Решение

Прежде всего, вы должны подать отчет об ошибке в gcc с минимальным примером, так как -Os никогда не должен генерировать больший код, чем -O0. Затем я предлагаю сохранить перестановку в таблице, как это

const char[][] perm = {{ 7, 13, 30, 23,  4, 14, 33}, ...

со специальными значениями, указывающими фиксированный ноль или один бит. Это также сделает ваш код более читабельным.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]