Bezdepbonusu7Программирование: статьи и ответы

Вопрос

PIC 16F18 - Чрезмерное использование программной памяти при умножении на число с плавающей запятой

Автор вопроса: AlphaModularОтветов: 1

У меня есть, как мне кажется, странная проблема. На приложенной картинке лучше видно. Я использую PIC 16F18323 с MPLAB и XC8, пишущим на C. Программная память PIC составляет всего 2 КБ, поэтому мне нужно удерживать ее как можно меньше. Проблема в том, что когда я пытаюсь сделать расчет, использование памяти программы подскакивает на 40-50%. Расчет, который я делаю, прост:

int blue;
int red;
blue = 4 * 1.5;

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

int blue = 4;
int red;
red = blue * 1.5;

Использование памяти программы подскакивает до 40-50%, как показано на рисунке.

Заранее спасибо.

Изображение ------ Верхнее изображение: низкая память. Нижнее изображение: высокая память.

cfloating-pointmathpic

Ответы

Ответ 1 · рейтинг 2 · nanofarad

16F18323 не имеет модуля с плавающей запятой, что означает, что он не может изначально выполнять операции с плавающей запятой. В результате компилятор должен эмулировать операции с плавающей запятой в программном обеспечении и, следовательно, должен создавать много кода даже для одной операции с плавающей запятой.

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

Для вашего конкретного примера вы можете вместо этого рассмотреть целочисленный подход:

red = blue + (blue / 2);

или альтернативно (если ваш компилятор не генерирует эффективный код для деления по степеням двойки):

red = blue + (blue >> 1);

Обратите внимание, что результат может незначительно отличаться из-за округления. Кроме того, обратите внимание, что смещение типов со знаком (таких как int) определяется реализацией; компилятор XC8 определяет сдвиг знакового значения как арифметический сдвиг с расширением знака, т.е. что мы хотим.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы