剑池CDK快速使用指南


仅介绍剑池CDK的基本使用方法步骤,详细信息参考CDK的Help文档。参考教程——阿里云开发者社区-剑池CDK功能及开发实战。

背景介绍

平头哥IoT开发工具简介

平头哥剑池CDK开发工具主要用于开发玄铁CPU。如何开发出运行在玄铁CPU上的软件?在IoT芯片开发领域中,会有一些基础的IoT芯片软件开发工具,比如编译器、汇编器、链接器、集成开发环境、模拟器、Flash烧写工具、领域内算法库、CK-Link等。
玄铁处理器也有自己的开发工具,即剑池开发工具。
在这里插入图片描述
从产品使用的角度来讲,剑池CDK向用户提供了四个方面的功能,如下图:
在这里插入图片描述
组件包管理器:将开发资源定义成组件单元。
编辑器:将IoT领域中常见的一些晦涩难懂的代码、脚本以图形化的方式提供给开发者,开发者只需在图形界面上操作,无需编写复杂的代码。
调试器:提供图形化的调试界面,令开发者能通过图形的方式去控制玄铁CPU的停止、运行,修改运行在玄铁CPU上的软件的内部变量。
分析器:帮助开发者提高代码性能,减小代码大小、降低功耗等。

工作空间及组件

在IoT的开发中,运行在玄铁CPU上面的二进制文件称为镜像文件。在CDK中,我们定义CDK的工程是生成一个镜像文件的基本单元,一个CDK工程就可以被编译输出一个镜像文件,再通过CDK中的下载器将镜像文件下载到玄铁CPU中运行。我们在CDK中定义了工作空间的概念,一个工作空间是CDK工程的容器,可以包含一个或多个CDK工程,每个CDK工程之间都是相互独立的,它们可以生成独立的镜像文件运行在玄铁CPU上。
在这里插入图片描述
最终,我们会将一个完整的CDK工程划分成多个组件。组件分为四个基本类别:

  • Solution(方案组件):对工程方案的具体实现
  • Chip(芯片组件):描述硬件资源中芯片相关的内容
  • Common(通用组件):方案、硬件无关的中间件资源
  • Board(开发板组件):描述硬件资源中开发板相关的内容
    这四个类别被称为CDK的组件包。通过定义这四类组件,可以描述嵌入式开发中的全部开发资源。描述完四类组件后,我们又定义了虚拟组件的方式。通过虚拟的组件合集的方式,能够将不同类型的组件整合在一起,表示一个特定功能的资源。
    在组件定义的基础之上,可以将一个工程看作是一个Solution的组件,这个组件通过依赖的关系,可以将我们使用到的芯片、开发板以及其他的中间件资源整合在Solution中。通过这种方式,任何一个应用工程都可以复用芯片、开发板或者中间件。通过虚拟组件的整合,任何一个方案都可以灵活的从一个合集切换到另外的合集中,若合集表示一个硬件平台,那么可以从一个平台切换到另外的平台。通过对通用组件的使用,应用工程可以快速的实现设计目标。
    在这里插入图片描述
    组件定义完成后,在CDK组件框架中将组件进行分层。从CDK界面视图来看,以方案作为基本开发单元。在此基础上,CDK定义了组件池的概念,每个组件池可以包含若干个不同类型的组件,为我们的开发方案提供一些可选的组件列表。在方案内部可以配置要使用组件池的哪些组件。用户可以配置自己的组件池,CDK也会提供默认的组件池。芯片开放社区(OCC)对接到默认组件池中,因此在CDK中可以直接访问芯片开放社区提供的组件。
    在这里插入图片描述
组件操作及配置演示

工程中用到四类组件——Common组件、芯片组件、开发板组件及工程节点代表的Solution组件
1、创建CDK工作空间在这里插入图片描述
2、Project View界面 在这里插入图片描述
3、设置组件池
在这里插入图片描述
在这里插入图片描述

