Windows18-HD19 系统兼容性问题导致 Keil 安装失败?

AI助手已提取文章相关产品:

在“Windows18-HD19”上装不上 Keil?别急,这事儿咱们慢慢拆

说实话,最近在帮一个客户调试国产化工控机开发环境的时候,又遇到了老熟人问题: Keil 死活装不上。

双击安装包,弹窗一闪而过;或者干脆报错“缺少 VCRUNTIME140.dll”,再不然就是静默退出、日志都没留下一行。更离谱的是系统名称叫什么——“Windows18-HD19”。一听就不是正经 Windows,像是哪个厂自己魔改的镜像版本。

这类问题其实每年都要碰上好几回,尤其是在电力、轨道交通、智能制造这些对安全性要求高的行业里。设备用的是飞腾、龙芯这类国产 CPU,操作系统也得跟着定制一套“硬核加固版”Windows。结果呢?安全是安全了,开发却寸步难行。

今天我们就来深挖一下:为什么这种“看起来像 Windows”的系统,偏偏跑不动 Keil?背后到底卡在哪几个技术点上?更重要的是—— 怎么绕过去?


一、Keil 不是你想装就能装的“普通软件”

先说个真相:很多人以为 Keil 就是个 IDE,跟 VS Code 差不多,解压即用。错得很彻底 ❌。

Keil MDK(Microcontroller Development Kit)本质上是一整套嵌入式开发工具链的大集合体,它包含:

  • uVision 图形界面(基于 WinForms)
  • Arm Compiler 编译器(ArmClang/ARMCC)
  • 调试驱动服务(如 ULINK Pro 的 keil_ulink.sys 内核驱动)
  • 设备支持包 DFP(Device Family Pack)
  • 许可证管理模块
  • USB 接口通信组件

换句话说,它不只是写代码的地方,还要能和硬件握手、加载驱动、启动子进程编译、注册系统服务……这就决定了它的安装过程远比你想象中复杂。

安装流程拆解:每一步都可能翻车 🛑

当你点下那个 MDK5xx.exe 安装程序时,背后其实发生了一系列关键动作:

  1. 环境预检
    检查 .NET Framework 版本、VC++ 运行库是否存在、是否有管理员权限。

  2. 临时解压与自启动
    安装包会把 MSI 或 InstallShield 引擎释放到 %TEMP% 目录,并尝试运行。如果 TEMP 路径没写权限?直接凉。

  3. 注册表写入
    写入软件路径、许可证信息、项目模板位置等。某些加固系统禁止非白名单程序修改注册表 HKEY_LOCAL_MACHINE?

  4. 服务注册
    注册 Keil 自带的调试服务(比如用于 JTAG 通信的服务),需要 SYSTEM 权限。组策略锁死了?拜拜了您嘞。

  5. 驱动安装
    最头疼的一环!Keil 带的 USB 驱动( .sys 文件)通常是未经过 WHQL 数字签名的老版本,现代 Windows 默认拒绝加载。

  6. 快捷方式创建 & 文件关联
    终于快完了……但如果桌面或开始菜单目录被锁定?图标建不上去, .uvprojx 打不开。

看到没?任何一个环节断掉,整个安装流程就会崩盘,而且往往只给你一句“错误代码 1603”完事。根本不知道到底是哪一步出的问题。


二、“Windows18-HD19”究竟是个啥?为什么这么难搞?

这个名字听起来就很可疑 —— “Windows18-HD19”。微软官方根本没有这个版本号 😵‍💫。

但结合上下文可以推测:这是某家 OEM 厂商基于 Windows 10 LTSC(长期服务版)深度定制的操作系统镜像,常见于国产 CPU 平台(如飞腾 Phytium、兆芯 ZX-C、龙芯 LoongArch)配套的工控主板。

命名逻辑可能是这样的:
- “18” 表示发布年份为 2018;
- “HD” 是 Hardened(加固)缩写;
- “19” 是内部版本号。

这套系统干了哪些“狠活”?我们来列个清单:

加固操作 对 Keil 的影响
使用 DISM 移除通用组件(Edge、Store、Cortana) 可能顺手删掉了 .NET Framework 或 VC++ 库
禁用 Windows Update 和自动重启 导致无法在线获取缺失依赖
启用强签名策略(Secure Boot + Driver Signature Enforcement) Keil 的旧驱动直接被拒之门外
锁定 Program Files 和 System32 写入权限 安装程序连文件都放不进去
关闭长路径支持(LongPathsEnabled = false) 工具链深层目录结构部署失败
部署主机入侵防御系统(HIPS)或行为监控引擎 拦截注册表修改、服务注册等“可疑行为”

