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

У меня есть, как мне кажется, странная проблема. На приложенной картинке лучше видно. Я использую 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%, как показано на рисунке.

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

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


person AlphaModular    schedule 28.11.2019    source источник


Ответы (1)


arrow_upward
2
arrow_downward

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

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

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

red = blue + (blue / 2);

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

red = blue + (blue >> 1);

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

person nanofarad    schedule 28.11.2019
comment
Это здорово, большое спасибо за краткий и полезный ответ. - person AlphaModular; 29.11.2019
comment
@AlphaModular Нет проблем. Ваш вопрос был хорошо сформулирован и содержал достаточно деталей, что помогло на него легко ответить. Если это полностью решило первоначальную проблему, с которой вы столкнулись, вы можете пометить вопрос как ответ, щелкнув галочку слева от этого ответа. В общем, я рекомендую делать это для всех вопросов, которые вы задаете, как только у вас есть ответы, которыми вы довольны. - person nanofarad; 29.11.2019