2023-10-02

vak: (Default)
Нашлись энтузиасты у нас в команде, залудили видео блог про то, чем мы тут занимаемся.

vak: (Default)
В архитектуре ARMv6-M отсутствует машинная команда целочисленного деления. Без деления по жизни несколько неудобно, поэтому в микроконтроллере RP2040 добавили отдельный аппаратный целочисленный делитель в виде нескольких регистров. Записываем делимое в регистр DIVIDEND, делитель в DIVISOR, и через 8 тактов извлекаем частное из регистра QUOTIENT и остаток из REMAINDER. Дёшево и сердито.

Прерываний/исключений для делителя не предусмотрено. Возникает классический вопрос: чего ждать при делении на ноль или переполнении. В документации тишина, поэтому пишем простой тест. Отдельно проверяем знаковое, отдельно беззнаковое деление. Прогоняем на реальном микроконтроллере:
Signed:
100 / 9 -> 11, rem 1
-100 / 9 -> -11, rem -1
100 / -9 -> -11, rem 1
-100 / -9 -> 11, rem -1
100 / 0 -> -1, rem 100
-100 / 0 -> 1, rem -100
0 / 0 -> -1, rem 0

-2147483648 / -1 -> -2147483648, rem 0
2147483647 / 3 -> 715827882, rem 1
Unsigned:
100 / 9 -> 11, rem 1
100 / 0 -> 4294967295, rem 100
0 / 0 -> 4294967295, rem 0

4294967295 / 3 -> 1431655765, rem 0

Деление на ноль выделено оранжевым цветом, переполнение синим. Попробуйте этот тест на своём компьютере - результаты варьируются для разных типов процессора и операционных систем.