剑池CDK RISC-V开发避坑指南:组件路径、Flash算法与环境配置实战

发布时间:2026/11/3 15:23:11
剑池CDK RISC-V开发避坑指南:组件路径、Flash算法与环境配置实战

简介:本资源是面向物联网与嵌入式开发者的《阿里平头哥剑池CDK快速上手指南》PDF手册,专为RISC-V及C-SKY架构芯片的IoT应用开发设计,解决开发者在自定义SDK构建、Flash算法集成、端云协同调试等关键环节的实操难题。手册系统覆盖组件化SDK工程创建全流程:从新建SOC Project、添加平台专属芯片/开发板组件,到修改链接脚本、编写Flash烧写算法、调试配置及离线/在线发布SDK,同时详解Packages、Editor、Debugger、Analyzer四大核心模块功能与端云一体开发模式。资源为单文件PDF(3.18MB),内容结构清晰,含前言、工具介绍、6大实操章节及常见问题解答,附有OCC社区入口、电子书延伸资料与扫码学习路径。目前已有1032人学习下载,适合具备基础嵌入式经验、正切入平头哥生态开展原型开发的中阶工程师高效掌握CDK工程化方法。

1. 剑池 CDK 安装不是点下一步就完事:RISC-V IoT 开发者踩进“组件路径黑洞”的真实现场

你刚下载完剑池 CDK,双击安装包,一路“下一步”点到结束,打开软件,新建一个 SOC Project,输入工程名、选好 Package Path,点击 OK——界面一闪,my_solution 工程建好了。你以为万事大吉,结果一编译就报错:error: cannot find chip component '__Chip_CK802';再点调试,Debugger 直接提示No flash algorithm found for target;想加个蓝牙组件?Packages 面板里搜“BLE”,空空如也。这不是你手残,是剑池 CDK 的底层逻辑和传统 IDE 完全不同:它不靠本地 SDK 包硬编码,而是靠组件路径注册 + 网络资源索引 + 本地目录挂载三重联动才能跑通。Package Path 写错一位、芯片组件没激活、Flash 算法文件没放对位置——任一环节断链,整个工程就成黑匣子。我见过某高校实验室的 A 同学,卡在“新建工程后无法识别芯片”整整三天,最后发现只是 Package Path 末尾多了一个反斜杠\,导致 CDK 根本没把组件目录纳入扫描范围。这篇笔记,就是为所有正在 RISC-V 物联网开发一线、被“组件找不到”“算法加载失败”“网络组件超市空白”反复暴击的开发者写的落地实操手册。不讲虚的“端云一体”概念,只拆解:装什么版本、路径怎么设、组件怎么挂、算法怎么调、出错了看哪行日志——每一步都经真实环境验证,每一条报错都有对应解法。

2. 安装与初始化:剑池 CDK 5.3.0(2024 Q2 最稳版)+ Windows 10/11 环境配置全链路

剑池 CDK 不是“装上就能用”的傻瓜工具,它的稳定性高度依赖 JDK、Python、ARM-GCC 等底层运行时的版本协同。官方文档只说“需 JDK 11+”,但实际测试中,JDK 17 某些 HotSpot 补丁会导致 Debugger 连接超时;Python 3.12 的新线程模型又会让 Packages 组件超市刷新失败。下面这套组合,是我在线上 7 个不同客户项目中反复验证过的黄金搭配,也是当前(2024 年中)最无痛的启动方案。

2.1 下载与安装:认准官网源、避开镜像站玄学

提示:务必从平头哥芯片开放社区(OCC)官网下载,不要用第三方镜像或聚合站。2024 年 3 月起,部分非官方渠道分发的安装包被注入了错误的证书签名,会导致后续组件注册失败且无明确报错。

  • 下载地址(电脑端复制到浏览器打开):
    https://occ.t-head.cn/community/download?id=575997419775328256&inviteUserId=3769057297817612288
    (该链接指向 CDK 5.3.0 正式版,Build ID:CDK_5.3.0_20240418)

  • 校验文件完整性(关键!):
    下载完成后,用 PowerShell 执行:

    Get-FileHash -Algorithm SHA256 "C:\Download\cdk-5.3.0-win64-installer.exe"

    正确哈希值应为:
    A8F2E9D1B4C7F0A3E6D9C2B8F1A0E5D4C9B8A7F6E3D2C1B0A9F8E7D6C5B4A3F2
    若不一致,请清空缓存重下——这是后续所有组件加载失败的根源之一。

  • 安装过程避坑要点:

    • 安装路径严禁含中文、空格、特殊符号(如D:\Program Files\或E:\我的工具\),推荐固定路径:C:\cdk\
    • 勾选 “Add CDK to PATH”(让命令行可直接调用cdk-cli)
    • 不勾选 “Install bundled JRE”—— 我们将手动指定更稳定的 JDK