简单讲,这套系统的设计目标是“稳如老狗”,而不是“兼容万物”。

所以你在上面跑 Office、浏览器没问题,但想装个开发工具?对不起,不在设计范围内。


三、实战排查:从无声崩溃到精准定位

我见过太多工程师在这类系统上反复重试安装,点了几十次“以管理员身份运行”还是失败,最后干脆放弃,换台电脑再说。

其实只要掌握正确的排查方法,很多问题都能快速定位。

第一步:别靠猜,要看日志!

Keil 安装失败后,第一件事不是重装,而是找日志。

默认情况下,Keil 安装程序会在以下路径生成日志文件:

%TEMP%\KeilInstall.log
%TEMP%\MDK_xxxx.log

如果你不确定有没有生成,可以在命令行手动加参数触发详细记录:

MDK538a.exe /LOG=C:\keil_install.log

然后观察输出内容。常见的关键错误有:

  • Failed to load VCRUNTIME140.dll → 缺少 Visual C++ 运行库
  • Error 1603: Fatal error during installation → 通常是因为权限不足或磁盘空间不够
  • LoadDriver failed: Invalid signature → 驱动签名验证失败
  • Access Denied when writing to HKLM\SOFTWARE → 注册表写入被拦截
  • Cannot extract files to temp directory → TEMP 目录无写权限

有了这些线索,你就不再是盲目试错了。

第二步:做个简单的预检脚本,提前发现问题

我在现场常备一个批处理脚本,叫 check_keil_env.bat ,专门用来扫雷:

@echo off
color 0a
title [Keil 环境检测工具] - by Embedded Expert 💡

echo.
echo ================================
echo  Keil MDK 安装前环境检测工具
echo ================================
echo.

:: 检查是否以管理员身份运行
net session >nul 2>&1
if %errorlevel% NEQ 0 (
    echo 🔴 错误:请右键选择【以管理员身份运行】此脚本!
    echo    否则无法检测关键系统权限。
    echo.
    pause
    exit /b 1
)

echo ✅ 管理员权限确认通过 ✔️

:: 检查 .NET Framework 4.8 是否存在
reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" /v Release | findstr /r "528040" >nul
if %errorlevel% EQU 0 (
    echo ✅ [.NET 4.8] 已安装 ✔️
) else (
    echo ⚠️  警告:未检测到 .NET Framework 4.8,建议立即安装!
    echo    下载地址:https://aka.ms/vs/17/release/vc_redist.x64.exe
)

:: 检查 VC++ 2015-2022 Redistributable
set "keys=HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64"
reg query "%keys%" /v Installed | findstr "0x1" >nul
if %errorlevel% EQU 0 (
    echo ✅ [VC++ 2015-2022 x64] 已安装 ✔️
) else (
    echo ⚠️  警告:缺少 VC++ 运行库,可能导致 VCRUNTIME140.dll 报错!
)

:: 检查 TEMP 目录权限
echo nul > "%TEMP%\test_write.tmp" 2>nul
if exist "%TEMP%\test_write.tmp" (
    del "%TEMP%\test_write.tmp"
    echo ✅ [%TEMP%] 目录可写 ✔️
) else (
    echo ⚠️  警告:当前用户无法写入临时目录,请检查权限设置!
)

:: 检查驱动签名状态
bcdedit /status | findstr /i "integrity" | findstr /i "off" >nul
if %errorlevel% EQU 0 (
    echo ✅ 驱动完整性检查已关闭(适合测试)✔️
) else (
    echo ⚠️  提示:驱动签名强制开启,Keil 驱动可能无法加载。
    echo    如需临时关闭,请运行:
    echo        bcdedit /set loadoptions DISABLE_INTEGRITY_CHECKS
    echo        bcdedit /set nointegritychecks on
    echo        重启生效 ⚠️
)

:: 检查杀软干扰(示例)
tasklist /fi "imagename eq avgnt.exe" | find /i "avgnt.exe" >nul
if %errorlevel% EQU 0 echo ⚠️  检测到 AVG 杀毒软件,可能阻止安装进程!

echo.
echo ================================
echo     检测完成 ✅
echo ================================
echo.
echo 💡 建议:
echo   1. 所有警告项请优先处理
echo   2. 在干净环境中先行测试安装流程
echo   3. 成功后制作系统快照备份
echo.
pause

