1

我以前使用 Keil 对 8051 微控制器进行编程。出于某种原因,我必须在 SDCC 中编写代码,但今天我在编译器中遇到了非常奇怪的行为。我正在使用代码块 IDE 12.11 和 SDCC 3.4 版本。

我正在编译这段简单的代码。

#include <mcs51/8051.h>
#include "Serial.h"


unsigned char digits[5]={0};

void main(void)
{
    serial_init(-13);

    digits[2]='a';
    serial_send(digits[2]);
    serial_send('a');

    while(1)
    {

    }

}

这是 serial_send 函数的定义。

void serial_send(unsigned char dat){
    while(!TI);
    TI = 0;
    SBUF = dat;
}

问题是,根据代码,它应该在终端上打印两次“a”字符,但它只打印一次。问题出在全局可验证数字[] 数组中。

该函数仅适用于常量值,但不适用于基于参数的变量。

我在这里发布这个问题是因为我认为这个问题与一些 C 语言技巧有关,我无法弄清楚。

我尝试重新安装编译器和IDE,但问题仍然存在。请一些机构解释为什么会这样。我尝试了不同的代码,在所有代码中,常量和局部变量都可以正常工作,但全局变量提供了奇怪的行为。

4

1 回答 1

2

检查您的空 while 循环while(!TI);是否没有被编译器优化。主要代码是模棱两可的,因为您无法判断'a'您实际看到的是哪个被发送。

将它们更改为 a'b'并尝试交换两个serial_send()调用的顺序,以验证这不仅仅是 SBUF 在 uart 发送当前字节之前被新数据过早覆盖的情况。

于 2014-11-15T08:12:39.453 回答