华芯微特开发论坛

 找回密码
 立即注册
搜索
热搜: SWM341 资料
查看: 2064|回复: 0

SWM341 USB 例程在 -Oz 优化等级时运行出错解决方法。。

[复制链接]

14

主题

61

帖子

789

积分

超级版主

Rank: 8Rank: 8

积分
789
发表于 2024-3-21 11:56:12 | 显示全部楼层 |阅读模式


把 SWM341 USB 例程的编译优化等级设为 -Oz 时,,程序执行会触发 HardFault。。调试定位到问题点如下图所示:

SWM341_USBD_memcpy.jpg

当前指令“STM r0!, {r3}”用于将 r3 的值存入 r0 中地址处。r0 中其实就是 destin 指针,,它的当前值是 0x200005DA,,可以看到该地址并非字对齐的,,而 STM 指令要求地址字对齐,,因此执行这条指令会导致 HardFault。。

SWM341 是 STAR-MC1 内核(Cortex-M33 等级),,它本身是支持非对齐访问的,,LDR、STR 指令支持非对齐访问,,LDM、STM 指令不支持。。

使用 -O1、-O2 优化等级编译程序时,,编译器为“*((__IO uint32_t *)destin) = *((__IO uint32_t *)source);”语句生成 LDR、STR指令,,程序可以正常执行。。而切换到 -Oz 优化等级时,,编译器为该语句生成 LDM、STM 指令(有点儿奇怪,,不明白这里读写一个寄存器,,为什么要使用 LDM、STM 指令),,因此就 HardFault 了。。

解决此问题最简单的方法就是,,对 SWM341_usbd.c 文件单独设定编译优化等级,,在该文件上右键选择 Options for File 'SWM341_usbd.c',,然后按照如下设置,,重新编译即可

SWM341_usbd.c.jpg


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|华芯微特开发论坛

GMT+8, 2025-1-10 06:46 , Processed in 0.034103 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表