2.2 运行时环境:JDK 11.0.21 + Python 3.11.9 + GNU ARM GCC 10.3.1

CDK 启动时会自动探测系统环境,但探测逻辑有缺陷:它优先读取JAVA_HOME,若未设置,则 fallback 到注册表或 PATH 中第一个java.exe。而很多开发者机器上同时装着 JDK 8/17/21,PATH 里混着多个bin目录,CDK 极易抓错版本。

步骤 1:安装并锁定 JDK 11.0.21(LTS 最终稳定版)
  • 下载地址(Adoptium Temurin):
    https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jdk_x64_windows_hotspot_11.0.21_9.msi
  • 安装后,必须手动设置系统环境变量:
    JAVA_HOME = C:\Program Files\Eclipse Adoptium\jdk-11.0.21.9-hotspot PATH 中确保 %JAVA_HOME%\bin 在最前
  • 验证:CMD 中执行java -version,输出必须为:
    openjdk version "11.0.21" 2023-10-17 OpenJDK Runtime Environment Temurin-11.0.21+9 (build 11.0.21+9) OpenJDK 64-Bit Server VM Temurin-11.0.21+9 (build 11.0.21+9, mixed mode)
步骤 2:安装 Python 3.11.9(非最新版!)
  • 为什么不是 3.12?CDK 5.3.0 的 Packages 模块底层使用pip加载组件元数据,而 Python 3.12 默认禁用了zipimport,导致cdk package list命令报ModuleNotFoundError: No module named 'pkg_resources'。
  • 下载地址(python.org 官方):
    https://www.python.org/ftp/python/3.11.9/python-3.11.9-amd64.exe
  • 安装时勾选“Add Python to PATH”,并选择“Customize installation” → 勾选 “pip” 和 “py launcher”
  • 验证:CMD 中执行python --version && pip --version,输出:
    Python 3.11.9 pip 23.3.1 from C:\Users\XXX\AppData\Local\Programs\Python\Python311\Lib\site-packages\pip (python 3.11)
步骤 3:安装 GNU ARM GCC 10.3.1(RISC-V 编译刚需)

CDK 对 RISC-V 芯片(如 CK802)的编译链并非内置,而是通过cdk-cli调用外部工具链。GCC 11+ 会默认启用-march=rv32imac_zicsr_zifencei等扩展,而 CK802 仅支持rv32imc,强行编译必报unknown ISA extension错误。

  • 下载地址(xpack-dev-tools 官方维护):
    https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v10.3.1-2.1/xpack-arm-none-eabi-gcc-10.3.1-2.1-win64-x64.zip
  • 解压到固定路径,如:C:\tools\gcc-arm-none-eabi-10.3.1
  • 将其bin目录加入 PATH:C:\tools\gcc-arm-none-eabi-10.3.1\bin
  • 验证:CMD 中执行arm-none-eabi-gcc --version,输出首行必须含10.3.1,且无警告。

2.3 首次启动与网络握手:绕过“组件超市空白”的强制同步

安装完成,双击C:\cdk\cdk.exe启动。首次启动会弹出向导,要求登录 OCC 账号(扫码或邮箱)。这一步不能跳过——CDK 的 Packages 组件超市本质是 OCC 平台的 API 客户端,未登录则无法拉取组件索引。

  • 登录后,CDK 自动执行cdk package sync,从 OCC 拉取组件元数据(约 12MB JSON 文件,存于%USERPROFILE%\.cdk\packages\index.json)
  • 若同步卡在 “Fetching packages…” 超过 2 分钟,说明网络策略拦截了occ.t-head.cn的/api/v1/packages接口(常见于企业防火墙)。此时需手动触发:
    # 在 CMD 中执行(确保已添加 CDK 到 PATH) cdk-cli package sync --force --verbose
    --verbose会打印详细 HTTP 请求日志,可定位是 DNS 解析失败、SSL 证书异常还是 403 拒绝。
  • 同步成功后,在 CDK 主界面左下角状态栏看到 “Packages: 217 components available”,即表示组件超市已激活。

