我试图通过UART使用C中的以下代码打印变量。
处理器 - 英特尔80486
编译器--IC编译器(来自英特尔,1990年发布)
uint32_t unGlobal = 0xABCDEF90;
void main (void)
{
uint32_t unLocal = 0x12345678;
UartWrite (unLocal);
UartWrite (unGlobal);
}
UartWrite()是串口驱动程序。 UartWrite的参数是32位,在内部打印每个字符。
这里,正确打印局部变量,但打印全局变量会给出垃圾值!可能是没有获取全局变量值的原因。 有人可以帮我这个吗?
答案 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和所有