这个脚本能帮你一次性看清所有潜在风险点。比起一次次试错重装,效率高太多了。


四、三大高频“坑位”及应对策略

根据我这几年在各种定制系统上的踩坑经验,下面这三个问题是导致 Keil 安装失败的“罪魁祸首”。

❌ 问题一:VCRUNTIME140.dll 找不到?

这是最典型的症状之一。双击安装包,弹窗提示:

“The program can’t start because VCRUNTIME140.dll is missing from your computer.”

原因分析
虽然名字叫“Visual C++ 运行库”,但它其实是 Keil 编译器(Arm Compiler 6)所依赖的核心动态库。而“Windows18-HD19”这类裁剪系统,为了节省空间,往往会删除所有非必要的运行时组件。

解决方案

✅ 手动安装最新版 VC++ Redistributable:

👉 下载地址:
https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist

务必同时安装 x86 和 x64 两个版本,因为 Keil 安装程序本身是 32 位的,但部分后台服务是 64 位的。

💡 小技巧:你可以把 vc_redist.x64.exe 放进系统镜像制作阶段,预装进去,省得每次都要补。


❌ 问题二:驱动加载失败,提示“Invalid Signature”

安装过程中卡住,或者安装完成后插上 ULINK Pro 却识别不了,设备管理器里显示黄色感叹号。

查看日志发现类似错误:

LoadDriver failed: The application cannot be started because the driver is not digitally signed.

原因分析
Windows 自 Vista 起引入了 驱动签名强制机制(Driver Signature Enforcement) 。任何内核模式驱动( .sys )必须具备有效的数字签名,否则不允许加载。

而 Keil 自带的调试驱动(如 keil_ulink.sys )大多是多年前发布的,没有 WHQL 认证,也不支持 UEFI Secure Boot,因此会被系统直接拒绝。

解决方案

方案 A:临时关闭签名验证(仅限开发/测试环境)
:: 以管理员身份运行 CMD
bcdedit /set loadoptions DISABLE_INTEGRITY_CHECKS
bcdedit /set nointegritychecks on
shutdown /r /t 0

重启后即可正常安装驱动。

⚠️ 注意:这只是权宜之计!生产环境严禁使用这种方式,存在严重安全隐患。

方案 B:使用已签名第三方调试器(推荐)

换成 SEGGER J-Link 或 ST-Link,它们的驱动都是 WHQL 签名并通过 Microsoft 公钥认证的,在绝大多数加固系统上都能顺利加载。

例如 J-Link 驱动下载地址:
👉 https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack

方案 C:联系 Keil 官方申请签名驱动(企业级需求)

如果你是大型国企或军工单位,可以通过 Arm 授权代理商申请定制签名版本的驱动包。不过周期较长,适合长期项目。


❌ 问题三:安装程序无响应、闪退、静默失败

最让人抓狂的情况来了:你点了安装包,鼠标转一圈,然后啥也没有。任务管理器里也看不到进程。

原因分析

这种情况多半不是 Keil 的锅,而是系统层面做了太多限制:

  • 主机防护软件(如 360、火绒、深信服EDR)将安装程序误判为恶意行为并拦截;
  • 组策略禁止执行来自“未知来源”的可执行文件;
  • AppLocker 或 Software Restriction Policies 开启,限制非白名单程序运行;
  • TEMP 目录被重定向或加密,导致解压失败;
  • 用户账户控制(UAC)级别过高,即使右键“管理员运行”也无法提权。

解决方案

逐项排查

  1. 关闭实时杀毒 :暂时退出所有杀软,尤其是国产杀毒(你懂的);
  2. 检查 AppLocker 策略
    cmd gpresult /h report.html
    查看 HTML 报告中是否有软件限制策略启用;
  3. 更换 TEMP 路径
    cmd set TEMP=C:\Temp set TMP=C:\Temp mkdir C:\Temp
    然后在此目录下运行安装包;
  4. 使用 Process Monitor 抓行为
    下载 ProcMon ,过滤 MDK*.exe ,观察是否出现 ACCESS DENIED PATH NOT FOUND

一旦定位到具体拦截点,就可以针对性解决。


五、如何构建一个“Keil友好型”开发系统?

与其每次都折腾修复,不如一开始就规划好系统环境。

这是我给客户的“标准开发机配置建议清单”👇

✅ 推荐系统配置

