[STC单片机]

求助一个百思不得姐的怪异变量名问题

[复制链接]
1921|44
手机看帖
扫描二维码
随时随地手机跟帖
linxi6414|  楼主 | 2020-3-31 15:10 | 显示全部楼层 |阅读模式
本帖最后由 linxi6414 于 2020-3-31 15:18 编辑

一个工控电路,分面板和主板,系统上电后,面板要将设置参数通过485总线发送给主板,其中一个变量为电机过流计数,数字为3-20可调整的参数,变量名为:SYS_Over_Current_Count,每次主板接收到这个面板来的变量后,将主板的SYS_Over_Current_Count等于其中的一个接收缓冲,用串口监控发现,SYS_Over_Current_Count也确实被改更新了,可是更新后立马就变成0了,找了半天也找不出问题,然后换个变量名,立马就正常了,现在的变量名为:SYS_Overload_Count,只要换回SYS_Over_Current_Count这个变量名,立马就不行,目前程序还在调试阶段,SYS_Over_Current_Count这个变量名只在485子程序里有这个变量,其它的子程序里并没有这个变量,这个变量也没有其它地方引用,真的搞不懂了。
最后说一下,485有CRC校验,用逻辑分析仪分析,收发都是正常的,问题出在主板上。

使用特权

评论回复
评论
xch 2020-4-1 19:55 回复TA
编译器支持多长变量名? 找找看前16个字母==SYS_Over_Current 的变量。 

相关帖子

叶春勇| | 2020-3-31 15:39 | 显示全部楼层
在SYS_Over_Current_Count 定义处定义SYS_Overload_Count就没事了?

使用特权

评论回复
linxi6414|  楼主 | 2020-3-31 16:00 | 显示全部楼层
本帖最后由 linxi6414 于 2020-3-31 16:02 编辑
叶春勇 发表于 2020-3-31 15:39
在SYS_Over_Current_Count 定义处定义SYS_Overload_Count就没事了?

是的。
//unsigned char xdata SYS_Over_Current_Count=0;//过流计数
unsigned char xdata SYS_Overload_Count=0;//过流计数
里面有几十个变量参数,唯独这个出问题,其它的都是正常的。

使用特权

评论回复
叶春勇| | 2020-3-31 16:43 | 显示全部楼层
linxi6414 发表于 2020-3-31 16:00
是的。
//unsigned char xdata SYS_Over_Current_Count=0;//过流计数
unsigned char xdata SYS_Overload_C ...

目前能看到的改进点就是加volatile ,其他的想不出来了

使用特权

评论回复
ayb_ice| | 2020-3-31 17:08 | 显示全部楼层
叶春勇 发表于 2020-3-31 16:43
目前能看到的改进点就是加volatile ,其他的想不出来了

这种变量的写要特别注意,如果在多处改写,改写时应该满足原子操作(比如禁止中断)

使用特权

评论回复
叶春勇| | 2020-3-31 18:17 | 显示全部楼层
ayb_ice 发表于 2020-3-31 17:08
这种变量的写要特别注意,如果在多处改写,改写时应该满足原子操作(比如禁止中断) ...

我玩状态机,不玩操作系统,这种问题不容易出现。虽然多个状态可修改,但是同一时间只有一个状态。

使用特权

评论回复
ayb_ice| | 2020-4-1 08:26 | 显示全部楼层
叶春勇 发表于 2020-3-31 18:17
我玩状态机,不玩操作系统,这种问题不容易出现。虽然多个状态可修改,但是同一时间只有一个状态。 ...

有没有通过主循环和中断中同时修改?

使用特权

评论回复
21ic小喇叭| | 2020-4-1 10:33 | 显示全部楼层
您的问题引起大家积极讨论,奖励您100家园币,家园币可以兑换礼品或抽奖,欢迎体验~

使用特权

评论回复
linxi6414|  楼主 | 2020-4-1 16:35 | 显示全部楼层
ayb_ice 发表于 2020-4-1 08:26
有没有通过主循环和中断中同时修改?

没有,只在485子函数程序里有这个变量,其它地方没有这个变量,以后会在ADC子函数里调用,但是现在ADC部分还没有写。

