У меня есть, как мне кажется, странная проблема. На приложенной картинке лучше видно. Я использую 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%, как показано на рисунке.
Заранее спасибо.
Изображение ------ Верхнее изображение: низкая память. Нижнее изображение: высокая память.
Ответ 1 · рейтинг 2 · nanofarad
16F18323 не имеет модуля с плавающей запятой, что означает, что он не может изначально выполнять операции с плавающей запятой. В результате компилятор должен эмулировать операции с плавающей запятой в программном обеспечении и, следовательно, должен создавать много кода даже для одной операции с плавающей запятой.
Первая операция включает константное выражение и, следовательно, не требует операций с плавающей запятой на микросхеме.
Для вашего конкретного примера вы можете вместо этого рассмотреть целочисленный подход:
red = blue + (blue / 2);
или альтернативно (если ваш компилятор не генерирует эффективный код для деления по степеням двойки):
red = blue + (blue >> 1);
Обратите внимание, что результат может незначительно отличаться из-за округления. Кроме того, обратите внимание, что смещение типов со знаком (таких как int) определяется реализацией; компилятор XC8 определяет сдвиг знакового значения как арифметический сдвиг с расширением знака, т.е. что мы хотим.