我试图使用C中的以下代码通过UART打印变量。

处理器-Intel 80486

编译器-IC编译器(1990年发布,来自英特尔)

uint32_t unGlobal = 0xABCDEF90;

void main (void)
{
    uint32_t unLocal = 0x12345678;

    UartWrite (unLocal);
    UartWrite (unGlobal);
}


UartWrite()是串行端口驱动程序。 UartWrite的参数为32位,并在内部打印每个字符。

在这里,局部变量可以正确打印,但是打印全局变量会给出垃圾值!没有获得全局变量值的原因可能是什么。
有人可以帮我弄这个吗?

最佳答案

UartWrite原型中的参数type的大小可能不足以包含全局值。我没有原型,但是对于similar函数(毫无疑问,不同的库),参数类型为char。如果在原型中它也是char,则为unsigned int传递值可能是问题的根源。

下面的示例说明了一个函数将接受一个对于原型来说太大而没有错误的大小变量,但随后会产生意外结果的场景:

int func(char a)
{
    a = 10000;
    return a;
}

int main(void)
{
    int a = 10000;
    int b;
    b = func(a);// note int type, or 10000 does not fit into a char type
                // b is returned, but not with the expected value.
    printf("%d" b);
    return 0;
}


结果:b = -24

UartWrite (??? )发布原型;

编辑(新信息)

我发现this Intel document on a compiler released in 1990可能是您正在使用的编译器的表亲。查看从第68页开始的部分:


  编译单元中的每个全局符号定义或引用都有一个
  控制如何(或是否)引用可见性属性
  从定义它的组件外部。有五个
  可见性的可能值:
    •EXTERNAL –编译器必须处理
  该符号就像在另一个组件中定义的一样。为一个
  定义,这意味着编译器必须假定该符号
  会被(中的)相同名称的定义取代(取代)
  另一个组件。请参阅符号抢占。如果功能69符号具有
  外部可见性
  编译器知道必须间接调用它并且可以内联
  间接调用存根。
    •DEFAULT –其他组件可以引用
  符号。此外,符号定义可能会被覆盖
  (被抢占)由另一个组件中相同名称的定义。
    •PROTECTED –其他组件可以引用该符号,但不能
  被另一个组件中相同名称的定义抢占。
    •隐藏–其他组件无法直接引用该符号。
  但是,其地址可能会间接传递给其他组件
  (例如,作为另一个函数调用的参数
  组件,或通过将其地址存储在数据项引用中
  另一个组件中的函数)。
    •内部–符号不能为
  直接在其定义组件之外引用或
  间接地。


再往下走一点,例如:

int i __attribute__ ((visibility("default")));
void __attribute__ ((visibility("hidden"))) x () {...}
extern void y() __attribute__ ((visibilty("protected");


还有更多。希望这可以帮助。

07-24 09:45
查看更多