2017-01-23 15 views
0

Я пытаюсь написать код на C (используя Keil μVision 5, устройство: AT89C51AC3), которое позволяет мне ввести 2 Целочисленные числа, добавить их и затем распечатать. Проблема в том, что я ограничен размером байтового кода max. 2048.Программа добавления с ограничением по размеру

Мой фактический код требует 2099 байт для запуска.

Любая идея, как я мог бы сделать то же самое, используя меньше памяти?

#include <stdio.h> 
#include <REG52.H> 

int main() 
{ 
    int a, b; 


    /*------------------------------------------------ 
    Setup the serial port for 1200 baud at 16MHz. 
    ------------------------------------------------*/ 
    #ifndef MONITOR51 
     SCON = 0x50;    /* SCON: mode 1, 8-bit UART, enable rcvr  */ 
     TMOD |= 0x20;    /* TMOD: timer 1, mode 2, 8-bit reload  */ 
     TH1 = 221;    /* TH1: reload value for 1200 baud @ 16MHz */ 
     TR1 = 1;     /* TR1: timer 1 run       */ 
     TI = 1;     /* TI: set TI to send first char of UART */ 
    #endif 

    printf("Enter 2 numbers\n"); 
    scanf("%d%d",&a,&b); 

    printf("%d\n",a+b); 

    return 0; 
} 
+1

Какова ваша целевая платформа? Какие устройства ввода у вас есть? Что такое устройство вывода? Вы можете читать непосредственно с устройства ввода без использования стандартной функции C 'scanf'? Можете ли вы напрямую выводить на выходное устройство? –

+4

Возможно, вы не используете 'scanf' и' printf'? –

+2

@xMarcoGP: Стандартные функции 'printf' и' scanf' являются очень гибкими и универсальными, поэтому ресурс является голодным. Попытайтесь заменить их рукописными целыми функциями конвертации и печати голой кости. – doynax

ответ

2

Вы должны икать, когда видите, что этот простой код занимает 2k + памяти. Это много! Причина этого в том, что функции stdio ужасно неэффективны.

Если вам нужно сэкономить память и скорость выполнения, вам необходимо закодировать их самостоятельно. Это не так сложно, поскольку вам, вероятно, просто нужно прочитать целые числа, а не все остальное, что может обрабатывать эта функция (числа с плавающей запятой, строки и т. Д.).

Также избавитесь от типа int, вместо этого используйте фиксированные размеры от stdint.h. (Если это 8-битный MCU, вы также должны избегать 16-разрядных номеров, если они не являются необходимыми.)

Кроме того, вам также придется закодировать часть ввода-вывода. На микроконтроллере это, вероятно, означало бы написание собственного драйвера UART.

Вы должны иметь возможность уменьшить размер кода до нескольких сотен байт, в зависимости от того, насколько эффективен ваш микроконтроллер (в).

-1

Если вы просто хотите, чтобы напечатать сумму Int А и Int б, вы должны быть в состоянии избавиться от

/---------------- -------------------------------- Настройка последовательного порта на 1200 бод на частоте 16 МГц. ------------------------------------------------/ #ifndef MONITOR51 SCON = 0x50;/* SCON: режим 1, 8-бит UART, включить rcvr / TMOD | = 0x20;/ TMOD: таймер 1, режим 2, перезагрузка 8 бит / TH1 = 221;/ TH1: значение перезарядки для 1200 бод @ 16 МГц / TR1 = 1;/ TR1: таймер 1 пробег / TI = 1;/ TI: установить TI для отправки первого символа UART */ #endif: `

код. Просто сохраните функции printf() ... и scarf() ....

+0

И как именно printf/scanf будет работать без инициализированного UART? Это микроконтроллер. – Lundin

 Смежные вопросы

  • Нет связанных вопросов^_^