有大小限制的加法程序
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()... 函数。
我正在尝试用 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()... 函数。