[技术问答]

求助 新唐 MCU 内存数据全异常

[复制链接]
1059|10
手机看帖
扫描二维码
随时随地手机跟帖
vincero|  楼主 | 2017-10-17 21:25 | 显示全部楼层 |阅读模式
本帖最后由 vincero 于 2017-10-17 21:27 编辑

各路大神求助:
       遇到个棘手问题,单片机(M451VE6AE)在长时间运行比如一晚后,内存数据全错位异常了!
       用 图3 的办法仿真看到 MCU在运行,可以做断点,但 bool 型的变量出现了 int的数据、数组给值给不成功、看门狗没有触动。
       尝试过查数组溢出、整形变量溢出、指针乱指、改堆栈大小( Stack_Size      EQU     0x00000800),问题没有解决。
       请帮忙看下还有什么办法可以尝试?
luocx751_2017-10-17_210750.jpg

luocx751_2017-10-17_204642.jpg

luocx751_2017-10-17_210951.jpg


跟两个串口都移植的FreeModbus 有关不?
FreeModbusCommPC.zip (11.54 KB)
稳稳の幸福| | 2017-10-17 21:56 | 显示全部楼层
要看这个移植的东西有没有可能动到那个位置的内存。

使用特权

评论回复
vincero|  楼主 | 2017-10-18 08:58 | 显示全部楼层
稳稳の幸福 发表于 2017-10-17 21:56
要看这个移植的东西有没有可能动到那个位置的内存。

请问怎么看?

使用特权

评论回复
yiyigirl2014| | 2017-10-18 11:55 | 显示全部楼层
你这就错了,Bool类型,实际上在内存中是占位8BIT的,也就是相当于char类型。

使用特权

评论回复
yiyigirl2014| | 2017-10-18 11:55 | 显示全部楼层
并不是真实的1BIT。切记不要随便定义BOOL,特别是在单片机中。

使用特权

评论回复
yiyigirl2014| | 2017-10-18 11:56 | 显示全部楼层
如果定义了,不要对BOOl当做1BIT进行指针操作或者作为1BIT读写,你直接就当一个完整的变量操作就行了。

使用特权

评论回复
mxzwish| | 2017-10-18 11:57 | 显示全部楼层
在异常位置,例如你的那个结构体里面插入一个谁都不会使用的变量,例如
bool xxx;
int tripwire1;
bool xxx;

然后IDE调试运行,在tripwire1位置下硬件写入断点,然后继续跑一个晚上。
当有代码写入这个位置时就会断下来了。

使用特权

评论回复
mxzwish| | 2017-10-18 11:57 | 显示全部楼层
比较怀疑是你设置DMA操作、或memcpy,或memset等内存复制操作时,Size太大,把这个区域覆盖了。

使用特权

评论回复
vincero|  楼主 | 2017-10-19 10:10 | 显示全部楼层
yiyigirl2014 发表于 2017-10-18 11:56
如果定义了,不要对BOOl当做1BIT进行指针操作或者作为1BIT读写,你直接就当一个完整的变量操作就行了。 ...

谢谢回复。但是我知道C99 标准是支持bool (1bit)的,Keil - Project- Options for Taget-C/C++有个选项是C99 Mode,勾上就可以使用C99标准了。请看
C99的新关键字_Bool    (抱歉没权限发URL,请baidu下 )
另外还有:
C99的新特性                (抱歉没权限发URL)
但是我的问题不在这,是单片机内存数据全错误了,在运行,可是全部动作都是错的

使用特权

评论回复
vincero|  楼主 | 2017-10-19 10:14 | 显示全部楼层
mxzwish 发表于 2017-10-18 11:57
比较怀疑是你设置DMA操作、或memcpy,或memset等内存复制操作时,Size太大,把这个区域覆盖了。 ...

谢谢回复。
没有使用DMA,memcpy 和 memset 使用时都考虑了数组大小,像这样用的:
( void )memcpy( Unit.RecentErro, Eeprom.HistoryError, ARR_SIZE(Eeprom.HistoryError));
( void )memset( Unit.FatalErro,    0x00, ARR_SIZE( Unit.FatalErro ) );

我再试下您前一种办法

使用特权

评论回复
玛尼玛尼哄| | 2017-10-19 21:50 | 显示全部楼层
好奇怪,第一次见这种错误,编译器不可能错的这么离谱啊。

使用特权

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

本版积分规则

1

主题

17

帖子

2

粉丝