D:\MDK5\Packs\ARM\CMSIS\5.8.0\CMSIS\Core\Include\cmsis_armcc.h(664): error: #247: function "__get_PRIMASK" has already been defined
这个错误是因为在你的代码中,函数“__get_PRIMASK”被定义了两次。这可能是由于在不同的头文件中重复定义了该函数导致的。为了解决这个问题,你需要找到重复定义的头文件并将其注释掉或删除掉。你也可以尝试使用条件编译来避免重复定义。具体来说,你可以在每个头文件中添加以下代码:
#ifndef FILENAME_H #define FILENAME_H
// your code here
#endif
其中__FILENAME_H__是一个唯一的标识符,可以是任何你想要的名称,只要它在每个头文件中都是唯一的即可。这样,当编译器遇到重复的头文件时,它将只编译其中一个,从而避免了重复定义的问题。
D:/mdk/ARM/CMSIS-DSP/1.14.2/Source/FilteringFunctions/arm_levinson_durbin_f16.c(243): error: redefinition of i
这个错误是由于在程序的某个地方重新定义了变量i。在C语言中,变量只能被定义一次,因此这里需要查找到程序中变量i的所有定义,并确认它们的作用域。通常情况下,这个错误会出现在变量被定义了多次的情况下,例如在多个文件中同时定义了一个全局变量。你可以尝试在程序中搜索变量i的所有定义,并找到重复定义的地方进行修改,或者将变量定义为局部变量来避免这个问题。
Build started: Project: Project *** Using Compiler '', folder: 'D:\k5\ARM\ARMCLANG\bin\' Build target 'STM32F4-Discovery' compiling stm32f4xx_hal_hcd.c... *** Error: CreateProcess failed, Command: '"D:\k5\ARM\ARMCLANG\bin\\ArmCC" --via "stm32f4-discovery\stm32f4xx_hal_hcd.__i"' compiling stm32f4xx_ll_sdmmc.c... *** Error: CreateProcess failed, Command: '"D:\k5\ARM\ARMCLANG\bin\\ArmCC" --via "stm32f4-discovery\stm32f4xx_ll_sdmmc.__i"' compiling stm32f4xx_hal_smartcard.c... *** Error: CreateProcess failed, Command: '"D:\k5\ARM\ARMCLANG\bin\\ArmCC" --via "stm32f4-discovery\stm32f4xx_hal_smartcard.__i"' compiling stm32f4xx_hal_dac.c... *** Error: CreateProcess failed, Command: '"D:\k5\ARM\ARMCLANG\bin\\ArmCC" --via "stm32f4-discovery\stm32f4xx_hal_dac.__i"' compiling stm32f4xx_hal_flash.c... *** Error: CreateProcess failed, Command: '"D:\k5\ARM\ARMCLANG\bin\\ArmCC" --via "stm32f4-discovery\stm32f4xx_hal_flash.__i"' compiling stm32f4xx_hal_tim.c... *** Error: CreateProcess failed, Command: '"D:\k5\ARM\ARMCLANG\bin\\ArmCC" --via "stm32f4-discovery\stm32f4xx_hal_tim.__i"' compiling stm32f4xx_hal_rtc_ex.c... *** Error: CreateProcess failed, Command: '"D:\k5\ARM\ARMCLANG\bin\\ArmCC" --via "stm32f4-discovery\stm32f4xx_hal_rtc_ex.__i"' compiling stm32f4xx_hal_can.c... *** Error: CreateProcess failed, Command: '"D:\k5\ARM\ARMCLANG\bin\\ArmCC" --via "stm32f4-discovery\stm32f4xx_hal_can.__i"' compiling stm32f4xx_hal_cryp_ex.c... *** Error: CreateProcess failed, Command: '"D:\k5\ARM\ARMCLANG\bin\\ArmCC" --via "stm32f4-discovery\stm32f4xx_hal_cryp_ex.__i"' compiling stm32f4xx_hal_cortex.c... *** Error: CreateProcess failed, Command: '"D:\k5\ARM\ARMCLANG\bin\\ArmCC" --via "stm32f4-discovery\stm32f4xx_hal_cortex.__i"' compiling stm32f4xx_hal_uart.c... *** Error: CreateProcess failed, Command: '"D:\k5\ARM\ARMCLANG\bin\\ArmCC" --via "stm32f4-discovery\stm32f4xx_hal_uart.__i"' compiling stm32f4xx_hal_dcmi.c... *** Error: CreateProcess failed, Command: '"D:\k5\ARM\ARMCLANG\bin\\ArmCC" --
首先,检查编译器路径是否正确。用户的项目可能配置了错误的ARMCC路径,尤其是在升级或更换了Keil版本后,路径中的版本号可能会有变化,比如从ARMCC换成ARMCLANG。需要确认Keil安装目录下是否存在正确的编译器路径,比如C:\Keil_v5\ARM\ARMCLANG\bin而不是ARMCC。
接下来,考虑权限问题。用户是否以管理员权限运行Keil?如果没有,可能需要右键以管理员身份启动。同时,检查输出目录的写入权限,有时候防病毒软件或系统设置会阻止程序生成文件,暂时关闭这些可能有助于排查。
然后,检查项目配置中的用户命令是否正确。在After Build步骤中,fromelf的命令行参数是否正确,特别是输出路径是否存在,是否包含非法字符或空格,需要用引号包裹路径。另外,检查Project.axf文件是否成功生成,如果编译未完成,这个文件可能不存在,导致fromelf失败。
还有可能是编译器组件损坏,比如fromelf.exe文件损坏。可以尝试重新安装ARM编译器工具链,或者修复Keil安装。另外,检查系统环境变量,确保没有冲突或错误的路径设置。
最后,考虑更新Keil和芯片支持包,确保所有组件都是最新版本,避免已知的兼容性问题。如果问题依然存在,查看Keil的构建日志,看是否有更详细的错误信息,或者尝试在命令行中手动执行fromelf命令,看是否能复现错误,从而进一步确定问题根源。
总结下来,解决步骤可能包括验证路径、检查权限、确认命令语法、确保文件存在、修复安装等。需要逐步排除这些可能性,找到具体原因后采取相应措施。### STM32F4 Discovery ARMCLANG编译器CreateProcess失败解决方案
1. 验证编译器路径有效性
- 检查Keil安装路径中的ARMCLANG编译器是否存在
- 默认路径应为:$C:\Keil_v5\ARM\ARMCLANG\bin$
- 确认路径中是否包含特殊字符(如空格或中文),建议使用纯英文路径[^1]
2. 配置用户权限
- 右键Keil选择"以管理员身份运行"
- 检查输出目录权限:
# 示例目录路径 ..\out\app-dw3000-v1.0.0.0.bin
- 临时关闭杀毒软件/防火墙(特别是实时文件保护功能)
3. 验证构建后命令
- 打开项目选项 → Output → After Build
- 确认fromelf命令格式:
# 正确格式示例 fromelf --bin -o "../out/app.bin" "./Objects/Project.axf"
- 使用双引号包裹含空格的路径参数
4. 检查工具链兼容性
- 确认使用的ARMCLANG版本支持STM32F4系列
- 更新步骤:
- Pack Installer → 检查CMSIS和Device Family Pack更新
- 升级到最新Keil MDK版本(建议v5.36+)
5. 修复工程配置
- 重新生成启动文件:
- 删除现有启动文件(startup_stm32f4xx.s)
- 通过CubeMX重新生成
- 清理并重建工程:
Project → Clean Targets Project → Rebuild All Targets
6. 替代解决方案
如果问题持续,可尝试:
- 手动生成bin文件:
fromelf --bin --output=Project.bin Objects/Project.axf
- 改用J-Link擦除芯片后重新烧录
- 创建新工程迁移源码
相关推荐
















