OpenEdv-开源电子网

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

stm32下的ucos与内存的关系

[复制链接]

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2016-1-26
在线时间
149 小时
发表于 2016-7-15 14:46:09 | 显示全部楼层 |阅读模式
5金钱
前段时间发过一个关于stm32+ucos进入hard fault的帖子,没人回我,自己后来调试后找到问题报告为:试图切入arm状态。本人在排查过程中发现了问题所在,但是不知道该怎么解释这个问题,而且解决办法也不是很标准,求懂的人解释一下原因和解决办法。
问题描述:
声明了一个unsigned int A[8]数组,在某个函数中使用时出错进入hardfalut状态。
在这个数组前面再申明一个unsigned  int数组  当数组大于等于3的时候系统可以跑了。
当我将数组声明为unsigned  int A[11],而不对数组前三个操作时,系统也正常。
分析原因:
此数组在内存中的物理地址与cpu处理地址的对齐方式是不是存在着某种牵连导致了数组不能正常被使用。

在此欢迎大家讨论!

最佳答案

查看完整内容[请看2#楼]

给的代码里面更该过,我没注意看确实没有,我试试剥离其他工作。还有就是忘了说,这个没有在ucos下跑,只是跑逻辑的时候是没有问题的!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2016-1-26
在线时间
149 小时
 楼主| 发表于 2016-7-15 14:46:10 | 显示全部楼层
ysq7120 发表于 2016-7-19 11:12
并没有什么buf+i。这个问题我还是觉得是别的问题引起的。你如果要说明这个问题存在,就必须剥离其他工作, ...

给的代码里面更该过,我没注意看确实没有,我试试剥离其他工作。还有就是忘了说,这个没有在ucos下跑,只是跑逻辑的时候是没有问题的!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165225
金钱
165225
注册时间
2010-12-1
在线时间
2107 小时
发表于 2016-7-15 22:10:19 | 显示全部楼层
看你怎么用这个数组的了。。。用了sprintf这些东西没有?
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2016-1-26
在线时间
149 小时
 楼主| 发表于 2016-7-18 10:52:09 | 显示全部楼层
正点原子 发表于 2016-7-15 22:10
看你怎么用这个数组的了。。。用了sprintf这些东西没有?

没有,这个数组是用于接收AD采集数据的数组,周末看到cortex-M3使用指南里面提到过一个问题:"寄存器的岀栈和压栈操作永远都是4字节对齐的----也就是说他们的地址必须是0x04,0x08,0x0C,·····",原子哥我在想会不会跟这个有关系。
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-7-18 17:35:18 | 显示全部楼层
操作越界了吧。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2016-1-26
在线时间
149 小时
 楼主| 发表于 2016-7-18 17:41:13 | 显示全部楼层
ysq7120 发表于 2016-7-18 17:35
操作越界了吧。

对数组操作的指针是没有越界的!
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-7-19 08:39:49 | 显示全部楼层
无休 发表于 2016-7-18 17:41
对数组操作的指针是没有越界的!

一般出现这种越界可能机会大,或者有些指针没有初始化,野指针。
至于你说的对齐,你可以把数组添加__align(4)进行对齐试试就知道了,我觉得不是。
项目里int各种数组多着呢,也没遇到你的情况。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2016-1-26
在线时间
149 小时
 楼主| 发表于 2016-7-19 09:32:18 | 显示全部楼层
ysq7120 发表于 2016-7-19 08:39
一般出现这种越界可能机会大,或者有些指针没有初始化,野指针。
至于你说的对齐,你可以把数组添加__al ...

我在调试过程中也排除了指针没有初始化,野指针等情况,关于指针操作地址对齐这一块不懂,但是__align的操作对于一个数组来说是不是意义不大,只有在结构体等复杂的组合才会体现出对齐的作用。反正我没能理解在前面多增加三个数组量就没有进入hardfalut异常的原因
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2016-1-26
在线时间
149 小时
 楼主| 发表于 2016-7-19 09:36:22 | 显示全部楼层
ysq7120 发表于 2016-7-19 08:39
一般出现这种越界可能机会大,或者有些指针没有初始化,野指针。
至于你说的对齐,你可以把数组添加__al ...

stm32 ucosii   hard fault
http://www.openedv.com/forum.php ... 2&fromuid=47297
(出处: OpenEdv-开源电子网)
这个是我在找问题时描述的详细  有兴趣可以看一下
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-7-19 10:14:14 | 显示全部楼层
用斜体好难看啊。

你最后的描述是用个短的全局变量替换一个长的全局变量做参数就变正常了。好像跟你这里说的不一样。
在另外buf没有传递参数的样子,我怎么看起来一直在赋值buf[0]??
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2016-1-26
在线时间
149 小时
 楼主| 发表于 2016-7-19 10:26:27 | 显示全部楼层
ysq7120 发表于 2016-7-19 10:14
用斜体好难看啊。

你最后的描述是用个短的全局变量替换一个长的全局变量做参数就变正常了。好像跟你这里 ...

我替换掉是保留了之前那个数组的定义存在,并没有注释掉,函数把结构体首地址传过去了,并没有把整个数组传送过去,就是一个一个的进行赋值的这一段我跟踪调试过!
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-7-19 10:34:01 | 显示全部楼层
我都没看到你的buf有进行移动,而传递进来也就首地址,所以其实不是只操作第一个元素吗

你可以去掉硬件读取数据部分,直接用随机数赋值。然后模拟出问题的情况。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2016-1-26
在线时间
149 小时
 楼主| 发表于 2016-7-19 10:50:40 | 显示全部楼层
ysq7120 发表于 2016-7-19 10:34
我都没看到你的buf有进行移动,而传递进来也就首地址,所以其实不是只操作第一个元素吗

你可以去掉硬件 ...

不是有个(buf+i)嘛,用一个指向unsigned int类型的指针移动对一个数组进行赋值,我在那个函数里面直接赋值就是不进行移位什么的操作,都是异常,现在问题找到了,就是不知道该怎么理解这个问题和最好的解决办法!
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-7-19 11:12:02 | 显示全部楼层
并没有什么buf+i。这个问题我还是觉得是别的问题引起的。你如果要说明这个问题存在,就必须剥离其他工作,单独跑一个task,然后传递参数赋值看看。
我的项目160K左右,都没遇到unsigned int传递有问题。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-7-19 11:41:07 | 显示全部楼层
我在ucosiii下跑,没问题。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2016-1-26
在线时间
149 小时
 楼主| 发表于 2016-7-19 11:54:29 | 显示全部楼层
ysq7120 发表于 2016-7-19 11:41
我在ucosiii下跑,没问题。

只能说硬件这个环境太不可控了,现在我将工程还原已经不能捕获到那个异常了!
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2016-1-26
在线时间
149 小时
 楼主| 发表于 2016-7-19 11:57:27 | 显示全部楼层
ysq7120 发表于 2016-7-19 11:41
我在ucosiii下跑,没问题。

额不会玩这个帖子  最佳准备给你的,怎么就变成自己的了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-1 20:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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