allmaker
Mar 22 2012, 14:06
Есть кусок кода, содержащий массив знакогенератора из пары тысяч констант вида 0bxxxxxxxx, который надо портировать в мой проект на С в IAR AVR.
const u8 font[][6] = {
{ // ' '
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
},{ // '!'
0b00000000,
0b00000000,
0b11111010,
0b00000000,
0b00000000,
0b00000000,
...
Насколько я понимаю двочное представление чисел IARу чуждо.
Чую, что есть адеккватное решение.
Помогите плз.
MALLOY2
Mar 22 2012, 14:23
Оно чуждо не IAR а языку С и C++.
Я бы делал так:
Все это содержание перегнал бы в обычный бинарник, создвл бы специальную секцию во флеш, прилинковал бы туда этот бинарник.
Второй вариант сделать 256 дефайнов вида
Цитата
#define 0b00000000 0x0
#define 0b00000001 0x1
#define 0b00000010 0x2
...
#define 0b11111111 0xFF
Возможно уже есть готовый такой файл поищите по форуму.
Alex11
Mar 22 2012, 14:31
или, как вариант обрежьте 0 перед b, напишите 256 #define в нормальные числа и оно будет транслироваться.
Пока писал уже предложили. Только 0 все равно нужно отрезать.
_Артём_
Mar 22 2012, 14:32
Цитата(allmaker @ Mar 22 2012, 16:06)

Насколько я понимаю двочное представление чисел IARу чуждо.
Чуждо.
Напишите утилиту которая конвертирует ваши 0b100000 в 0xXX.
Это не сложно.
Код
/* Макро для использования двоичного формата чисел */
#define _BITSET(bits) \
((uint16_t) ( \
(bits % 010) | \
(bits / 010 % 010) << 1 | \
(bits / 0100 % 010) << 2 | \
(bits / 01000 % 010) << 3 | \
(bits / 010000 % 010) << 4 | \
(bits / 0100000 % 010) << 5 | \
(bits / 01000000 % 010) << 6 | \
(bits / 010000000 % 010) << 7 | \
(bits / 0100000000 % 010) << 8 | \
(bits / 01000000000 % 010) << 9 | \
(bits / 010000000000 % 010) << 10 | \
(bits / 0100000000000 % 010) << 11 | \
(bits / 01000000000000 % 010) << 12 | \
(bits / 010000000000000 % 010) << 13 | \
(bits / 0100000000000000 % 010) << 14 | \
(bits / 01000000000000000 % 010) << 15))
#define BIN(bits) _BITSET(0##bits)
/* Макро для использования четверичного формата чисел */
#define _PAIRSET(digits) \
((uint16_t) ( \
(digits % 010) | \
(digits / 010 % 010) << 2 | \
(digits / 0100 % 010) << 4 | \
(digits / 01000 % 010) << 6 | \
(digits / 010000 % 010) << 8 | \
(digits / 0100000 % 010) << 10 | \
(digits / 01000000 % 010) << 12 | \
(digits / 010000000 % 010) << 14))
#define QUAD(digits) _PAIRSET(0##digits)