我正在为 uController 编写 ac 程序,我设法用代码填充了 32kb。
该程序充满了以下“打印”功能:
void print(char *x)
{
while(*x) {
SerialWrite(*x++);}
}
SerialWrite 看起来像:
void SerialWrite(unsigned char c)
{
while(tx_buffer_size>250);
ES=0;
tx_buffer_size++;
if (tx_buffer_empty == 0){
txBuffer[tx_in++] = c;}
else {
tx_buffer_empty = 0;
SBUF = c;}
ES=1;
}
我用字符串文本调用 print 函数作为参数,例如:
print("Hello World");
我只使用了 32kb 外部存储器中的 2.2kb,所以我的结论是将“Hello World”移动到外部存储器,而不是在主程序中硬编码。
不幸的是,我的尝试实际上使情况变得更糟,我做了以下事情:
char xdata *msg1 = "Hello World"; // <-- this made it worse, and the external memory space was not used at all
print(msg1);
比我试过的:
char xdata msg1[] = "Hello World";
print(msg1);
这确实将外部内存大小增加了 12,这是正确的,因为字符串包含 11 个字符 + 空值。但程序内存也增加了 3。我尝试了不同的字符串长度,但程序内存不断增加 3 个字节。
我怎么解决这个问题?
另外:我正在使用 Keil 的 C 编译器,并且我在编译时有利于程序大小。uController 是一个 FPGA 芯片,具有仿真的 80C51 芯片。对于这个虚拟 80c51,我正在编写代码。我有 32kb 内存用于主程序,32kb 用于变量
编辑: *msg[] 是一个错字,它必须是 *msg