首页 » 互联网 » 小心stm32一个的强制类型转换去世机他可能让你付出了惨痛的价值~_字节_指令

小心stm32一个的强制类型转换去世机他可能让你付出了惨痛的价值~_字节_指令

雨夜梧桐 2024-12-20 01:10:49 0

扫一扫用手机浏览

文章目录 [+]

售后 : X工,现场出大事了,本日升级的程序跑着跑着就挂了!
现在全体产线都等着这个设备规复,能安排个人过来增援下吗?X工 : my god !
别慌,我问一下卖力的A工。
X工 : 喂,A工,昨天升级的程序有问题,程序卡去世,售后在现场你联系一下,增援他一波,顺便把程序发送给我一份,一起看看!
A工 : 啊,还有这种事,程序没改什么呀,行,我跟售后联系一下。

经由一番折腾,创造由于程序测试不到位,导致了一个逼迫类型转化引发的进入非常,这里就分享给大家。

2、bug演示

小心stm32一个的强制类型转换去世机他可能让你付出了惨痛的价值~_字节_指令 互联网

这是一个老项目,采取stm32F4芯片为主控,由于硬件限定而客户又不愿意花大价钱改造,以是程序架构等等都没有再大动作,由于通信上的传输和解析都是字节流,一些小的需求都只是在原来的通信架构上把4个字节拆成2个字节来用,然而这一次实在没办法没改吸收数据类型,然后把一个double类型拆成了4个uint16来利用,没想到出问题了。

以是这里大略的仿照演示了一下:

A工用一个double类型取地址,然后把地址逼迫转为uint64_t类型,以此类型指针取内容,当这段代码实行完程序就跳到了非常中断,导致去世机。

实在这段代码对付履历丰富的人来说,一看就以为很别扭,但是无论如何也不至于去世机呀,毕竟逼迫类型转化大部分人拿来都是随便用。

3、bug解读

当看到A工写的这一套代码,实在模糊约约就觉得这块有些问题,但是没敢确定,毕竟整套代码也是古人留下的,全是逻辑没什么精华也没有过细研究,末了看这段代码的汇编才知道问题所在。

实在问题就出在LDRD这个ARM汇编指令上,LDRD指令表示从指定内存地址取double word,上面图片代码中的LDRD R0,R1,[R2,#0x2EC],可以分解为下面两个ldr步骤 :

在ARM汇编指令集中LDRD和STRD是一对加载和提取指令,一样平常都须要利用__align(8)润色来担保数据工具进行8直接对齐,而利用#pragma pack(8)是来指定构造体成员变量相对付第一个变量的地址的偏移量的对齐办法。

__align指示编译器在 n 字节边界上对齐变量,是一个存储类润色符,当然也可以以让2字节的工具进行4字节对齐其与8字节对齐是等价的,一定要记得是存储的起始地址为8的整数倍。

对齐可以在一定程度长进步数据提取的效率,一旦起始地址没有对齐会导致对齐缺点,以是上面的double浮点类型的构造体变量没有8字节地址对齐,当进行逼迫类型转化并利用LDRD指令就导致未对齐故障。

3、更专业点

当然对付跳转到硬件非常的故障是非常好排查的,下面这篇文章教你如何迅速的定位故障位置和故障信息 :

对付非对齐指令的实行会导致指令用法上的故障,那么Cortex芯片中相应的故障寄存器标志位会置位。

以上来自于Cortex技能文档,文档中也写得非常的详细。

当CPU考试测验做一个未对齐的内存访问,然后就会发生此缺点。
特殊是对付未对齐的LDM/STM/LDRD/STRD指令,以是进入非常中断往后查询芯片内部故障寄存器也是可以找到问题所在的,对付利用仿真器排查是再大略不过了,如果是离线排查就须要进行上篇文章那样打印干系日志来定位问题。

版权归原作者所有。
如涉及作品版权问题,请联系我进行删除。

标签:

相关文章

语言区设计的演变与未来展望

语言是人类文明进步的重要标志,而语言区的设计作为语言学研究的重要领域,对于人类社会的沟通与发展具有重要意义。本文将从语言区设计的演...

互联网 2025-01-01 阅读0 评论0

语言发展简史,从混沌到文明的演变

自古以来,人类便与语言结下了不解之缘。从最初的混沌无序,到如今丰富多彩、博大精深的文明,语言的发展历程可谓是一部人类智慧的史诗。本...

互联网 2025-01-01 阅读0 评论0