具有大小限制的添加程序

时间:2017-01-23 14:52:06

标签: c embedded 8051

我正在尝试用C语言编写代码(使用KeilμVision5,设备: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;
}

2 个答案:

答案 0 :(得分:2)

当你看到这个简单的代码占用2k +的内存时,你应该打嗝。那太多了!原因是stdio功能非常低效。

如果您需要节省内存和执行速度,则需要自己编写代码。这不是那么难,因为你可能只需要读取整数而不是那些函数可以处理的其他东西(浮点数,字符串等)。

同样摆脱int类型,请使用stdint.h中的固定尺寸类型。 (如果这是一个8位MCU,除非必要,否则还应避免使用16位数。)

此外,您还必须对I / O部件进行编码。在微控制器上,这可能意味着编写自己的UART驱动程序。

您应该能够将代码大小减少到几百个字节,具体取决于您的微控制器的代码(in)效率。

答案 1 :(得分:-1)

如果你只想打印int a和int b的总和,你应该能够摆脱

/ ------------------------------------------- -----     在16MHz下设置1200波特的串行端口。     ------------------------------------------------ /     #ifndef MONITOR51         SCON = 0x50; / * SCON:模式1,8位UART,启用rcvr /         TMOD | = 0x20; / TMOD:定时器1,模式2,8位重载 /         TH1 = 221; / TH1:1200波特重新加载值@ 16MHz /         TR1 = 1; / TR1:计时器1运行 /         TI = 1; / TI:设置TI发送UART的第一个字符* /     #万一: `

代码。只需保留printf()...和scarf()...函数。