移植国产实时操作系统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已经支持非对齐访问,不会出异常的。