项目 推荐配置
操作系统 Windows 10 专业版 64位(1909 或 LTSC 2019/2021)
CPU 架构 x86_64(兼容性最好),国产平台建议使用完整版镜像
用户权限 使用独立管理员账户,避免共用 Administrator
安全策略 允许临时禁用驱动签名(用于调试阶段)
预装组件 .NET 4.8 + VC++ 2015–2022 Redist(x86/x64)+ DirectX Runtime
存储空间 至少 50GB 可用空间(Keil + 多个 DFP 包很吃空间)
备份机制 使用 Veeam Agent 或 Macrium Reflect 制作完整系统镜像

✅ 开发流程优化建议

场景 建议做法
新机器部署 提前准备好“Keil 安装套装U盘”:含安装包 + 运行库 + 驱动补丁
国产平台适配 若必须使用定制系统,要求 OEM 厂商保留核心运行库
多人协作 统一使用虚拟机模板(VMware/VirtualBox)分发环境
降低依赖 考虑转向轻量级方案:
• Keil Studio Cloud(Web版)
• VS Code + Arm GCC + PyOCD + Cortex-Debug
日志留存 每次安装均保留 /LOG 输出,归档至团队知识库

六、替代路线图:当 Keil 实在装不上怎么办?

有时候你不得不面对现实:这台机器就是不让装 Keil。

那是不是就得放弃 ARM 开发了?当然不是。

现在已经有成熟的替代方案,既能保持高效开发,又能摆脱对 Windows 和 Keil 的重度依赖。

方案一:Keil Studio Cloud —— 浏览器里的 uVision 👨‍💻

Arm 官方推出的云端开发平台: https://studio.keil.arm.com

特点:
- 完全基于 Web,无需本地安装;
- 支持主流 Cortex-M 芯片(STM32、NXP、GD32等);
- 内置编译器、调试器、RTOS 示例;
- 可连接本地调试器(需安装 Bridge Agent);
- 免费使用,适合学习和中小型项目。

缺点:
- 依赖网络;
- 不支持私有芯片或定制外设;
- 无法集成企业内部代码库。

适合场景:远程办公、教学培训、快速原型验证。


方案二:VS Code + Arm GCC + PyOCD —— 开源组合拳 🥊

这才是真正的“跨平台自由开发者”标配。

所需组件:

组件 功能
VS Code 编辑器 + 插件平台
Cortex-Debug 提供图形化调试界面
Arm GNU Toolchain 开源编译器(替代 Arm Compiler)
PyOCD / OpenOCD 开源调试服务器(支持 J-Link、ST-Link、DAP-Link)
Make/CMake 构建系统

优点:
- 完全免费;
- 支持 Linux / macOS / Windows;
- 易于自动化和 CI/CD 集成;
- 社区活跃,文档丰富。

配置示例( .vscode/launch.json ):

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "PyOCD Debug STM32F4",
            "type": "cortex-debug",
            "request": "launch",
            "servertype": "pyocd",
            "device": "STM32F407VG",
            "interface": "swd",
            "runToMain": true,
            "executable": "./build/app.elf"
        }
    ]
}

配合 GitHub Actions 或 Jenkins,还能实现自动编译烧录。


七、一点思考:安全 vs 开发效率,真的不可调和吗?

这个问题我一直都在问自己。

企业在做国产化替代时,总想着“越安全越好”,于是把系统砍得只剩 kernel,连 IE 都不要了。结果呢?开发人员连个 IDE 都装不上,只能抱着另一台笔记本来回拷代码。

这不是讽刺是什么?

其实完全可以在两者之间找到平衡点:

  • 分域管理 :开发机允许适度开放,生产部署机严格封锁;
  • 沙箱隔离 :使用虚拟机运行开发环境,宿主机保持高安全等级;
  • 标准化镜像 :由 IT 部门统一维护“认证开发镜像”,既安全又可用;
  • 白名单机制 :将 Keil、J-Link 驱动等列入可信软件名单,避免误拦截。

毕竟, 安全的最终目的不是让系统动不了,而是让正确的业务稳定运行。


最后一个小建议:别怕动手,多留痕迹

下次再遇到“Keil 装不上”的问题,记住这几句话:

🔧 不要重复点击安装包 ,那样只会浪费时间。
📄 先看日志 ,哪怕看不懂也要截图保存。
🧠 写下你的操作步骤 ,包括用了哪个账号、有没有管理员权限、是否重启过。
📤 把问题描述清楚再求助 ,别说“不行”“打不开”,要说“提示什么错误”“发生在哪一步”。

你会发现,大多数所谓的“疑难杂症”,其实只是缺了一个 .dll ,或者少了一句 bcdedit 命令而已。

