CH32V307 将整型数字强制类型转换为指针导致芯片重启,看信息是因为地址不对齐

mepc :00000cfc

mcause:00000004

mtval :200049bb

typedef union { /* PRQA S 0750 */ /* MD_MSR_18.4 */

  /* There might be a loss of up to 3 bytes. */

  vuint8  b[ ((kXcpMaxCTO + 3) & 0xFFC)      ];

  vuint16 w[ ((kXcpMaxCTO + 3) & 0xFFC) / 2  ];

  vuint32 dw[ ((kXcpMaxCTO + 3) & 0xFFC) / 4 ];

} tXcpCto;

              vuint8 dd=CRO_SET_MTA_EXT;

              uint32_t dsd=&pCmd->dw[1];

              volatile vuint32 dr =(vuint32)pCmd->dw[1];

             // vuint32 cd = ApplXcpGetPointer(CRO_SET_MTA_EXT,CRO_SET_MTA_ADDR);

             // XcpSetMta((dr),CRO_SET_MTA_EXT);

              xcp.Mta = (unsigned char*)dr;

原因在于xcp.Mta = (unsigned char*)dr;这个代码里,pCmd->dw[1]=0x20000084,

image.png

想咨询下CH32的字节对齐有没有什么编译器可以优化的?

结尾是4,看似是对齐到4字节了。看下反汇编后0x00000cfc处的load指令内存地址是什么?


image.png


typedef union { /* PRQA S 0750 */ /* MD_MSR_18.4 */

  /* There might be a loss of up to 3 bytes. */

  vuint8  b[ ((kXcpMaxCTO + 3) & 0xFFC)      ];

  vuint16 w[ ((kXcpMaxCTO + 3) & 0xFFC) / 2  ];

  vuint32 dw[ ((kXcpMaxCTO + 3) & 0xFFC) / 4 ];

} tXcpCto;

const tXcpCto* pCmd = (const tXcpCto*) pCommand; /* PRQA S 0310 */ /* MD_Xcp_0310 */


              vuint8 dd=CRO_SET_MTA_EXT;

              uint32_t dsd=&pCmd->dw[1];

              volatile vuint32 dr =(vuint32)pCmd->dw[1];

             // vuint32 cd = ApplXcpGetPointer(CRO_SET_MTA_EXT,CRO_SET_MTA_ADDR);

             // XcpSetMta((dr),CRO_SET_MTA_EXT);

              xcp.Mta = (unsigned char*)dr;


奇怪为什么地址是奇数pCmd->dw[1];image.png



image.png

pCmd结构体变量地址是奇数


你可以使用attribute对齐方式将结构体按4字节对齐试一下,之前遇到过类似问题,按4字节对齐可以解决


试试在数组定义前加__attribute__((__aligned__(4))修饰,给他对齐到4字节(机器字宽)看看?


很明显,你应该继续追溯到 pCommand 的赋值啊。然而并没有看到这方面的任何信息。


另外调试阶段使用 -Og 甚至 -O0 比较合适,从反汇编看你开了 -Os 或者 -O2、-O3 才是?


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