【问题标题】:strange Behavior of sdcc compiler for 80518051 的 sdcc 编译器的奇怪行为
【发布时间】:2014-11-04 07:06:33
【问题描述】:

我之前使用 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,但问题仍然存在。 请一些机构解释为什么会这样。我尝试了不同的代码,在所有代码中,常量和局部变量都可以正常工作,但全局变量提供了奇怪的行为。

【问题讨论】:

  • 您使用哪种 8051 变体?哪种内存模型?
  • At89c51 和小内存模型。

标签: c global-variables codeblocks 8051 sdcc


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多