有大小限制的加法程序

Addition program with size limit

我正在尝试用 C 编写代码(使用 Keil µVision 5,设备:AT89C51AC3),让我输入 2 个整数,将它们相加,然后打印出来。问题是我被限制为最大字节码大小。 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;
}

当你看到这个简单的代码占用了 2k+ 的内存时,你应该打嗝了。好多啊!这样做的原因是 stdio 函数非常低效。

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

同时删除 int 类型,改用 stdint.h 中的固定大小类型。 (如果这是一个 8 位 MCU,你也应该避免使用 16 位数字,除非它们是必要的。)

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

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

如果你只想打印 int a 和 int b 的总和,你应该可以去掉

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

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