c - 8051 的 sdcc 编译器的奇怪行为

标签 c global-variables codeblocks 8051 sdcc

我以前使用 Keil 对 8051 微 Controller 进行编程。出于某种原因,我必须在 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,但问题仍然存在。 有人会解释为什么会这样吗?我尝试了不同的代码,在所有代码中,常量和局部变量工作正常,但全局变量提供了奇怪的行为。

最佳答案

检查您的空 while 循环 while(!TI); 是否未被编译器优化。主要代码不明确,因为您无法分辨您实际看到发送的是哪个 'a'

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

关于c - 8051 的 sdcc 编译器的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25768703/

相关文章:

c - fgetc 不识别 EOF

c - 使用 popen 时 valgrind xml 输出格式错误

javascript - 在函数内部定义全局变量

c - 尝试在 Windows 8.1 下使用 Codeblocks IDE 在 C 中使用 FFMPEG

c - 线程对命令行输入的数字列表执行统计计算?

python - 蓝图中的 Flask 应用程序对象

C++ 控制全局对象的析构函数顺序

c - 尝试使用 pdcurses 扩展库时出现与 gdi32 相关的错误

c - 警告 : passing argument 2 of 'calcFx' makes integer from pointer without a cast

c - C 标准 I/O 的限制以及为什么我们不能将 C 标准 I/O 与套接字一起使用