Я заметил, что вы хотите сохранить код с минимальной зависимостью от микроконтроллера.
Если вы хотите обрабатывать буфер dis_value как целое число с одним байтом на цифру, скажем, little-endian, что можетбудет храниться в регистре, который также должен быть быстрее, тогда вы можете объединить последовательность:
if (dis_value[N] > 9) {
dis_value[N] = 0;
dis_value[N+1]++;
Это становится (с вложением @kiran)
if ((dis_value&(0xf<<(N*8)))==(10<<(N*8)))
{
dis_value+=(0x100-10)<<(N*8);
if ...
}
Где я нахожусьПредполагая, что компилятор разрешит константные выражения.Также было бы хорошо отменить добавление и if для улучшения оценки условного конвейера, если у вашего контроллера есть конвейер, но это означает написание кода на ассемблере.
Следующий псевдокод должен дать идею.Следующее условие оценивается с использованием значения перед сложением, поэтому две операции могут выполняться параллельно.Если вы фактически кодировали это в схему, это очевидная оптимизация:
bool do0 = ((dis_value&(0xf<<(0*8)))==(9<<(0*8)))
dis_value++;
if (do0)
{
bool do1 = ((dis_value&(0xf<<(1*8)))==(9<<(1*8)));
dis_value += (0x100-10)<<(0*8);
if (do1)
{
do2 = ((dis_value&(0xf<<(2*8)))==(9<<(2*8)));
dis_value += (0x100-10)<<(1*8);
if (do2) ...
}
}
Следующий вопрос, который нужно задать, - как можно минимально обновить сегментированный дисплей для приращения!