OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3784|回复: 15

单片机跑飞,是什么原因造成的?

[复制链接]

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
发表于 2020-10-17 18:45:48 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 chenyuan 于 2020-10-20 09:23 编辑

今天碰到一个问题,我在1.c中定义了一个  uint32_t   CRC32[256];存放CRC的数据,大小为1024,然后我还定义了一些全局变量,如 uint32_t  ID,在一个函数中我定义了一些局部变量
  1. void function(void)
复制代码
然后我在这个1.c文件中又定义了一个  uint32_t   addr;并在在上面这个函数function引用了,之后进入调试发现跑飞了。
但是我将  uint32_t   addr; 这个变量定义到2.c文件中 ,然后在1.c中  extern uint32_t addr; 结果又没跑飞。
为了测试,我将在1.c中的  uint32_t  ID隐藏了,然后重新在1.c 中定义uint32_t   addr,结果没跑飞;
我以为是堆栈空间溢出,然后我修改
  1. Stack_Size                EQU     0x400

  2.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
  3. Stack_Mem       SPACE   Stack_Size
  4. __initial_sp


  5. ; <h> Heap Configuration
  6. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
  7. ; </h>

  8. Heap_Size      EQU     0x200

  9.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
  10. __heap_base
  11. Heap_Mem        SPACE   Heap_Size
  12. __heap_limit

  13.                 PRESERVE8
  14.                 THUMB
复制代码
修改将Stack_Size 0x400改成0x600,然后恢复1.c中定义的uint32_t addr,uint32_t  ID这两个变量,结果还是跑飞。

主要是这个问题:在1.c中定义了u32 CRC[256]和u32 addr;还有一些其他全局变量,运行时发现死机;
但是我将之前定义在1.c中的u32 addr定义到2.c中,然后在1.c中extern u32 addr;运行就不会死机......     不明白这是啥原因?

现在搞不懂是啥问题了?? 望大佬指点!!!



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2020-10-17 19:11:47 | 显示全部楼层
百分百的bug可以单步调试的
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-10-18 11:18:16 | 显示全部楼层
栈溢出的可能性很大
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2020-10-18 20:56:36 | 显示全部楼层
很有可能是大数组局部变量导致跑飞了。你得仔细检查程序才行。大数组必须定义成全局变量。仔细检查你跑飞的那个函数。
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-10-18 22:13:26 | 显示全部楼层
三叶草 发表于 2020-10-18 11:18
栈溢出的可能性很大

我刚开始也以为是栈溢出,但是我将栈空间由0x400改成0x600还是一样死机。。。所以有些疑惑
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-10-18 22:15:18 | 显示全部楼层
a5820736 发表于 2020-10-17 19:11
百分百的bug可以单步调试的

调试,他跑不起来,指向的地址是0xFFFFFFFF,或者有时跑着就进入了硬件中断错误
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-10-18 22:17:06 | 显示全部楼层
c2007s 发表于 2020-10-18 20:56
很有可能是大数组局部变量导致跑飞了。你得仔细检查程序才行。大数组必须定义成全局变量。仔细检查你跑飞的 ...

但是我将u32那个变量定义到另一个.c文件中,然后在这个.c中只是引用就不会跑飞
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-10-18 22:19:02 | 显示全部楼层
这个定义变量,跟.c文件有关吗??  是每次打开一个.c文件,栈空间就给了这个.c文件吗??
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-10-19 09:12:02 | 显示全部楼层
a5820736 发表于 2020-10-17 19:11
百分百的bug可以单步调试的

调试跑不起来,有时跑起来就进硬件错误中断了
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-10-19 09:14:16 | 显示全部楼层
三叶草 发表于 2020-10-18 11:18
栈溢出的可能性很大

这个栈空间是进入一个.c文件,然后他就重新占用栈空间吗?
而且我将栈空间大小从0x400改成0x600,还是跑飞
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-10-19 09:26:58 | 显示全部楼层
chenyuan 发表于 2020-10-19 09:14
这个栈空间是进入一个.c文件,然后他就重新占用栈空间吗?
而且我将栈空间大小从0x400改成0x600,还是跑 ...

并不是这个大小,比方说你定义了一个大小的数组,但是越界使用了就会出现问题
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-10-19 11:04:54 | 显示全部楼层
三叶草 发表于 2020-10-19 09:26
并不是这个大小,比方说你定义了一个大小的数组,但是越界使用了就会出现问题

不是很明白啥意思?是定义u8 asd[5],使用asd[5]吗?
还有为什么我在其他.c中定义一个变量,然后在这个.c中引用他就不会跑飞呢?
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-10-19 11:07:23 | 显示全部楼层
chenyuan 发表于 2020-10-19 11:04
不是很明白啥意思?是定义u8 asd[5],使用asd[5]吗?
还有为什么我在其他.c中定义一个变量,然后在这个.c ...

引用导致的问题?
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-10-19 11:54:53 | 显示全部楼层
三叶草 发表于 2020-10-19 11:07
引用导致的问题?

就我主题上说的,在1.c中定义了u32 CRC[256]和u32 addr;还有一些其他全局变量,运行时发现死机;
但是我将之前定义在1.c中的u32 addr定义到2.c中,然后在1.c中extern u32 addr;运行就不会死机......
不明白这是啥原因
回复

使用道具 举报

15

主题

109

帖子

0

精华

高级会员

Rank: 4

积分
614
金钱
614
注册时间
2014-8-14
在线时间
184 小时
发表于 2020-10-19 14:23:48 | 显示全部楼层
如果方便还是提供下代码,只言片语无法了解全貌
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-10-19 16:22:11 | 显示全部楼层
Cindre鞡 发表于 2020-10-19 14:23
如果方便还是提供下代码,只言片语无法了解全貌

代码的话,不好提供,公司代码
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 14:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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