cortex-m0非对齐访问引发的问题分析

在将国产实时操作系统djyos移植到基于Cortex-M0的ZQ1201芯片过程中,遇到程序因非对齐地址进入异常的情况。问题源于一个枚举类型的变量被错误地以4字节对齐方式访问。解决方案是使用4字节对齐的变量传递参数,确保地址正确对齐,从而避免在Cortex-M0上出现的非对齐访问异常。请注意,从Cortex-M3开始,ARM处理器已支持非对齐访问。
摘要由CSDN通过智能技术生成

移植国产实时操作系统djyos到国产芯片ZQ1201(内核cortex-m0)时,程序会进入异常,后来在跟代码的时候发现,在获取事件参数的时候,用来存事件参数的地址是非对齐的,地址为0x10038eb。
这里写图片描述
后来发现该参数是用枚举声明的,该枚举的原型如下:
enum __shell_mode
{
dbug = 1,
normal
};
因为该枚举里面就2个数,1和2 。所以mode的数据类型是1字节的。这个类型是由编译器分配的,编译器会分配给mode一个够用的数据类型,因为枚举里只有1和2,所以1字节是足够用的。如下图所示:
这里写图片描述
再执行Djy_GetEventPara时把mode的地址强制转换为了ptu32_t的类型,因为mode是1字节的数据类型,在1字节的类型地址强制转换成4字节的类型地址时,就有可能产生这种非对齐地址的现象。
解决方法如下图:
这里写图片描述
用一个ptu32_t类型定义的参数param的地址传给函数Djy_GetEventPara,param的地址一定是4字节对齐的,所以再给Djy_GetEventPara用时,就不会再出现原来的异常了。
特别提醒,该代码是在cortex-m0上出的问题,从cortex-m3开始,arm已经支持非对齐访问,不会出异常的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值