硬汉嵌入式论坛

 找回密码
 立即注册
查看: 609|回复: 18
收起左侧

[STM32H7] 又踩中一个坑

[复制链接]

7

主题

117

回帖

138

积分

初级会员

积分
138
发表于 2025-6-20 10:10:44 | 显示全部楼层 |阅读模式
H7果然很高端,把STM32F4上的程序移植上来跑着跑着死了,监控一看函数内部声明了一个uint32_t temp[2]的数组根本无效,只有temp[0]是对的,temp[1]不对,给这个元素赋值就进入MemManage_Handler了。然后把这个数组放到函数外面当全局的就正常,哪位大佬解释一下?
回复

使用道具 举报

4

主题

90

回帖

102

积分

初级会员

积分
102
发表于 2025-6-20 10:48:39 | 显示全部楼层
数组放在什么区域了?检查 MPU 配置,考虑背景区无特权级是否可访问问题,及变量对齐问题。
回复

使用道具 举报

4

主题

24

回帖

36

积分

新手上路

积分
36
发表于 2025-6-20 11:30:14 | 显示全部楼层
局部变量,肯定是放在栈里面啦,看看是不是栈大小配置太小了嘛
回复

使用道具 举报

7

主题

117

回帖

138

积分

初级会员

积分
138
 楼主| 发表于 2025-6-20 12:03:02 | 显示全部楼层
lyj41801 发表于 2025-6-20 11:30
局部变量,肯定是放在栈里面啦,看看是不是栈大小配置太小了嘛

还不清楚,但是应该不是这个问题,毕竟这个数组大小只有8个字节,栈我好像搞得挺大,应该还是访问权限的问题
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
发表于 2025-6-20 13:28:46 | 显示全部楼层
方便的话,稍贴点代码看下
回复

使用道具 举报

7

主题

117

回帖

138

积分

初级会员

积分
138
 楼主| 发表于 2025-6-20 17:09:29 | 显示全部楼层
本帖最后由 死不低头 于 2025-6-20 17:11 编辑
eric2013 发表于 2025-6-20 13:28
方便的话,稍贴点代码看下

简单点说就是4步,
1,找到需要提取uint8_t buff[256]数组的元素的起始地址s和个数n;
2,算出来最少用uint32_t 数组m个才能装得下,为了后面操作避免溢出加了个1,m=(n>>2)+1;
3,声明一个数组uint32_t temp[m],这里就不对了;
4,然后用memcpy(temp,&buff,n)。跑这个就进内存异常中断。
回复

使用道具 举报

7

主题

117

回帖

138

积分

初级会员

积分
138
 楼主| 发表于 2025-6-20 17:12:26 | 显示全部楼层
这帖子还能自动加工文字?最后一句memcpy(temp,&buff【s】,n)
回复

使用道具 举报

3

主题

38

回帖

47

积分

新手上路

积分
47
发表于 2025-6-20 20:17:06 来自手机 | 显示全部楼层
我怎么感觉memcpy(temp,&buff,n),&buff这样写会有问题?还是也可以有这种写法?
回复

使用道具 举报

3

主题

38

回帖

47

积分

新手上路

积分
47
发表于 2025-6-20 20:18:02 来自手机 | 显示全部楼层
memcpy(temp,&buff,n),可以这样写吗?我还不知道&buff
回复

使用道具 举报

4

主题

90

回帖

102

积分

初级会员

积分
102
发表于 2025-6-20 20:34:26 | 显示全部楼层
死不低头 发表于 2025-6-20 17:09
简单点说就是4步,
1,找到需要提取uint8_t buff[256]数组的元素的起始地址s和个数n;
2,算出来最少用 ...

第 3 步声明变长数组有啥不对?报硬件异常了吗?
回复

使用道具 举报

7

主题

117

回帖

138

积分

初级会员

积分
138
 楼主| 发表于 2025-6-20 20:39:22 | 显示全部楼层
Penguins 发表于 2025-6-20 20:34
第 3 步声明变长数组有啥不对?报硬件异常了吗?

这一步异常了,但是没进异常中断,我看当时情况是数组长度为2,temp[2],temp[0]是正常的,temp[1]里面数据不对,下面一句memcpy就内存错误异常了
回复

使用道具 举报

3

主题

91

回帖

100

积分

初级会员

积分
100
发表于 2025-6-20 20:41:12 | 显示全部楼层
声明一个数组uint32_t temp[m],m是变化的,你这样能编译通过就神奇了
回复

使用道具 举报

4

主题

90

回帖

102

积分

初级会员

积分
102
发表于 2025-6-20 21:43:35 | 显示全部楼层
死不低头 发表于 2025-6-20 20:39
这一步异常了,但是没进异常中断,我看当时情况是数组长度为2,temp[2],temp[0]是正常的,temp[1]里面数 ...

C 语言局部变量不指定初始值本来就不保证为 0,何来 temp[1] 数据不对一说?
回复

使用道具 举报

4

主题

90

回帖

102

积分

初级会员

积分
102
发表于 2025-6-20 21:46:46 | 显示全部楼层
way2888 发表于 2025-6-20 20:41
声明一个数组uint32_t temp[m],m是变化的,你这样能编译通过就神奇了

C99 标准支持变长数组,CubeMX 生成的工程默认就是 C99,编译通过很正常。但是要注意变长数组是放在栈上的,栈空间过小可能导致越界,且不会引起编译警告或错误。
回复

使用道具 举报

7

主题

117

回帖

138

积分

初级会员

积分
138
 楼主| 发表于 2025-6-21 00:13:34 | 显示全部楼层
spi-sd 发表于 2025-6-20 20:18
memcpy(temp,&buff,n),可以这样写吗?我还不知道&buff


memcpy(temp,&buff【s】,n),后面不是补充了?你看第4步,被论坛给自动优化掉了,我还编辑了几次
回复

使用道具 举报

7

主题

117

回帖

138

积分

初级会员

积分
138
 楼主| 发表于 2025-6-21 00:14:37 | 显示全部楼层
way2888 发表于 2025-6-20 20:41
声明一个数组uint32_t temp[m],m是变化的,你这样能编译通过就神奇了

不止能编译通过,还是从HC32F4A0工程跑了两周的程序呢
回复

使用道具 举报

0

主题

11

回帖

11

积分

新手上路

积分
11
发表于 2025-6-21 08:47:52 | 显示全部楼层
直接看汇编比较准
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2025-6-21 11:56:01 | 显示全部楼层
死不低头 发表于 2025-6-21 00:14
不止能编译通过,还是从HC32F4A0工程跑了两周的程序呢

说明你这个程序是用的c99标准
回复

使用道具 举报

7

主题

117

回帖

138

积分

初级会员

积分
138
 楼主| 发表于 2025-6-21 15:42:47 | 显示全部楼层
darthmike 发表于 2025-6-21 11:56
说明你这个程序是用的c99标准

是的,我记得我之前改过勾选C11标准,然后编译一堆错的,都在官方库函数里,马上又换回C99了
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 11:44 , Processed in 0.051357 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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