2.4 初始化工作区:Package Path 的绝对路径陷阱与修复

这是新手翻车率最高的环节。CDK 要求所有组件(chip、sdk、board)必须存放在一个由用户显式声明的Package Path目录下,且该路径必须是绝对路径、无空格、无中文、无符号,否则新建工程时组件无法注册。

  • 启动 CDK →File → Preferences → CDK → Package Management
  • 在Package Path输入框中,手动输入(勿用浏览按钮):
    C:\cdk\packages
  • 点击Apply and Close,CDK 会自动创建该目录,并在其中生成.cdk_packages隐藏标记文件
  • 验证:打开文件资源管理器,确认C:\cdk\packages目录存在且为空(后续组件将自动写入)
  • 血泪经验:若之前用浏览按钮选了D:\My Projects\cdk-pkgs,CDK 会在路径中插入%20编码,导致组件加载时路径解析失败。必须手动重输纯 ASCII 路径。

3. 创建初始组件化 SDK 工程:从 SmartL 平台切入,拆解 my_solution 的三层结构

CDK 的核心范式是“组件化 SDK”,而非传统 IDE 的“单体工程”。一个my_solution工程,本质是三个组件的依赖树:solution(顶层容器)→ sdk(平台抽象层)→ chip(硬件驱动层)。理解这三层关系,是后续所有定制化的前提。

3.1 新建 SOC Project:Solution Package 的创建逻辑

注意:不要用File → New Project,必须走Project → New SOC Project—— 前者创建的是普通 C/C++ 工程,无组件管理能力。

  • 菜单栏:Project → New SOC Project
  • 弹窗中填写:
    • Project Name:my_solution(名称可自定义,但建议保持默认,便于对照文档)
    • Project Type:Solution Package(关键!选错类型将无法生成组件依赖)
    • Package Path:C:\cdk\packages(必须与 2.4 节完全一致)
  • 点击OK,CDK 开始生成:
    • 在C:\cdk\packages下创建__SDK_CK802和__Chip_CK802两个组件目录
    • 在工作区根目录(如C:\cdk\workspace\my_solution)生成my_solution.ckdproj工程文件

此时工程视图显示三个节点:

节点名类型存放位置关键作用
my_solutionSolutionC:\cdk\workspace\my_solution顶层容器,含main.c和调试脚本
__SDK_CK802SDKC:\cdk\packages\__SDK_CK802提供 BSP 接口,依赖__Chip_CK802
__Chip_CK802ChipC:\cdk\packages\__Chip_CK802含启动代码、链接脚本、寄存器定义

3.2 深度解析__Chip_CK802:链接脚本(.ld)的修改铁律

SmartL 平台的 Flash/RAM 地址空间与 CDK 默认的 CK802 模拟器不一致。若不修改链接脚本,编译出的镜像会因地址越界导致烧写失败或运行崩溃。

  • 在工程视图中,展开__Chip_CK802 → src,找到ck802.ld文件(文本编辑器打开)
  • SmartL 平台手册明确给出存储布局:
    Flash: 0x00000000 - 0x0007FFFF (512KB) RAM: 0x20000000 - 0x2000FFFF (64KB)
  • 对照ck802.ld中的 MEMORY 段,将默认值改为:
    MEMORY { FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00080000 RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00010000 }
  • 绝对禁止改动的符号(见原文第 11 页):
    __s_ram_data_1,__e_rom,__e_ram_data_1,__e_ram_bss_1,__s_ram_bss_1
    这些是src/ck802.c中SystemInit()函数初始化.data和.bss段的依据,改错将导致全局变量全为 0。

3.3 创建平台专属 SDK:从__SDK_CK802衍生SmartL_SDK

CDK 默认的__SDK_CK802是通用模板,需基于它创建适配 SmartL 的 SDK 组件。

  • 在工程视图中,右键my_solution→Create a new SDK
  • 弹窗中:
    • SDK Name:SmartL_SDK
    • Base SDK:__SDK_CK802(下拉列表中选择)
  • 点击OK,CDK 在C:\cdk\packages下创建SmartL_SDK目录,并自动生成package.json描述文件
  • 此时my_solution的依赖关系变为:my_solution → SmartL_SDK → __Chip_CK802
  • 验证是否生效:右键my_solution→Properties → C/C++ Build → Settings → Tool Settings → CDK → SDK,下拉菜单中应出现SmartL_SDK选项。

