gpt4 book ai didi

CLion、CMSIS 和错误 : "expected identifier or ' (' before ' __asm'"

转载 作者:太空宇宙 更新时间:2023-11-04 01:53:17 25 4
gpt4 key购买 nike

我正在尝试为我的 Cortex-M0 嵌入式处理器设置 CLion C 工作环境。我是 CLion 和 cmake 的新手,我已经为这个问题苦苦挣扎了好几天:

问题出现在 CMSIS 中包含的 core_cm0.h 头文件中。更具体地说,在这些行:

#if   defined ( __CC_ARM )
#define __ASM __asm /*!< asm keyword for ARM Compiler */
#define __INLINE __inline /*!< inline keyword for ARM Compiler */
#define __STATIC_INLINE static __inline

我的项目非常小,只有一个带有 while(true) 循环的 main() 例程。当我尝试构建时,出现错误“预期标识符或‘(’在‘__asm’之前”。我还收到一堆类似的注释和警告,例如“警告:函数‘__nop’的隐式声明”。让我感到困惑的是最重要的是同一个项目在 Keil(我通常使用的 IDE)中编译得很好。所以我认为这可能是一些编译器特定的东西。或者它是 GNU 工具链处理内联汇编的方式的特殊之处吗?

这是我的 CMakeLists.txt :

cmake_minimum_required(VERSION 3.6)
project(Test3 C ASM)


INCLUDE(CMakeForceCompiler)
SET(CMAKE_SYSTEM_NAME Generic)
CMAKE_FORCE_C_COMPILER("C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/bin/arm-none-eabi-gcc.exe" GNU)


add_definitions(-DNRF51
-DBOARD_PCA10028
-D__CC_ARM)


set(SOURCE_FILES main.c)


include_directories(../../../components/drivers_nrf/hal)
include_directories(../../../components/device)
include_directories(../../../components/toolchain/CMSIS/Include)
include_directories(../../../components/toolchain)


add_executable(Test3 ${SOURCE_FILES})


SET(DEFINES_IN_FLAGS -DNRF51 -DBOARD_PCA10028 -DBSP_DEFINES_ONLY)
SET(COMMON_FLAGS "-mcpu=cortex-m0 -mthumb -mabi=aapcs --std=gnu99 -Werror -O0 -g3 -mfloat-abi=soft -ffunction-sections -fdata-sections -fno-strict-aliasing -fno-builtin --short-enums ")
SET(CMAKE_C_FLAGS "${COMMON_FLAGS} ${CMAKE_C_FLAGS}")
SET(CMAKE_ASM_FLAGS "${COMMON_FLAGS} ${CMAKE_C_FLAGS} -x assembler-with-cpp")
SET(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/default_linker_nrf51.ld)
SET(CMAKE_EXE_LINKER_FLAGS "-mcpu=cortex-m0 -Wl,-gc-sections -T --specs=nano.specs -lc -lnosys -mthumb -mabi=aapcs -L ${LINKER_SCRIPT} -Xlinker -Map=${LISTING_DIRECTORY}/${OUTPUT_FILENAME}.map")

这是我在 CLion 中的工具链设置: Toolchain

最佳答案

请注意,有问题的定义受 #if defined ( __CC_ARM ) 保护。

__CC_ARMan internal symbol defined by the ARM Compiler (这是 Keil 提供的),因此在您的 add_definitions 中手动定义它会导致代码使用一堆 GCC 无法理解的特定于 armcc 的语法和内置函数。

更一般地说,C 标准表示以双下划线开头的标识符是为实现(即编译器)保留的,因此如果您发现自己手动定义它们,则表明您可能做错了什么。

关于CLion、CMSIS 和错误 : "expected identifier or ' (' before ' __asm'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39295218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com