Build started: Project: lsd *** Using Compiler 'V6.16', folder: 'D:\Users\Keil_v5\ARM\ARMCLANG\Bin' Build target 'Target 1' Start/core_cm3.c(445): error: non-ASM statement in naked function is not supported uint32_t result=0; ^ Start/core_cm3.c(442): note: attribute is here uint32_t __get_PSP(void) __attribute__( ( naked ) ); ^ Start/core_cm3.c(465): error: parameter references not allowed in naked functions "BX lr \n\t" : : "r" (topOfProcStack) ); ^ Start/core_cm3.c(461): note: attribute is here void __set_PSP(uint32_t topOfProcStack) __attribute__( ( naked ) ); ^ Start/core_cm3.c(479): error: non-ASM statement in naked function is not supported uint32_t result=0; ^ Start/core_cm3.c(476): note: attribute is here uint32_t __get_MSP(void) __attribute__( ( naked ) ); ^ Start/core_cm3.c(499): error: parameter references not allowed in naked functions "BX lr \n\t" : : "r" (topOfMainStack) ); ^ Start/core_cm3.c(495): note: attribute is here void __set_MSP(uint32_t topOfMainStack) __attribute__( ( naked ) ); ^ 4 errors generated. compiling core_cm3.c... ".\Objects\lsd.axf" - 4 Error(s), 0 Warning(s). Target not created. Build Time Elapsed: 00:00:00
时间: 2025-07-16 14:09:14 浏览: 13
<think>好的,我现在需要帮助用户解决在Keil编译STM32工程时遇到的core_cm3.c文件中的错误。用户提到的是裸函数(naked function)中不支持非汇编语句和参数引用的问题,引用了几个相关的资料。
首先,我要理解问题的根源。根据引用[2]和[3],错误信息是“non-ASM statement in naked function is not supported”,这通常是因为在裸函数中使用了非汇编语句或者引用了参数。裸函数应该完全由汇编指令构成,不能有C代码,否则编译器会报错。
接下来,用户提供的引用[3]提到将编译器版本从6改为5可以解决这个问题。这说明可能是编译器版本的问题,ARM Compiler 6(armclang)对裸函数的要求更严格,不允许在其中有任何C语句。因此,切换回版本5(armcc)可能绕过这个问题,但这不是长远之计,因为新版本编译器可能有其他优化和功能。
另一个解决方法是修改core_cm3.c文件中的相关函数。例如,找到报错的函数,将其内容替换为纯汇编或者删除不必要的C语句。比如,__get_PSP和__set_PSP这样的函数,可能需要用内联汇编重写。
另外,引用[4]提到无法打开RTE_Components.h文件,这可能和工程配置有关,但用户当前的问题集中在core_cm3.c的错误上,暂时可以忽略这个引用。
总结下来,用户需要两个步骤:一是更换编译器版本,二是修改代码中的裸函数部分。需要分步骤说明,确保用户能正确操作。同时,要提醒用户备份工程,避免修改出错。
可能还需要检查是否使用了正确的CMSIS版本,或者更新固件库,因为旧版本的core_cm3.c可能存在与新编译器不兼容的问题。但根据引用[3]的解决方案,直接修改编译器版本或代码更为直接。
最后,生成相关问题时要围绕编译器版本、裸函数使用、CMSIS兼容性等方面,帮助用户深入理解问题。</think>### 编译错误解决方案:ARM Compiler裸函数与非汇编语句冲突
#### 问题分析
在Keil工程中使用ARM Compiler(armclang)编译时,`core_cm3.c`文件中出现以下错误:
```
error: non-ASM statement in naked function is not supported
error: parameter references not allowed in naked functions
```
**根本原因**:
裸函数(`__attribute__((naked))`)要求函数体仅包含汇编指令,不能包含任何C代码或参数引用。新版本编译器(如ARM Compiler 6)对此检查更严格[^2][^3]。
---
#### 解决方法
##### 方案1:切换编译器版本
1. 打开Keil工程,进入`Project -> Options for Target -> Target`选项卡。
2. 将`Use default compiler version 6`改为**Version 5**(兼容性模式)[^3]。
3. 重新编译工程,验证错误是否消失。
**注意**:此方法可能牺牲新编译器优化特性,但能快速解决问题。
##### 方案2:修改`core_cm3.c`源码(推荐)
1. 定位报错函数(如`__get_PSP`或`__set_CONTROL`)。
2. 将函数体内的C语句替换为纯汇编实现。例如:
```c
__attribute__((naked)) uint32_t __get_PSP(void) {
__asm {
mrs r0, psp
bx lr
}
}
```
3. 删除所有参数引用或局部变量操作。
**注意**:需确保汇编指令与目标架构(Cortex-M3)兼容。
##### 方案3:更新CMSIS库
1. 从[STM32官方库](https://www.st.com/en/embedded-software/stm32-standard-peripheral-libraries.html)下载最新CMSIS包。
2. 替换工程中的旧版`core_cm3.c`和头文件。
3. 重新编译,检查是否仍存在裸函数语法问题。
---
#### 关键代码修改示例
以`__get_PSP`函数为例,修改前后对比:
**原始代码(报错)**:
```c
__attribute__((naked)) uint32_t __get_PSP(void) {
register uint32_t result;
__asm {
mrs result, psp
bx lr
}
}
```
**修正后代码**:
```c
__attribute__((naked)) uint32_t __get_PSP(void) {
__asm {
mrs r0, psp // 直接使用寄存器传递返回值
bx lr
}
}
```
---
阅读全文
相关推荐
