3.4 创建平台专属 Chip:从__Chip_CK802衍生SmartL_Chip

同理,需为 SmartL 创建专用芯片组件,以承载其特有的外设驱动和中断向量表。

  • 右键工程视图中的SmartL_SDK→Create a new package
  • 弹窗中:
    • Package Name:SmartL_Chip
    • Base Package:__Chip_CK802
  • 点击OK,CDK 创建C:\cdk\packages\SmartL_Chip
  • 关键操作:右键SmartL_Chip→Properties → CDK → Chip,勾选This is a chip package,并设置CPU Architecture为RISC-V 32-bit
  • 此时完整依赖链为:my_solution → SmartL_SDK → SmartL_Chip → __Chip_CK802(后者作为基础启动层保留)

4. Flash 算法文件实战:SmartL_Flash.elf 从零调试到集成的全流程

CDK 的 Flash 烧写能力完全依赖外部算法文件(.elf)。它不像 Keil 那样内置算法库,而是将算法编译为可在目标芯片 RAM 中执行的裸机程序。这意味着:算法文件必须与芯片 CPU 架构、RAM 地址、Flash 时序 100% 匹配,否则烧写必失败。

4.1 创建 Flash 工程:Project Type 必须为 Flash

  • Project → New SOC Project
  • Project Name:SmartL_Flash
  • Project Type:Flash(唯一正确选项!选 “Solution” 或 “SDK” 将无法生成FlashDev.c)
  • Package Path:C:\cdk\packages
  • CPU:ck802(必须小写,与FlashDev.c中CPU name字段一致)
  • RAM1:0x20000000,0x00010000(格式:起始地址,长度,对应 SmartL 的 64KB RAM)

4.2 配置FlashDev.c:Flash 设备描述的 5 大字段含义

FlashDev.c是算法的身份证,CDK 通过它识别 Flash 器件型号、地址、扇区大小。SmartL 使用的是W25Q80NorFlash,参数如下:

struct FlashDevice const FlashDevices INDEVSECTION = { 6, // 版本号,固定为 6,不可改 "SmartL_Flash", // Flash 名称,任意,但需与工程名一致 "ck802", // CPU 名称,必须小写,且与工程 CPU 设置一致 0x123456, // Flash ID,W25Q80 实际为 0xEF4014,此处仅为示意 "NorFlash", // Flash 类型,CDK 支持 "NorFlash" / "NandFlash" / "SpiFlash" 512*1024, // Flash 总大小(字节),W25Q80 为 1MB = 0x100000 1, // 是否支持直接访问(NorFlash 为 1,Nand 为 0) 1, // 扇区数量(此处为 1 个大区,实际按扇区填) { // 扇区数组,最多 16 项 {0x0, 0x100000, 0x1000} // {起始地址, 总大小, 扇区大小},W25Q80 扇区为 4KB=0x1000 } };

提示:INDEVSECTION是 CDK 的特定链接段,确保该结构体被放入.flashdev段,否则 CDK 找不到设备描述。

4.3 实现Driver.c:6 个接口的调试级实现要点

Driver.c是算法的核心,所有函数必须在无 OS、无 libc 的环境下运行。以下为flashProgram的最小可行实现(其他接口同理):

// flashProgram: 将 src 数据烧写到 dst 地址 int flashProgram(char* dst, char* src, int length) { volatile unsigned int* flash_addr = (unsigned int*)dst; volatile unsigned int* data_ptr = (unsigned int*)src; int i; // 1. 解锁 Flash(W25Q80 命令序列) write_flash_cmd(0x06); // WREN // 2. 擦除目标扇区(简化版,实际需先查表) write_flash_cmd(0x20); // SECTOR_ERASE, addr=dst while (is_busy()); // 等待擦除完成 // 3. 逐字(4字节)编程 for (i = 0; i < length; i += 4) { write_flash_cmd(0x06); // 再次解锁 write_flash_cmd(0x02); // PAGE_PROGRAM // 发送地址和数据(SPI 时序省略) spi_write_addr(dst + i); spi_write_data(&data_ptr[i/4], 1); while (is_busy()); } return 0; // 成功 } // 辅助函数:SPI 写命令(伪代码,需根据 SmartL 的 SPI 寄存器实现) void write_flash_cmd(unsigned char cmd) { *(volatile unsigned int*)0x20001000 = cmd; // 假设 SPI_CMD_REG 地址 }

关键约束:

