keil5 使用compiler v6出现报错的问题

文章讲述了在从KeilV5升级到V6编译器后,由于新版本对旧的ST汇编文件如core_cm3.h的支持不足,导致出现大量与汇编相关的编译错误。建议继续使用V5版本或考虑Cubemx生成的新版本工程以解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

keil5 使用compiler v6出现报错的问题

使用V5版本的编译器,虽然编译较慢,但是不会出错

切换到V6编译器后,会出现大量错误,且发现这些错误都是和汇编语言有关

出现这个原因是因为新版本的arm编译器对旧的ST汇编文件不支持,这个core_cm3.h太老了,ST的底层文件没有更新,但是arm更新后对这个文件就不支持,目前没有找到解决方法,建议使用5版本编译,或使用cubemx生成的代码,生成后选择生成新版本的工程

如果你安装的版本没有V5,那就去ST官网上,下载MDK5,这样你的编译器里面就能使用5版本

### Keil 中 `sys.c` 文件报错解决方案 在使用 Keil 编译 STM32 的例程时,如果遇到 `sys.c` 文件中的内嵌汇编代码报错的情况,通常是因为编译器版本的变化导致语法不兼容。以下是详细的解决方法: #### 1. **确认编译器版本** Keil 提供了多个版本的 ARMCC 编译器,不同版本可能对内嵌汇编的支持有所不同。当前问题主要发生在使用 Arm Compiler v6 (armcc V6) 时[^2]。因此,建议先检查当前使用的编译器版本。 - 如果正在使用 armcc V6,则需要调整内嵌汇编的写法以适应新标准。 - 若希望继续沿用旧版语法,可以切换到 armcc V5 或更早版本。 #### 2. **修改内嵌汇编语法** 对于 armcc V6 而言,其对内嵌汇编的要求更加严格。原代码可能存在不符合新版编译器规范的地方。以下是一个常见的修正方式: 假设原始代码如下: ```c __asm void MSR_MSP(uint32_t mainstackpointer) { MSR MSP, r0 BX LR } ``` 针对 armcc V6 需要改为: ```c void MSR_MSP(uint32_t mainstackpointer) { __ASM volatile ( "MSR MSP, %0\n\t" "BX LR" : /* no output operands */ : "r"(mainstackpointer) /* input operand */ : "memory", "lr" /* clobbered registers */ ); } ``` 上述代码通过引入 GNU 风格的扩展内嵌汇编来适配新的编译器需求。注意以下几点: - 使用 `%0`, `%1` 等占位符表示输入参数。 - 显式声明寄存器冲突 (`clobber list`) 和内存影响 (`volatile`)。 #### 3. **启用兼容模式** 另一种快速解决问题的方法是让 armcc V6 启用与 V5 的向后兼容模式。可以在项目设置中添加以下选项: ```plaintext --cpu Cortex-M4 --apcs=interwork --asm_compat=v5 ``` 此配置强制编译器接受类似于 armcc V5 的内嵌汇编语法规则[^1]。 #### 4. **更新开发环境** 部分情况下,错误可能是由于工具链未完全匹配造成的。确保安装的是最新版本的 MDK(Keil Development Tools),并验证设备支持包(Device Support Pack)已更新至对应型号的最新版本。 --- ### 总结 通过对编译器版本的选择、内嵌汇编语法的规范化以及必要时开启兼容模式等方式,能够有效解决 Keil 在处理 `sys.c` 文件时报出的相关错误。最终目标是在满足现代编译器安全性和一致性要求的同时保留原有功能逻辑。 ```c // 修改后的示例代码片段 void MSR_MSP(uint32_t mainstackpointer) { __ASM volatile ( "MSR MSP, %0\n\t" "BX LR" : : "r"(mainstackpointer) : "memory", "lr" ); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值