访问全局变量会给出垃圾值

时间:2015-08-11 18:04:13

标签: c x86 global

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

处理器 - 英特尔80486

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

uint32_t unGlobal = 0xABCDEF90;

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

    UartWrite (unLocal);
    UartWrite (unGlobal);
}

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

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

3 个答案:

答案 0 :(得分:1)

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 - 编译器必须处理   符号就像它在另一个组件中定义一样。为一个   定义,这意味着编译器必须假定该符号   将通过相同名称的定义覆盖(抢占)   另一个组件。请参阅Symbol Preemption。如果函数69符号有   外部能见度   编译器知道它必须间接调用并且可以内联   间接调用存根。
    •DEFAULT - 其他组件可以参考   符号。此外,可以覆盖符号定义   (抢占)另一个组成部分中同名的定义     •PROTECTED - 其他组件可以引用符号,但不能   被另一个组成部分中的同名定义抢占     •HIDDEN - 其他组件不能直接引用该符号。   但是,它的地址可能会间接传递给其他组件   (例如,作为对另一个函数的调用的参数   组件,或通过将其地址存储在数据项引用中   另一个组成部分的功能)     •内部 - 符号不能   在其定义组件之外引用,直接或   间接的影响。

稍微向下 例如:

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

还有更多。希望这会有所帮助。

答案 1 :(得分:0)

C关键字 volatile 表示“不同访问之间的值可能会发生变化,即使它似乎没有被修改”。试试这个,看看这是否适合你。

答案 2 :(得分:0)

问题在于静态初始化。因为在运行时重新初始化全局变量会给出正确的值。 谢谢ryyker,@ Lundin和所有