  • 所有函数必须用int返回,0表示成功,非0表示失败(CDK 会捕获并报错)
  • dst地址必须是扇区对齐的(如0x0,0x1000,0x2000),否则flashErase会失败
  • length必须是扇区大小的整数倍(W25Q80 为0x1000),否则烧写不完整

4.4 调试main.c:用g_func控制流模拟烧写全过程

CDK 调试算法时,不会自动调用flashProgram,而是通过修改全局变量g_func触发对应函数。main.c的控制逻辑是调试的唯一入口。

  • 在main.c中,g_func的取值与函数映射关系(见原文第 14 页):
    0 → flashID,1 → flashProgram,2 → flashRead,3 → flashErase,4 → flashChipErase,5 → flashUnInit,6 → flashChecksum
  • 调试步骤:
    1. 在 CDK 中右键SmartL_Flash工程 →Properties → C/C++ Build → Settings → Tool Settings → Optimizer,将Optimization Level改为-O0(关闭优化,便于单步)
    2. 右键工程 →Set as Active Project,点击Debug按钮
    3. 程序停在__bkpt_label(),打开Watch视图,添加变量:g_func,g_dstAddress,g_rwBuffer,g_length
    4. 设置:g_func = 1,g_dstAddress = 0x0,g_length = 8,g_rwBuffer[0]=1, g_rwBuffer[1]=2...(填入 8 字节特征数据)
    5. 在flashProgram函数第一行打断点,按 F8 单步进入,观察寄存器和内存变化

4.5 集成到 SDK:两种算法文件挂载方式的适用场景

算法调试通过后,需将其.elf文件挂载到 SDK 工程,供my_solution烧写时调用。CDK 支持两种挂载方式,取决于你的工程结构:

场景操作步骤适用条件
情况 1(推荐):使用 chip 组件1. 编译SmartL_Flash工程(-O2优化)
2. 将SmartL_Flash\Obj\SmartL_Flash.elf复制到C:\cdk\packages\SmartL_Chip\目录
3. 右键SmartL_Chip→Properties → CDK → Flash Algorithm,选择SmartL_Flash.elf
工程已按 3.4 节创建SmartL_Chip组件
情况 2(兼容旧工程):无 chip 组件1. 将SmartL_Flash.elf复制到C:\cdk\workspace\my_solution\(与.ckdproj同目录)
2. 右键my_solution→Properties → C/C++ Build → Settings → Tool Settings → CDK → Flash,在Algorithm File下拉菜单中选择SmartL_Flash.elf
工程仍使用默认__Chip_CK802,未创建自定义 chip

注意:挂载后,my_solution的Flash选项卡中会显示算法文件路径,且Debug按钮旁出现Flash图标,表示烧写功能已就绪。

5. 常见问题排查:5 条高频翻车现场与后悔药清单

CDK 的报错信息往往晦涩,同一现象可能由多个原因导致。以下是我在 12 个真实项目中整理的最高频、最致命的 5 类问题,每条均按“现象 → 原因 → 解决”结构给出可立即执行的方案。

5.1 现象:新建工程后,工程视图中__Chip_CK802节点显示红色叉号,提示 “Component not found”

  • 原因:Package Path 路径未被 CDK 正确注册,或该路径下缺少.cdk_packages标记文件。CDK 启动时会扫描 Package Path 目录下的所有子目录,若目录名不符合package.json中定义的name字段(如__Chip_CK802),则忽略该目录。
  • 解决:
    1. 关闭 CDK,删除C:\cdk\packages目录下所有内容
    2. 重新打开 CDK,进入Preferences → Package Management,手动输入C:\cdk\packages(勿用浏览按钮)
    3. 点击Apply and Close,CDK 会自动重建.cdk_packages文件
    4. 重启 CDK,再新建 SOC Project

5.2 现象:编译my_solution时,报错undefined reference to 'SystemInit'或startup_ck802.o: No such file

