[编译版本的问题v5/v6] ../CORE/core_cm3.c(445): error: non-ASM statement in naked function is not supported

博客主要讲述了STM32新建工程模板时,core_cm3.c文件出现4处错误的问题。具体错误信息给出,解答指出这是core_cm3.c与core_cm3.h版本问题,最简单的解决办法是将编译版本从V6改为V5。

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

问题:STM32  新建工程模板的过程中出现4处错误,关于这个文件的  core_cm3.c。具体错误见本文最下方。

解答:

这是   core_cm3.c  与  core_cm3.h   版本的问题,  目前最简单的办法是将编译版本从V6改为V5。

如下图

附件:

../CMSIS/CM3/core_cm3.c(445): error: non-ASM statement in naked function is not supported
  uint32_t result=0;
  ^
../CMSIS/CM3/core_cm3.c(442): note: attribute is here
uint32_t __get_PSP(void) __attribute__( ( naked ) );
                                          ^
../CMSIS/CM3/core_cm3.c(465): error: parameter references not allowed in naked functions
                  "BX  lr     \n\t" : : "r" (topOfProcStack) );
                                             ^
../CMSIS/CM3/core_cm3.c(461): note: attribute is here
void __set_PSP(uint32_t topOfProcStack) __attribute__( ( naked ) );
                                                         ^
../CMSIS/CM3/core_cm3.c(479): error: non-ASM statement in naked function is not supported
  uint32_t result=0;
  ^
../CMSIS/CM3/core_cm3.c(476): note: attribute is here
uint32_t __get_MSP(void) __attribute__( ( naked ) );
                                          ^
../CMSIS/CM3/core_cm3.c(499): error: parameter references not allowed in naked functions
                  "BX  lr     \n\t" : : "r" (topOfMainStack) );
                                             ^
../CMSIS/CM3/core_cm3.c(495): note: attribute is here

Start/core_cm3.c(499): error: parameter references not allowed in naked functions 499 | "BX lr \n\t" : : "r" (topOfMainStack) ); | ^ Start/core_cm3.c(495): note: attribute is here 495 | void __set_MSP(uint32_t topOfMainStack) __attribute__( ( naked ) ); | ^ /**************************************************************************//** * @file core_cm3.c * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Source File * @version V1.30 * @date 30. October 2009 * * @note * Copyright (C) 2009 ARM Limited. All rights reserved. * * @par * ARM Limited (ARM) is supplying this software for use with Cortex-M * processor based microcontrollers. This file can be freely distributed * within development tools that are supporting such ARM based processors. * * @par * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. * ******************************************************************************/ #include <stdint.h> /* define compiler specific symbols */ #if defined ( __CC_ARM ) #define __ASM __asm /*!< asm keyword for ARM Compiler */ #define __INLINE __inline /*!< inline keyword for ARM Compiler */ #elif defined ( __ICCARM__ ) #define __ASM __asm /*!< asm keyword for IAR Compiler */ #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */ #el
03-31
<think>好的,我现在需要解决用户遇到的关于core_cm3.c中裸函数参数引用导致的编译错误。首先,我得理解用户的问题。用户提到在Keil编译时出现错误,具体是core_cm3.c中的非汇编语句在naked函数中不被支持,错误出现在第445行。根据用户提供的引用资料,有几个可能的解决方法。 首先,我需要了解什么是naked函数。在ARM Cortex-M开发中,naked函数通常用于编写中断服务例程(ISR),这些函数不会由编译器生成通常的函数序言和结尾,因此需要开发者自己处理寄存器和堆栈。根据ARM文档,naked函数中只能包含内联汇编语句,任何C代码都会导致错误,因为编译器无法生成正确的代码。 用户提供的引用中提到了几种解决方案。引用[1]和[2]建议删除core_cm3.c或者替换为CMSIS标准接口的文件,这可能是因为core_cm3.c中的某些函数与头文件重复定义,导致冲突。引用[4]和[5]提到将编译器版本从V6降级到V5,因为V6可能更严格,导致兼容性问题。引用[3]则指出错误的具体位置和原因。 接下来,我需要评估这些解决方案的有效性和适用性。替换文件或禁用core_cm3.c可能需要用户更新CMSIS库,这需要一定的步骤,比如从STM32Cube获取最新文件。而修改编译器版本可能更直接,但可能会影响新特性的使用。用户可能需要根据项目需求选择合适的方法。 另外,用户的问题可能源于使用了不兼容的编译器版本和CMSIS版本。例如,Keil5.39默认使用V6编译器,而旧版CMSIS可能针对V5编写。这种情况下,修改编译器设置或更新CMSIS文件都是可行的。 还需要考虑用户的具体环境,比如使用的STM32系列和开发工具版本。如果用户无法轻易更换编译器版本,替换头文件和源文件可能是更好的选择。同时,检查core_cm3.c中的相关函数是否有参数引用,导致编译器无法处理,可能需要修改代码或使用汇编指令。 最后,综合所有引用信息,整理出步骤清晰的解决方案,确保用户能逐步操作,避免遗漏关键步骤。同时,生成相关问题,帮助用户进一步理解问题背景和可能的其他解决方案。</think>### 核心问题分析 裸函数(naked function)在ARM Cortex-M开发中常用于中断服务程序(ISR),其特点是不生成编译器自动添加的栈帧代码(prologue/epilogue)[^3][^5]。当在裸函数中引用参数时,若未完全通过汇编指令操作寄存器,编译器会因无法正确处理参数传递而报错`non-ASM statement in naked function`。此问题CMSIS库版本和编译器版本冲突直接相关[^2][^4]。 --- ### 分步解决方案 #### 方法1:**切换编译器版本(推荐)** 1. **打开Keil工程**,点击魔术棒图标进入`Options for Target` 2. 选择`Target`标签页,在`ARM Compiler`选项中将版本从`V6`改为`V5` 3. 重新编译工程,观察错误是否消失 **原理**:V6编译器对裸函数参数引用检查更严格,V5兼容旧版CMSIS库 #### 方法2:**更新CMSIS库文件** 1. 下载最新版`STM32Cube_FW`软件包(如STM32Cube_FW_F1_V1.8.5) 2. 替换以下文件到工程目录: - `Drivers/CMSIS/Include/core_cm3.h` - `Drivers/CMSIS/Include/core_cmFunc.h` - `Drivers/CMSIS/Include/core_cmInstr.h` - `Drivers/CMSIS/Include/cmsis_armcc_V6.h` 3. **停用旧版`core_cm3.c`**,改用标准CMSIS接口[^2] 4. 确保编译器仍使用V6版本 #### 方法3:**修改函数实现(高级)** 若需保留V6编译器,需手动修改`core_cm3.c`中的裸函数: ```c __attribute__((naked)) void FunctionName(uint32_t param) { __asm { // 直接通过寄存器操作参数(如R0) LDR R1, [R0] // 示例:读取参数值 BX LR } } ``` **注意**:需熟悉ARM汇编指令,避免直接操作C语言变量 --- ### 根本原因总结 CMSIS库中的`core_cm3.c`文件与Keil V6编译器存在兼容性问题,具体表现为: 1. V6编译器禁止在裸函数中使用C语句操作参数 2. 旧版CMSIS库未适配V6编译器的语法检查规则 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨熊猫115200

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值