Если ваш процент имеет всего 101 значение от 0 до 100, тогда гораздо быстрее использовать справочную таблицу, чем выполнять умножение / деление, особенно в микроконтроллерах, где аппаратные инструкции mul / div недоступны.
Большинство микроконтроллеров имеют много доступной флэш-памяти / EEPROM, но не имеют оперативной памяти, поэтому таблицу можно просто сохранить в ПЗУ. Чтение таблицы из ПЗУ, вероятно, медленнее, чем из ОЗУ, но все же намного быстрее, чем выполнение деления. Однако у некоторых микроконтроллеров есть длинные циклы чтения, поэтому вам может потребоваться предварительная выборка или загрузка таблицы в ОЗУ, если ее достаточно, или просто использовать метод умножения и деления, описанный выше. Вы также можете упаковать стол (потому что вам нужно всего 12 бит) или проделать другие трюки
#define PCT(n) (0x0fffU * (n) / 100U)
#define PCTROW(n) (PCT(10*n), PCT(10*n+1), PCT(10*n+2), PCT(10*n+3), PCT(10*n+4),\
PCT(10*n+5), PCT(10*n+6), PCT(10*n+7), PCT(10*n+8), PCT(10*n+9))
const uint16_t percent_tbl[] = {
PCTROW(0), PCTROW(1), PCTROW(2), PCTROW(3), PCTROW(4),
PCTROW(5), PCTROW(6), PCTROW(7), PCTROW(8), PCTROW(9), 0x0fffU
}
return percent_tbl[pct];
person
phuclv
schedule
04.08.2013
percent
какuint16_t
? Вычисления выполняются для типаint
, поэтому, если вашиint
не имеют ширины менее 20 бит, переполнение не будет. Для 16-битныхint
s вы можете использовать0x0FFFul
, чтобы избежать переполнения. - person Daniel Fischer   schedule 13.05.2013