搜索
bottom↓
回复: 21

单片机数组写越界会死机,读越界为什么也会死机

[复制链接]

出0入0汤圆

发表于 2024-1-16 14:05:46 | 显示全部楼层 |阅读模式
一直以为都以为单片机数组读越界不会死机,只有写越界才会死机,但有一个程序不小心读越界了,才发现这个问题。

出0入93汤圆

发表于 2024-1-16 14:27:41 | 显示全部楼层
别问死不死机了,不管读写都不要越界就是了

出0入0汤圆

发表于 2024-1-16 14:41:47 | 显示全部楼层
可能读到了不该读的地址,或者不是越界本身引起的,而是读到的数据引起的死机

出0入16汤圆

发表于 2024-1-16 14:57:13 | 显示全部楼层
读到的数据是不确定的,把不确定的数据拿去使用导致的死机

出0入475汤圆

发表于 2024-1-16 15:00:47 来自手机 | 显示全部楼层
很多8位机不会有这个问题,
好像就是高级一些的芯片才会这样,

出0入18汤圆

发表于 2024-1-16 15:45:08 | 显示全部楼层
读到了不允许读的区域,hadfault了

出0入42汤圆

发表于 2024-1-16 17:14:55 | 显示全部楼层
仅仅越界到周围读取不会死机吧,又没有段错误。 要么数据异常业务逻辑飞了,或者地址飞到不存在的地方了

出1310入193汤圆

发表于 2024-1-16 19:28:44 来自手机 | 显示全部楼层
越界,野指针。
有时候查找起来很熬人

出0入0汤圆

发表于 2024-1-17 00:01:41 来自手机 | 显示全部楼层
movc与movx是操作不同的区域呀,为什么会越界?

出0入8汤圆

发表于 2024-1-17 10:12:24 | 显示全部楼层
会不会死机 的看 读到的是啥    出啥问题都可能

出0入0汤圆

发表于 2024-1-17 11:50:42 | 显示全部楼层
读到超过ram实际地址范围

出20入186汤圆

发表于 2024-1-17 11:50:55 | 显示全部楼层
这算啥,有时候不对齐访问死机才难找呢

出0入0汤圆

发表于 2024-1-17 14:18:51 | 显示全部楼层
yuyu87 发表于 2024-1-17 11:50
这算啥,有时候不对齐访问死机才难找呢
(引用自12楼)

细说一下。这个是指结构体没有自动对齐吗

出0入475汤圆

发表于 2024-1-17 14:40:54 来自手机 | 显示全部楼层
yuyu87 发表于 2024-1-17 11:50
这算啥,有时候不对齐访问死机才难找呢
(引用自12楼)

哈哈,这个我以前从来不知道对齐是啥意思,
前段时间从8位机移植个函数到M0芯片,结果那个写flash的总是死机,找了很久,有时候随便增减一句代码就对了,稍微一改就错了,原来是地址指针随着代码的变动,一会是4的整倍数(对齐了),一会不是4的整倍,所以就出错
发现函数的问题后再去看芯片手册才知道需要4字节对齐,
以前玩8未机从来就没有这个概念。。。

出0入22汤圆

发表于 2024-1-17 16:02:13 | 显示全部楼层
爱晴海玩偶 发表于 2024-1-17 14:18
细说一下。这个是指结构体没有自动对齐吗
(引用自13楼)

比如你有一个指针
(unsigned char*) a=0x0000;
你只能访问 a+4,a+8,a+12,a+16这种4的整数倍的地址的数据
当如果你访问a+3的时候,哦豁。
这就是对齐。

出0入475汤圆

发表于 2024-1-17 17:04:54 来自手机 | 显示全部楼层
zxq6 发表于 2024-1-17 16:02
比如你有一个指针
(unsigned char*) a=0x0000;
你只能访问 a+4,a+8,a+12,a+16这种4的整数倍的地址的数据

(引用自15楼)

对的,就是这样,我用的那个芯片读写flash不能读到非4的整倍数的地址,读就是系统硬件错误,

出0入0汤圆

发表于 2024-1-17 18:41:25 | 显示全部楼层
zxq6 发表于 2024-1-17 16:02
比如你有一个指针
(unsigned char*) a=0x0000;
你只能访问 a+4,a+8,a+12,a+16这种4的整数倍的地址的数据
(引用自15楼)

这种只针对芯片手册明确说明的才会出现吧。一般的芯片内部的ram区不会存在这个问题吧。

出0入18汤圆

发表于 2024-1-17 19:21:43 来自手机 | 显示全部楼层
m4内核可以非对齐访问,m0不行

出0入22汤圆

发表于 2024-1-19 14:32:45 | 显示全部楼层
爱晴海玩偶 发表于 2024-1-17 18:41
这种只针对芯片手册明确说明的才会出现吧。一般的芯片内部的ram区不会存在这个问题吧。 ...
(引用自17楼)

内存也不一定。比如有些外扩的SRAM,是没有ADDR0的,这样你访问奇数地址的数据就会出错。

出0入0汤圆

发表于 2024-2-16 16:47:52 | 显示全部楼层
应该是对齐问题,检查一下HF的故障内容

出0入31汤圆

发表于 2024-2-16 20:46:12 | 显示全部楼层
这个问题很复杂,读写越界要看怎么越界了,也不一定非死机,还要看处理器是怎么设计的,总之一言难尽啊!

出0入217汤圆

发表于 2024-2-20 10:05:39 | 显示全部楼层
要看具体单片机,象瑞萨的MCU有内存保护的,读了未过赋值的RAM也会死机
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 04:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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