迪文科技论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: wsx

【提问】T5L0全局变量值被莫名奇妙改变

[复制链接]

10

主题

123

回帖

3956

积分

论坛元老

Rank: 8Rank: 8

积分
3956
发表于 2022-7-12 11:27:15 | 显示全部楼层

回帖奖励 +1 金钱

楼主,快把成果分享给大家......
回复

使用道具 举报

2

主题

18

回帖

252

积分

中级会员

Rank: 3Rank: 3

积分
252
 楼主| 发表于 2022-7-22 09:31:20 | 显示全部楼层
15231197670 发表于 2022-7-12 11:27
楼主,快把成果分享给大家......

问题原因:
1,迪文芯片在全局变量定义时初始化不可靠,需要在CPU初始化后单独初始化一次;
2,全局变量数组越界;
回复

使用道具 举报

10

主题

123

回帖

3956

积分

论坛元老

Rank: 8Rank: 8

积分
3956
发表于 2022-7-22 17:23:13 | 显示全部楼层
wsx 发表于 2022-7-22 09:31
问题原因:
1,迪文芯片在全局变量定义时初始化不可靠,需要在CPU初始化后单独初始化一次;
2,全局变量数组 ...

xdata变量赋初值必须在初始化以后,可以用idata;数组越界是什么意思?是不是变量类型错了
回复

使用道具 举报

23

主题

163

回帖

1793

积分

金牌会员

Rank: 6Rank: 6

积分
1793
发表于 2023-2-14 18:01:38 | 显示全部楼层

回帖奖励 +1 金钱

wsx 发表于 2022-7-22 09:31
问题原因:
1,迪文芯片在全局变量定义时初始化不可靠,需要在CPU初始化后单独初始化一次;
2,全局变量数组 ...

什么是迪文芯片在全局变量定义时初始化不可靠,从道理上来说这要是不可靠任何事都甭做了,能说细一些吗,让我们也免得入坑。
回复

使用道具 举报

0

主题

10

回帖

333

积分

中级会员

Rank: 3Rank: 3

积分
333
发表于 2023-2-15 09:19:38 | 显示全部楼层
楼主可以参考附件工程模板,芯片内部的全局变量肯定不会自己改变,多数都是工程设置不对或者代码的问题,楼主使用了memset和memcpy,得注意变量指针的问题和变量在哪个RAM区,或者是否释放了一些声明的内存段
回复

使用道具 举报

2

主题

1228

回帖

1万

积分

论坛元老

Rank: 8Rank: 8

积分
10485
发表于 2023-2-16 11:43:27 | 显示全部楼层
nearsea 发表于 2023-2-14 18:01
什么是迪文芯片在全局变量定义时初始化不可靠,从道理上来说这要是不可靠任何事都甭做了,能说细一些吗, ...

全局变量的初始化顺序是不确定的,特别是在不同的编译单元中,可能会出现依赖性的问题。例如,如果你在一个文件中定义了一个全局变量a,并给它赋了一个初始值,然后在另一个文件中定义了一个全局变量b,并用a的值来初始化它,那么你不能保证b的值一定是正确的,因为你不知道a和b的初始化顺序是怎样的。
全局变量的初始化也可能会抛出异常,而这些异常是无法捕获的,可能会导致程序崩溃或者其他不可预知的后果。
全局变量的初始化还可能会和其他的符号冲突,因为编译器会给初始化的全局变量分配一个强符号,而未初始化的全局变量分配一个弱符号。连接器在连接目标文件的时候,会根据一定的规则来处理重名的符号,可能会覆盖或者忽略一些符号,造成逻辑错误或者链接错误。
所以,为了避免这些问题,建议你尽量减少全局变量的使用,特别是那些需要复杂初始化的全局变量。如果你必须使用全局变量,那么你应该在程序的入口点,也就是main函数中,对它们进行初始化,而不是在定义的时候就初始化。这样可以保证全局变量的初始化顺序是确定的,也可以捕获可能的异常,也可以避免符号冲突的问题。
相关信息可以参考互联网:https://blog.csdn.net/weixin_43109231/article/details/112710864
回复

使用道具 举报

23

主题

163

回帖

1793

积分

金牌会员

Rank: 6Rank: 6

积分
1793
发表于 2023-2-16 14:19:25 | 显示全部楼层
zzs999k 发表于 2023-2-16 11:43
全局变量的初始化顺序是不确定的,特别是在不同的编译单元中,可能会出现依赖性的问题。例如,如果你在一 ...

看了您链接的例子,只能说明在变量声明的时候初始化,会增加代码量而不是代码错误。

对于C语言来说,全局变量声明时赋值确实应该用常量比较妥当一些,因为我自己一般不在全局声明的同时在用一个变量去赋值,所以也没发现您描述的问题,这个抽空可以做一个重复验证的程序来测试,一般来说编译器那么程序,这种BUG还是不应该存在的。
回复

使用道具 举报

2

主题

1228

回帖

1万

积分

论坛元老

Rank: 8Rank: 8

积分
10485
发表于 2023-2-16 15:15:12 | 显示全部楼层
需要
EA = 0;
        RS0 = 0;
        RS1 = 0;

        CKCON = 0x00;
        T2CON = 0x70;
        DPC = 0x00;
        PAGESEL = 0x01;
        D_PAGESEL = 0x02; //DATA RAM  0x8000-0xFFFF
        //MUX_SEL = 0x00;   //UART2,UART3关闭,WDT关闭
        RAMMODE = 0x00;
        PORTDRV = 0x01;   //驱动强度+/-8mA
        IEN0 = 0x00;      //关闭所有中断
        IEN1 = 0x00;
        IEN2 = 0x00;
        IP0 = 0x00;       //中断优先级默认
        IP1 = 0x00;
后才能初始化哦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-7-13 00:29 , Processed in 0.033800 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表