使用特权

评论回复
ayb_ice| | 2020-4-1 16:59 | 显示全部楼层
linxi6414 发表于 2020-4-1 16:35
没有,只在485子函数程序里有这个变量,其它地方没有这个变量,以后会在ADC子函数里调用,但是现在ADC部 ...

那就是被其它指针越界搞乱了

使用特权

评论回复
叶春勇| | 2020-4-1 18:43 | 显示全部楼层
ayb_ice 发表于 2020-4-1 08:26
有没有通过主循环和中断中同时修改?

你说的是核心点。
中断中塞入大堆程序,刚开始有这个毛病,后来学了消息机制,一般只玩标志位,在主循环处理这个标志。现在中断就几行代码。一般把中断作为消息来源,或者是状态机的输入。这样在一个状态下,消息处理是固定的。

使用特权

评论回复
linxi6414|  楼主 | 2020-4-1 19:50 | 显示全部楼层
叶春勇 发表于 2020-4-1 18:43
你说的是核心点。
中断中塞入大堆程序,刚开始有这个毛病,后来学了消息机制,一般只玩标志位,在主循环 ...

中断里有多个自减1的程序,
        if(Display_Recovery_Tim>0)
        {
                Display_Recovery_Tim--;
        }
这样的,变量都是char型的,共有11个,全部是一样的结构。

使用特权

评论回复
john_lee| | 2020-4-1 19:50 | 显示全部楼层
本帖最后由 john_lee 于 2020-4-1 19:54 编辑

有没有生成的map文件,发上来看看。

我能想到的可能是数据访问越界,误修改了这个变量,改成另外一个名字,link程序可能把变量又放在了另一个地址,避免了误修改,但越界总是存在的,修改了其它变量,只是现在还没有发现而已。

使用特权

评论回复
linxi6414|  楼主 | 2020-4-1 19:54 | 显示全部楼层
ayb_ice 发表于 2020-4-1 16:59
那就是被其它指针越界搞乱了

主板里没有用指针,只有面板程序里有用指针,与主板没有关系,用逻辑分析仪分析过面板发往主板的数据,也用主板的里的串口监控程序做过监控,证明面板发往主板的数据是正常的,问题出在主板上,就是知道问题出在哪里,现在只是通过更换变量名的方式跳过问题,只是感觉这个问题太诡异。

使用特权

评论回复
linxi6414|  楼主 | 2020-4-1 20:03 | 显示全部楼层
john_lee 发表于 2020-4-1 19:50
有没有生成的map文件,发上来看看。

我能想到的可能是数据访问越界,误修改了这个变量,改成另外一个名字 ...

MAP文件是什么文件?就算我把文件发给你,你也没有办法仿真啊,这东西上面发数据,下面接收到数据才能动作。

使用特权

评论回复
john_lee| | 2020-4-1 20:09 | 显示全部楼层
map文件是编译/链接后生成的内存布局文件,是个文本文件,里面有各个变量的实际地址。
你查查你的编译工具手册,看看如何生成map文件。

使用特权

评论回复
john_lee| | 2020-4-1 20:12 | 显示全部楼层
通过这个文件,我能知道发生错误的变量的上个地址是哪个变量,可能正是由于该变量的访问越界,造成了错误。

使用特权

评论回复
linxi6414|  楼主 | 2020-4-1 20:16 | 显示全部楼层
本帖最后由 linxi6414 于 2020-4-1 20:18 编辑
john_lee 发表于 2020-4-1 20:09
map文件是编译/链接后生成的内存布局文件,是个文本文件,里面有各个变量的实际地址。
你查查你的编译工具 ...

我用的是KEIL4
1585743443(1).png

使用特权

评论回复
john_lee| | 2020-4-1 20:25 | 显示全部楼层
你最好把两个变量名:SYS_Over_Current_Count 和 SYS_Overload_Count 都编译生成各自的map文件

使用特权

评论回复
linxi6414|  楼主 | 2020-4-1 21:04 | 显示全部楼层
本帖最后由 linxi6414 于 2020-4-2 13:36 编辑

搞出来了。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

576

帖子

3

粉丝