我正在尝试用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;
}
答案 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()...函数。