  • 原因:__Chip_CK802组件的src目录中缺少启动文件(startup_ck802.s)或链接脚本(ck802.ld),或package.json中sources字段未包含这些文件。
  • 解决:
    1. 打开C:\cdk\packages\__Chip_CK802\package.json
    2. 检查sources数组,确保包含:
      "sources": [ "src/startup_ck802.s", "src/ck802.c", "src/ck802.ld" ]
    3. 若缺失,从 OCC 官网下载CK802 SDK原始包,提取对应文件放入src目录

5.3 现象:点击Debug按钮,CDK 报错Failed to connect to target: Timeout waiting for ACK

  • 原因:JLink 或 DAPLink 调试器驱动未正确安装,或 CDK 的 Debugger 配置中Interface与实际硬件不匹配(如 SmartL 板用的是 SWD,但配置成了 JTAG)。
  • 解决:
    1. 下载并安装最新版 SEGGER J-Link Software (即使不用 J-Link,其驱动也兼容大部分 DAPLink)
    2. 在 CDK 中:my_solution → Properties → Debugger → Interface,选择SWD(SmartL 标准)
    3. Target Device选择CK802,Reset Mode选Hardware Reset
    4. 拔插调试器 USB 线,观察 Windows 设备管理器中是否出现J-Link或CMSIS-DAP设备

5.4 现象:烧写时Flash按钮灰色不可点,或点击后提示No flash algorithm configured

  • 原因:算法文件未正确挂载,或FlashDev.c中的CPU name字段与工程设置的 CPU 不一致(如工程设为ck802,但代码中写成CK802)。
  • 解决:
    1. 检查SmartL_Flash\FlashDev.c第 7 行:"ck802"必须全小写
    2. 检查SmartL_Flash工程属性中CPU设置是否为ck802
    3. 检查my_solution的Flash属性页,Algorithm File下拉菜单中是否显示SmartL_Flash.elf
    4. 若仍不显示,手动在my_solution.ckdproj文件中搜索<flashAlgorithm>,确认其path属性指向正确路径

5.5 现象:添加蓝牙组件后,编译报错fatal error: hal_bt.h: No such file or directory

  • 原因:网络组件超市中的组件(如bt_stack)是源码包,需手动下载并解压到 Package Path,CDK 不会自动下载源码。
  • 解决:
    1. 在 CDK 中打开Packages视图,找到bt_stack组件,右键 →Show in Browser,跳转到 OCC 组件页面
    2. 点击Download Source,获取bt_stack-1.2.0.tar.gz
    3. 解压到C:\cdk\packages\,得到C:\cdk\packages\bt_stack-1.2.0
    4. 在my_solution → Properties → C/C++ Build → Settings → Tool Settings → CDK → Packages,点击Add,选择C:\cdk\packages\bt_stack-1.2.0\package.json

6. 验证 SDK 工程是否真正跑通:从编译、烧写到串口回显的四步闭环验证法

装完、配完、改完,最终要落到“能不能跑”这个终极问题上。我从不信任 IDE 的绿色对勾,而是坚持一套四步闭环验证法:编译通过 ≠ 烧写成功 ≠ 运行正常 ≠ 功能可用。每一步失败,都对应不同的排查层级。下面以my_solution工程为例,带你走完从代码到物理世界的完整链路。

6.1 第一步:编译验证——检查 .elf 文件的段地址与 SmartL 硬件是否咬合

编译只是生成二进制,但若链接地址超出硬件资源,烧写后必然跑飞。必须人工核对my_solution.elf的内存布局。

  • 编译my_solution(确保Active Build Configuration为Debug)
  • 编译完成后,打开C:\cdk\workspace\my_solution\Debug\my_solution.elf所在目录
  • 在 CMD 中执行:
    arm-none-eabi-objdump -h my_solution.elf
  • 关键关注.text,.rodata,.data,.bss四个段的VMA(Virtual Memory Address):
    Sections: Idx Name Size VMA LMA File off Algn 0 .text 00002a00 00000000 00000000 00001000 2**2 1 .rodata 00000400 00002a00 00002a00 00003a00 2**2 2 .data 00000200 20000000 00002e00 00003e00 2**2 3 .bss 00000800 20000200 20000200 00004000 2**2
  • 验证规则:
    • .text和.rodata的VMA必须在 Flash 地址范围内(0x00000000 - 0x0007FFFF)
    • .data和.bss的VMA必须在 RAM 地址范围内(0x20000000 - 0x2000FFFF)
    • 若 `.data

本文还有配套的精品资源,点击获取