关于ch582m程序跑飞问题

最近在开发ch582m通过ble与上位机通信, 调试发现程序老是跑死导致单片机重启,最后定位到问题是我在定义通信消息的时候使用了 #pragma pack(push, 1)语句修改了数据对齐大小,然后使用u32方式访问未按四字节对齐地址的数据时就会出现重启;

? ?1. 想问一下这种操作是必定会导致错误,还是有什么方式可以优化呢;因为之前使用其他平台的单片机都是可以的;

? ?2. 我把#pragma pack(push, 1)屏蔽掉后,在simpleProfile_WriteAttrCB()回调里面调用一个自己编写的消息编码发送函数,上位机可以正常收到数据;但是我把这个函数放到Peripheral_ProcessEvent()函数里面新建了一个任务来编码发送,每次跑到编码的时候就会崩溃,hardfault中断打印内容如下图:原因是访问地址未对齐,产生异常操作的地址是6f80208f, 但是我看映射表里这个地址是保留区域;而且为什么不同地方调用会产生不同的效果;

image.pngimage.png


你好,对齐方式需要使用__attribute__来处理,不可以使用#pragma pack处理,如图参考:

image.png

Mtval指代的不一定是地址,可能是非法指令引起的异常,也可能是地址被篡改,然后往被篡改地址跳转导致的异常。这个需要查看具体的指令对照手册。

image.png

这里提供一份参考文档:

https://www.wch.cn/downloads/QingKeV4_Processor_Manual_PDF.html

 


我使用__attribute__(((aligned(1))))来修饰过后? 发送出去的数据还是没变化? 还是按照四字节对齐的呢,使用__attribute__((packed))就直接崩溃了


你好,我想问一下程序崩溃必定会进入hardfault中断吗


只有登录才能回复,可以选择微信账号登录