4、设置组件
SDK型组件就是虚拟组件集,可以代表一个具体的硬件平台。当组件池中有多个SDK时,可以通过切换SDK,达到切换不同平台的目的。
在这里插入图片描述

在这里插入图片描述
5、可以把硬件资源存放在SDK组件下。通过Options for配置我们想要的和不想要的组件。**只有在工程节点下的组件才会被编译到工程中去。**组件池里的组件只是为我们提供一些可用的选项。
在这里插入图片描述
在这里插入图片描述
创建芯片和开发板组件,是要在SDK节点下。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
6、组件的配置(详细组件配置选项的含义参考CDK的Help文档
(1)方案组件外的其他类型组件,以配置Common组件为例
在这里插入图片描述
在这里插入图片描述
组件配置优先级:Solution>Board>Chip>Common。建议常用配置放在Solution中,与开发板严格相关的放在Board中,与开发板严格相关的放在Board中。

剑池CDK基础概念及功能

工程管理及运行步骤:

1、方案组件配置(即工程配置)
在这里插入图片描述
2、编译工程生成elf文件
在这里插入图片描述
在这里插入图片描述
加速编译功能:
Edit-Configuration-Build Settings-Multi core build

模拟器

在使用CDK进行玄铁CPU开发的过程中,如果没有CPU硬件,可以进行模拟。CDK内置一个能够模拟虚拟芯片平台的模块——模拟器。模拟器可以模拟一个虚拟的芯片平台,调试时,我们可以将程序运行在这个虚拟平台中。开发者可以自己配置基于玄铁CPU的虚拟平台。整个虚拟平台的配置包括三部分:CPU、存储空间、外围设备。
在这里插入图片描述
三步完成一个基于玄铁CPU的虚拟芯片:(1)选择平头哥玄铁CPU型号;(2)配置虚拟芯片存储空间;(3)增加虚拟平台外设模块。
1、在这里插入图片描述
在这里插入图片描述
创建新平台
可以copy上面的硬件平台到自己的平台中

硬件调试器及配置

CDK能够连接的硬件调试器分为两个类型:CK-Link Lite和CK-Link Pro,这两个类型都有不同的型号。CK-Link Lite是低成本调试器,造价比较低,CK-Link Pro是高性能调试器,成本更高。对于MCU类的小成本CPU,用CK-Link Lite即可。两种调试器在CDK中都可以进行配置。
右击工程节点——Options for…——Debug
在这里插入图片描述
Init File用于导入初始化脚本,在下载程序之前先执行一些命令。这些命令主要包含:set命令——设置目标板上内存的一些值,也可以设置一些寄存器的值;download命令——下载除工程之外的一些镜像到开发板中,支持elf、hex和bin文件格式的下载,这些文件也支持Flash空间的配置。
在这里插入图片描述
整个调试过程中,CDK先连接上硬件调试器,再连接CPU。
调试界面包括(详见帮助文档中图形界面接口-调试器窗格):

  1. 反汇编窗口Disassemble:展示程序实时运行中,在调试目标端,玄铁CPU运行的真实的指令流。
  2. 源代码窗口:显示正在运行的源代码的具体位置。反汇编窗口会联动地显示当前源代码的反汇编,同样,源代码窗口也会根据反汇编窗口的具体位置去显示具体的源代码。
  3. 寄存器窗口Register:显示和修改调试目标的寄存器的内容。
  4. 断点窗口Debugger-Breakpoints:管理插入的断点。可以对断点进行编辑,设置断点条件等。
  5. Frame Info-Locals窗口:显示当前运行到的函数的局部变量。
  6. Frame Info-Watches窗口:显示用户输入的表达式的结果;显示程序所运行位置能够访问到的所有的变量,可以是全局变量或局部变量。可以输入“$寄存器名”,显示该寄存器的值。可以对变量或节点值进行修改。添加变量时,一种方法是在下方手动输入变量名,另一种方法是选中源代码窗口中的变量,按住鼠标拖动到Watches窗口中。
  7. Frame Info-Call Stack窗口:显示程序的调用轨迹。
  8. Frame Info-Memory窗口:显示用户输入的存储空间的内容;查看和修改某个内存地址的值。
  9. Serial Pane串口窗口:提供了三个功能相同的硬件串口窗口,可同时连接三个硬件串口;Debug Print用来连接支持CPU的调试打印串口,会自动连接到该串口。该窗口是通过硬件的调试通道实现了一个虚拟的串口打印功能。当使用的硬件CPU支持了调试打印功能以后,用户可以在程序中结合硬件实现printf功能,完成调试打印输出的功能,此时打印会输出在此窗口中;也就是之前配置的ICE(硬件调试方法)Debug Print功能。
  10. Peripherals外设窗口:显示外围设备状态,修改一些可修改内容(从菜单栏的Peripherals打开)。在开发阶段,开发者可配置自己的外设窗口,因为每个CPU对接的外设都不同——在工程的任一目录下-Add New File-Chip File(.svc)-
    其他的调试窗口可在View中打开。

使用剑池CDK进行IoT方案开发

从Welcome Page中可以下载方案示例和对应的开发资源。

使用剑池CDK进行芯片SDK开发

参考文档平头哥剑池CDK快速上手指南
我们可以把一个工程需要的资源划分成若干类型的组件,因此可以说一个硬件平台由若干个组件组成。定义运行在一个硬件平台下的多个方案工程,我们把这些方案工程及硬件平台一起打包,分发给方案开发者,把这样的一个软件包称为芯片的SDK。
芯片SDK开发的基本步骤

创建初始SDK

在workspace中新建SOC project,Project type选择Solution Package,设置组件池路径(建议组件池新建在worksapce的目录下,与.cdk同级),即可创建一个初始SDK。初始SDK仅包含一个Solution组件(即工程节点)、SDK虚拟组件集(只依赖一个chip SDK)。chip SDK包含启动文件(src-startup.S)、memory初始化文件(src-e902.c)。此时我们需要根据自己的硬件芯片的memory空间,修改script-gcc_chip.Id中ROM和RAM的区间,填写其启动地址和长度。此外,还要在startup.S中配置堆栈的大小。

算法工程原理及创建

算法工程用于将运行在Flash区间的镜像烧写到芯片的Flash空间中。算法工程的原理涉及CDK的硬件调试概念。
在硬件调试中,将CDK开发环境工程生成的镜像文件通过CK-Link调试工具下载到程序的RAM区间中。如果镜像文件需要烧写到Flash区间,需要算法文件辅助,将下载到RAM区间的镜像写到Flash区间中。
CDK的硬件调试通路说明
在这里插入图片描述
Flash算法的目的就是把镜像程序烧写到Flash区间中。CDK开发环境会首先把Flash算法文件下载到嵌入式设备的RAM/SRAM区间,这个过程没有涉及Flash的下载。然后CDK开发环境把镜像的二进制先放在算法文件的buffer中,再通过调试手段控制算法逻辑,将要烧写的数据Flash算法加载到Flash区间。Flash算法是Flash烧写的核心。
在Flash的四个组成部分中,真正需要用户开发的是设备描述、数据交互、接口实现。

  1. Flash设备描述:按照实际情况,填写Flash设备描述的信息。
  2. Flash接口实现:按照嵌入式Flash设备特性,完成Flash接口实现。
  3. 数据交互buffer:根据实际情况(芯片RAM大小),设置数据交互buffer的大小,越大烧写越快。
  4. 根据工作原理,调试驱动。
    Flash基本工作原理和组成
    在CDK中创建Flash工程: 在workspace中新建SOC project,Project type选择Flash,填写芯片中RAM的地址,因为Flash算法始终运行在芯片的RAM空间中。需要我们开发的是src目录下的三个文件。
    在这里插入图片描述
    在FlashDev.c中,将三个"unknown"分别替换成硬件设备上Flash名称、CPU型号、Flash类型,可修改Flash的唯一标识ID。备注为“Access derectly”代表CDK能否直接读取Flash空间,如果为1则可以直接读取,CDK进行读Flash的操作时不会调用二次开发接口的FlashRead接口;如果为0则需要调用该接口去读取Flash的内容。Flash可以进行多个空间的配置,每个空间都是由起始地址、Flash size、sector size组成。
    FlashDev.c
    在main.c中,需配置g_rwBuffer的大小,根据芯片的RAM空间配置,尽可能配置较大的buffer大小。
    在driver.c中,注释为TODO的位置用于留给我们做接口开发。根据硬件行为完成具体的逻辑。
    其中flashProgram函数,将需要烧写的数据烧写到flash区间中。参考代码:
int flashProgram(char* dst, char *src, int length){
	// TODO 
	for(int i=0,i<length,i++)
	{
		dst[i]=src[i];
	}
  return 0;
}

flashErase擦除Flash区间中指定长度代码,代码如下:

int flashErase(char *dst, int length){
	// TODO 
	for(int i=0;i<lenth;i++)
	{
		dst[i]=0xff;
	}
  return 0;
}

flashChipErase整块擦除Flash,代码如下:

int flashChipErase( ){
	for(int i=0;i<0x80000;i++)   //0x80000是FlashDev中的Flash size
	{
		*(char*)i=0xff;
	}
  return 0;
}

flashChecksum:如果Flash可直接读取,可以复制注释中代码到程序中。

算法工程的调试和使用

在调试算法工程前,将Compiler中的Optimization设为None(-O0),提高精准度。
观察main.c文件可见,Flash算法逻辑的核心是一个do while循环,通过g_func的全局变量,控制每次进入循环的入口,每个入口都是driver.c中二次开发的接口函数。由函数的参数调用可以看出,待烧写的数据都存储在g_rwBuffer数据空间中,需要操作的Flash地址是g_dstAddress这样一个全局变量。g_length是我们要操作的目标地址或buffer的宽度。
以烧写目标flashProgram为例,IDE CDK会设置待烧写的目标地址g_dstAddress,将要下载到Flash区间的数据写到g_rwBuffer中,然后把g_rwBuffer的长度设置为全局变量g_length。最重要的是,将g_func设置为1。
__bkpt_label()是一个汇编函数指令,是一个软断点,程序执行到这里时会始终停止,这样就完成了一次Flash操作。
main函数
可以通过硬件调试的方法模拟这种控制逻辑,检测逻辑是否正确。例如要调试flashProgram函数的正确性,先把g_func拖动到Watches窗口中,修改g_func为1。以同样的方式修改目标地址g_dstAddress和目标长度g_length。在Watches窗口下方的输入栏中输入取地字符&,再输入g_rwBuffer,添加到窗口中,可以查看g_rwBuffer的地址,再修改要烧写的数据。
Watches窗口
此时如果运行程序,会一直停在__bkpt_label()函数。我们可以把寄存器中pc的值直接设置在return寄存器中,令pc的值不指向断点指令。在riscv寄存器中,ra的值指向return address,因此将ra的值赋给pc。刷新程序运行光标(show cursor),可以看到程序在switch入口。然后在flashProgram函数的入口设置一个断点,这样全速运行程序后,程序会进入二次开发的逻辑中。可以在Memory中输入目标地址,查看是否写入正确。
在这里插入图片描述
在这里插入图片描述
执行完烧写函数后Memory的值
程序调试完成后,将将Compiler中的Optimization设为Optimize more(-O2),提高Flash运行效率。重新编译后,Flash工程就可以完成发布,点击Open Containing Folder,找到obj目录,就可以看到elf文件,即Flash算法文件。该算法文件可以用在后续的芯片SDK中。将
application_flash 工程根路径下 Obj/目录中生成的 application_flash.elf 算法文件 copy 到application 工程使用的 SmartL_Chip 组件的目录中去, CDK 工程视图右击菜单 Open Containing Folder 选项, 可以直接打开工程、 组件所在的目录。然后在工程视图 SmartL_Chip 组件节点的配置窗口中, 配置 SmartL_Flash.elf 作为算法文件。
在这里插入图片描述

硬件相关组件开发

硬件相关组件的开发都在SDK虚拟组件集下完成。
创建一个default的芯片组件,命名为_SmartL_Chip,更新当前的芯片组件。芯片组件的更新, 主要包含芯片外设驱动的代码的编写, 如果没有现成代码, 需要逐个添加, 编写代码, 如果存在驱动代码, 可以右击 _SmartL_Chip 组件节点, 选择 Add Source Folder, 将芯片组件需要包含的内容添加到芯片组件中。本例中, 将 _SmartL_Chip 组件使用的 csi_core 接口和驱动代码, 通过 Add Source Folder 的方式添加到芯片组件中。
在这里插入图片描述
配置芯片组件的选项,使这些代码能够正确的生成我们需要的镜像文件。csi_core和csi_driver的include目录,应该添加到工程整体的头文件中。右击_SmartL_Chip 组件节点, 选择 Options for…,在Compiler的Global Config中点击include进行添加,点击Add,将csi_core和csi_driver的include目录添加进去(或手动输入)。在Info tab中修改CPU的类型。芯片组件配置完成。
在这里插入图片描述
创建一个default的开发板组件,命名为_SmartL_Board,这里用Add Source Folder 的方式,给开发板导入一些外部资源。右击_SmartL_Board 组件节点, 选择 Options for…,在Compiler的Global Config中点击include进行添加头文件。
在这里插入图片描述
可以看到开发板的资源中包含ld文件,右击_SmartL_Board 组件节点,选择Linker选项,将ld文件包含在Link File选项中,即可完成开发板的配置工作。
可以在工程节点新建一个SDK组件,继承(clone)原有的SDK组件。硬件平台配置完成。
在这里插入图片描述

硬件无关组件开发

在工程根节点创建Common组件_SmartL_Libs,右击工程节点,选择Creat a Common Package。工程依赖的所有与硬件无关的组件都放在Packages目录下。同样右击_SmartL_Libs,用Add Source Folder 的方式,导入一些外部资源,再在Compiler的Global Config中点击include进行添加头文件。一个Common类型的组件即配置完成。
同样,我们需要把方案相关的一些资源导入到SDK工程中。右击工程节点,用Add Source Folder 的方式,导入。本例中导入一个csi_config.h配置文件。再右击工程节点,在Compiler的Global Config中添加include头文件。
在这里插入图片描述
一个SDK工程,即由方案逻辑、与平台相关的组件、与平台无关的组件组合而成。便于切换不同的平台。

发布SDK工程

发布过程就是将工程所有的组件全部上传到芯片开放社区中,供其他开发者使用。每个账户使用唯一的组件名。打包需要注意, 在打包的目录结构中, 工程目录与 Package Path 目录的相对路径关系,应 该 与 SDK 制 作 的 时 候 保 持 一 致 。 例 如 , 当 前 例 子 中 ,SmartL 工 程 在 桌 面 的project/my_solution/ 目 录 下 , 而 使 用 的 Package Path 目 录 是 桌 面 的project/my_pack_pool/目录, 那么发布的时候, 将桌面 project/my_solution/目录和桌面 project/my_pack_pool/目录共同拷贝到同一个目录 SmartLSDK 目录下, 然后压缩该目录作为一个 SDK 即可。

其他特色功能

CDK的AI部署工具。

  • 4
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值