技术从来不怕复杂,怕的是懒惰和盲动。

共勉。💪

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

您可能感兴趣的与本文相关内容

stm32f105新建工程Rebuild started: Project: STM32_Car *** Using Compiler 'V5.06 update 7 (build 960)', folder: 'D:\Keil_v5\ARM\ARMCC\Bin' Rebuild target 'STM32F105RC' compiling main.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\User\main.c(9): warning: #1-D: last line of file ends without a newline } ..\User\main.c: 2 warnings, 1 error compiling stm32f10x_crc.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_crc.c: 1 warning, 1 error compiling stm32f10x_dbgmcu.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_dbgmcu.c: 1 warning, 1 error compiling stm32f10x_bkp.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_bkp.c: 1 warning, 1 error compiling stm32f10x_adc.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_adc.c: 1 warning, 1 error compiling misc.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\misc.c: 1 warning, 1 error compiling stm32f10x_dac.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_dac.c: 1 warning, 1 error compiling stm32f10x_it.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\User\stm32f10x_it.c: 1 warning, 1 error compiling stm32f10x_dma.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_dma.c: 1 warning, 1 error compiling stm32f10x_cec.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_cec.c: 1 warning, 1 error compiling stm32f10x_can.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_can.c: 1 warning, 1 error compiling stm32f10x_exti.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_exti.c: 1 warning, 1 error compiling stm32f10x_flash.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_flash.c: 1 warning, 1 error compiling stm32f10x_fsmc.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_fsmc.c: 1 warning, 1 error compiling stm32f10x_gpio.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_gpio.c: 1 warning, 1 error compiling stm32f10x_i2c.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_i2c.c: 1 warning, 1 error compiling stm32f10x_iwdg.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_iwdg.c: 1 warning, 1 error compiling stm32f10x_pwr.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_pwr.c: 1 warning, 1 error compiling stm32f10x_rcc.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_rcc.c: 1 warning, 1 error compiling stm32f10x_rtc.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_rtc.c: 1 warning, 1 error assembling startup_stm32f10x_hd.s... compiling stm32f10x_sdio.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_sdio.c: 1 warning, 1 error compiling stm32f10x_spi.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_spi.c: 1 warning, 1 error compiling stm32f10x_tim.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_tim.c: 1 warning, 1 error compiling stm32f10x_usart.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_usart.c: 1 warning, 1 error compiling core_cm3.c... compiling stm32f10x_wwdg.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Library\src\stm32f10x_wwdg.c: 1 warning, 1 error compiling system_stm32f10x.c... ..\Start\stm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ ..\Start\stm32f10x.h(472): warning: #12-D: parsing restarts here after previous syntax error } IRQn_Type; ..\Start\system_stm32f10x.c: 1 warning, 1 error ".\Objects\STM32_Car.axf" - 26 Error(s), 27 Warning(s). Target not created. Build Time Elapsed: 00:00:01
12-02
MATLAB代码实现了一个基于多种智能优化算法优化RBF神经网络的回归预测模型,其核心是通过智能优化算法自动寻找最优的RBF扩展参数(spread),以提升预测精度。 1.主要功能 多算法优化RBF网络:使用多种智能优化算法优化RBF神经网络的核心参数spread。 回归预测:对输入特征进行回归预测,适用于连续值输出问题。 性能对比:对比不同优化算法在训练集和测试集上的预测性能,绘制适应度曲线、预测对比图、误差指标柱状图等。 2.算法步骤 数据准备:导入数据,随机打乱,划分训练集和测试集(默认7:3)。 数据归一化:使用mapminmax将输入和输出归一化到[0,1]区间。 标准RBF建模:使用固定spread=100建立基准RBF模型。 智能优化循环: 调用优化算法(从指定文件夹中读取算法文件)优化spread参数。 使用优化后的spread重新训练RBF网络。 评估预测结果,保存性能指标。 结果可视化: 绘制适应度曲线、训练集/测试集预测对比图。 绘制误差指标(MAE、RMSE、MAPE、MBE)柱状图。 十种智能优化算法分别是: GWO:灰狼算法 HBA:蜜獾算法 IAO:改进天鹰优化算法,改进①:Tent混沌映射种群初始化,改进②:自适应权重 MFO:飞蛾扑火算法 MPA:海洋捕食者算法 NGO:北方苍鹰算法 OOA:鱼鹰优化算法 RTH:红尾鹰算法 WOA:鲸鱼算法 ZOA:斑马算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值