0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式AI从入门到放肆【K210篇】-- 硬件与环境

li5236 来源:稚晖君 作者:稚晖君 2022-03-30 14:58 次阅读

前言

关注我的同学都知道,在搞项目方面我一点也不挑食,有啥玩啥,擅于给自己找麻烦。

由于个人本职工作是搞AI的,在不久之前的一个项目中,我用STM32制作了一个小模块,探讨了一下“推理一个实用神经网络最低需要什么样的算力”这个问题。

在那个项目中,我成功在主频只有不到100MHz,sram只有32K的单片机上推理了一个自己训练的CNN-SLR网络模型,效果甚至还不错。

而这一次我准备来一波反向操作:尽可能用上算力最强的MCU,来看看在上面能跑多复杂的网络,因垂丝汀。

注意,我这里指明了使用的是MCU,所以移动设备上的各种SoC就不在讨论范畴了,要说原因的话,是因为移动端SoC之间的battle过于激烈,这个讨论留作后话,在这一篇里面就暂时按下不表了;另一方面由于二者不在一个价位段,没有可比性。

为了引出本篇要使用的MCU型号,首先我们来讨论一下嵌入式处理器的一个守恒定律,也即 功耗-价格-性能 不可兼得,如下图:

pYYBAGJD_uiAad8vAAGbAX2fsGw321.png

稍微解释一下上图的话就是,由于物理定律限制我们可以认为:在其他条件一定的情况下,性能和功耗肯定成正比,更强的性能意味着更大的功耗也就会产生更多的热量;而要想提升性能的同时还能保证功耗不变甚至更低的话,就只能改进芯片的架构或者改进制程工艺,这又会带来成本的提高。因而根据不同应用方向,我们可以选择兼顾其中两者的一些硬件平台:

成本低,性能弱,功耗也低:代表是各种单片机如STM32/AVR等。

成本低,性能强,但制程不高易发热:代表是各种低端SoC比如全志的H系列。

性能强,制程先进,但价格十分不友好,有钱还不一定给卖系列:代表是现在智能手机上使用的各种旗舰SoC,比如高通骁龙/海思麒麟/苹果A系。

那难道真的就没有三者兼得的芯片平台了吗?

其实还真有,本篇的主角K210就勉强算是一个,这也是我这次选择折腾这个项目的主要原因,接下来请听我仔细分析~

K210是个啥

K210是由一家叫做嘉楠的曾经做挖矿芯片的公司在去年推出的一款MCU,其特色在于芯片架构中包含了一个自研的神经网络硬件加速器KPU,可以高性能地进行卷积神经网络运算。

可不要以为MCU的性能就一定比不上高端SoC,至少在AI计算方面,K210的算力其实是相当可观的。根据嘉楠官方的描述,K210的KPU算力有0.8TOPS ,作为对比,拥有128个CUDA单元GPU英伟达Jetson Nano的算力是0.47TFLOPS ;而最新树莓派4只有不到0.1TFLOPS 。

当然了,这个性能跟某些旗舰级别的SoC还是有差距的:A76级别的CPU本身就已经很变态,更何况旗舰SoC上面都会搭载用于AI加速的硬件用于异构运算,比如高通的Hexagon DSP、苹果的Neural Engine、华为的达芬奇架构NPU等等,这些NPU在某些应用下甚至能达到与数百W功耗的桌面级GPU接近的算力(顺便提一下GTX1080Ti的双精度浮点算力是11.3 TFLOPS ),可以说是丧心病狂了。

值得注意的是,芯片的算力不一定和模型推理速度成正比,嵌入式AI的另一个核心是inference框架。对于CPU架构来说,是否使用SIMD(ARM从v7开始就支持NEON指令了)、是否使用多核多线程、是否有高效的卷积实现方式、是否有做汇编优化等等都会极大影响模型运行速度;而对DSP/NPU等硬件架构来说,是否对模型进行量化推理、量化的方式、访存的优化等也会有很大影响。

K210的其他参数如下:

双核 64-bit RISC-V RV64IMAFDC (RV64GC) CPU / 400MHz(可超频到600MHz)

双精度 FPU

8MiB 64bit 片上 SRAM(6MiB通用SRAM+2MiB的AI专用SRAM)

神经网络处理器(KPU) / 0.8TFLOPS

音频处理器(APU)

编程 IO 阵列 (FPIOA)

双硬件512点16位复数FFT

SPI, I2CUART, I2S, RTC, PWM, 定时器支持

AES, SHA256 加速器

直接内存存取控制器DMAC)

芯片采用BGA144封装,28nm制程工艺,芯片功耗低至0.35W,而成本,只要20+RMB。

想一下一块Arduino的板子要多少钱。..。..Arduino的性能和外设在K210面前就是个弟中弟(摊手)。

pYYBAGJD_vmAKe_UAAKbE52XW04854.png

那么K210又能做哪些事情呢?

多到让你怀疑它是否真的只是个单片机。..。..人脸检测、物体识别、播放视频、声场成像、3D渲染,甚至还能在上面跑FC模拟器玩游戏。..。..

可以去搜一下k210的一些应用视频演示,相信看完你会爱了的。

好了芯片就吹到这里,下面介绍一下市面上已有的一些K210开发板。

如何选择开发板

如果看完上面的介绍对K210产生了兴趣,那么下面我会推荐几款值得入手的K210开发板(如果不小心打了广告麻烦结一下广告费:D)。

其实我早在去年很早的时候就收到过K210的开发板了,当时是别人送的评测套件,只不过我那时不巧刚毕业,没有太多时间折腾,就一直拖到最近才有空仔细研究。另一方面的原因是,当时K210刚出,软件生态还非常的不成熟,而这个情况现在就好多了,不光有官方的IDE(还是develop版本),甚至还有MicroPython这样的固件的移植,可玩性高了很多,值得折腾一番。

我个人是打算后面自己设计一块K210开发板的,用于满足我个人的各种变态要求(主要是要狗迷你)。不过对于普通玩家而言,BGA的芯片可能不太适合自己DIY,所以可以按我下面的推荐进行购买即可,其中很多都是我亲自买过试用的。

1. 官方开发板套件-KD233

pYYBAGJD_wiAUOaVAAQwyka1mEM176.png

这个是嘉楠官方的评估板套件,好处呢在于可以和官方IDE中的例程项目无缝对接(当然如果不打算用官方IDE就无所谓了,这个后面软件篇会介绍),IDE中下载的例程都可以直接烧录运行。同时板子上的资源还是挺多的,摄像头、麦克风、LCD屏幕之类的都有,而且可以看到芯片周围有一圈跳线帽,把所有的IO都引出来了,也可以自己取掉跳线帽用杜邦线连接其他硬件。

缺点也很明显,这板子实在是太爱爱爱大了。..。.反正我是看不顺眼,虽然买了但是只是用来验证官方给的原理图是否无误,调试的时候还是用其他的板子。

价格偏贵,对于想自己设计硬件的同学可以购买,其他的就不推荐了。

2. Widora-AIRV2/BITK210开发板套件

poYBAGJD_xSABa-dAALOsLZ4ss8962.png

与第一个板子完全相反,这个是目前市面上能买到的最小的k210开发板,而且价格非常实惠。

这个开发板采用了核心板和底板分离的设计方式,适合那些想自己做硬件但是又无法设计核心电路的同学。核心板使用的封装是NGFF(Mini-PCIE)接口,把芯片最小系统和电源IC集成在了核心板,剩下的功能全部由金手指引出至底板。

可以看到核心板背面在K210的正下方布置有很多滤波电容,因为在这么高的运行主频下对电源的稳定性由很高要求,基本就是按照ARM CPU的Layout方式来设计PCB的。

板子也有带摄像头和LCD,但是默认摄像头的型号和官方开发板有点区别,官方的是OV5640,而这个带的是OV2640。当然了,这两个摄像头是完全pin-to-pin的,可以自己更换,修改一下软件驱动就行。屏幕也换成了2.4寸的小一点的ST7789驱动LCD,我个人还是觉得这屏幕太大(傲娇)。

还有一个缺点就是,这个板子的配套软件资源很少(可以说没有),当然了只要是K210的板子其实各家的软件都是可以用的,只不过由于硬件上的细微差别,需要自己修改一点源码(比如GPIO编号之类的)。

总的来说非常推荐,性价比也非常的高,适合在玩熟了之后用作以后项目的主力产品

3. Sipeed Maixduino 开发板

Sipeed就是之前做荔枝派的那家公司了,他们团队也推出了一系列的K210开发板,足以满足各种需求,Sipeed Maixduino就是其中一款。

pYYBAGJD_x6AcVbvAAKBnXYRKgE601.png

看这个开发板的名字里面还带个duino,该不会支持Arduino编程吧??

是的,惊不惊喜意不意外。

目前基础库的功能都已经实现了,感兴趣的同学可以去安装一下IDE先体验一下。

Maixduino显然是冲着兼容Arduino接口设计的,板子是标准的UNO型,相比与上面的两个开发板多了一个ESP32模块(话说ESP32也是一个网红硬件),官方开发板有的功能它都有,体型还挺小巧。

值得一提的是这个板子上面搭载的邮票孔核心板是可以单独购买的,叫做M1 Module,下面会进行介绍。

4. Sipeed M1 开发板套件

poYBAGJD_yeATJQQAAFoA6bkh1o927.png

这个板子使用的就是上面的那个M1 Module,采用核心板加底板的方式,比上面的要小巧很多,同时所有IO都有引出,可以看作一个最小系统洞洞板,我个人比较喜欢这种设计,相比于Widora的板子黑色沉金也更好看一些。

板子不算太贵,Sipeed 系列的K210板子最大的优势是,软件资源做得非常好,官网WiKi、教程、源码的开放都很到位,考虑到硬件和软件双方面的条件,Sipeed 的开发板是我最建议大家购买的。

他家还有其他型号的K210开发板,我就不一一介绍了,大家感兴趣的可以自己去某宝搜。

编程环境

K210是支持好几种编程环境的,从最基本的cmake命令行开发环境,到IDE开发环境,到Python脚本式开发环境都支持,下面会进行分别介绍。

这几种开发方式没有优劣之分,有的人喜欢用命令行+vim,有的人喜欢IDE图形界面,也有的人根本不关心编译环境觉得人生苦短只想写Python。

一般来说越基础的开发方式比如C语言+官方库会自由度越大,能充分发挥出芯片的各种外设功能,但是开发难度比较高,过程很繁琐;越顶层的开发方式比如写脚本,虽然十分地便捷,甚至连下载程序的过程都不需要了,但是程序功能的实现极度依赖于MicroPython的API更新,且很多高级系统功能无法使用。

1. 命令行开发环境

首先说一下,K210的官方SDK支持两种开发模式:FreeRTOS和Standalone(裸机)。

具体选择哪种模式取决于个人喜好,如果你之前用过FreeRTOS的话,应该可以很快熟悉SDK的相关接口。我个人对于单片机是更愿意使用裸机开发模式,因为如果要跑OS的话,我会倾向于使用能跑完整Linux系统的开发板,比如这个我自己做的Linux-Card。

用命令行开发的话建议在Linux环境下(Windows下用命令行总感觉怪怪的),下面介绍环境搭建方式。

1.1 下载SDK

在官网的资源下载页面下载相应的SDK:

https://kendryte.com/downloads/kendryte.com

poYBAGJD_zOAfQMAAACB6MBAqMs134.png

1.2 安装工具链

安装 build-essential 以获取 make 工具

$ sudo apt install build-essential

安装cmake

$ sudo apt install cmake

从勘智官网下载Ubuntu版本工具链,放到/opt目录并解压缩。

poYBAGJD_z2AbSqRAADofEqDJ40032.png

$ sudo mv kendryte-toolchain-ubuntu-amd64-8.2.0.tar.gz /opt$ cd /opt$ sudo tar -zxvf kendryte-toolchain-ubuntu-amd64-8.2.0.tar.gz

打开~/.bashrc文件,在文件末尾添加如下一行,将 /opt/kendryte-toolchain/bin 目录添加到PATH环境变量

export PATH=$PATH:/opt/kendryte-toolchain/bin

使修改生效

$ source ~/.bashrc

1.3 编译 hello world 工程

从Kendryte Github下载kendryte-standalone-sdk

$ git clone git@github.com:kendryte/kendryte-standalone-sdk.git

hello world工程在kendryte-standalone-sdk/src/hello_world目录下。

创建一个build目录并进入:

$ mkdir build && cd build

运行cmake

$ cmake 。. -DPROJ=hello_world -DTOOLCHAIN=/opt/kendryte-toolchain/bin

编译

$ make

会在build目录下生成.bin文件,接下来把这个文件烧录进芯片就ok了。

1.4 烧录固件

K210使用的是串口ISP进行下载程序(也支持J-Link调试不过个人感觉不太必要,这里就不介绍了)。

IO_16 用于boot 模式选择,上电复位时,拉高进入FLASH 启动,拉低进入ISP 模式。复位后,IO_0、IO_1、IO_2、IO_3 为JTAG 引脚,IO_4、IO_5 为ISP也就是UART0引脚。

上面介绍的K210的开发板都会板载USB-TTL串口的芯片,所以板子直接连上电脑,选择好串口号,就可以下载程序了,跟Arduino一样的体验。只不过下载过程需要用到一个下载工具,叫做K-Flash。

K-Flash的软件同样可以在上面的官网地址进行下载,软件操作界面很简单,选择bin文件、板子型号、串口号,点击下载就可以了。

poYBAGJD_0iAF8OuAAGOLdmuxPE936.png

1.5 打包Kfpkg固件

K210 的固件包主要有两种格式: .bin 和 .kfpkg。

.kfpkg可以包含多个.bin文件或者模型文件,可以方便地把程序固件和网络模型文件打包到一起一次性烧录,烧录方式是和bin文件一样的,用K-Flash即可。这里介绍如何制作kfpkg文件以及使用:

创建自己的 .kfpkg 文件

.bin文件是固件内容,作为参数传给烧录软件,软件会默认烧录到flash的0地址,完成后重启即可运行。

但是有时候我们需要烧录其它二进制文件到flash,比如模型、文件系统、或者自己定义的其它数据,这时需要指定烧录的地址,光有 .bin文件烧录工具并不知道我们想把数据烧录到flash的哪里,打包一个.kfpkg格式的文件则是为了解决这个问题的。

kfpkg由3部分组成:

flash-list.json文本文件:用于储存.bin文件列表以及烧录地址等信息

.bin固件

其他文件(二进制文件)

比如我们想同时下载名为XXX.bin的固件,以及YYY.bin的其它文件到Flash的0xA00000地址,则需要写一个 flash-list.json 文件,内容如下:

pYYBAGJD_1KAR85TAADAJCtiFR8394.png

注意sha256Prefix选项, 固件需要校验,所以为true, 而其它数据(比如模型数据)不需要,所以为false。

最后,将这三个文件(XXX.bin, YYY.bin, flash-list.json)压缩成zip文件,然后改后缀名为.kfpkg 即可被烧录工具识别,并按照指定地址烧录到flash。

2. IDE开发环境

对于想在Windows下开发的同学,可以使用官方提供的IDE,这也是我最常用的开放方式。

官方的IDE是基于Visual Studio Code开发的,非常好用,最主要是要有代码自动补全:D。

poYBAGJD_1uAJsQZAAK7x94dnp8906.png

2.1 下载IDE

在这个地址下载:

Kendryte IDE Downloadskendryte-ide.s3-website.cn-northwest-1.amazonaws.com.cn

poYBAGJD_2WAYK_TAAGnu6rnkUk417.png

下载完启动会自动联网更新组件,按下面的顺序点击下载官方例程:

pYYBAGJD_2-ADjnoAAE26JY-OU4854.png

IDE的好处就是可以自动化执行很多依赖项操作,这样操作:

pYYBAGJD_3mAdr72AAFXDAuj1WA781.png

然后就可以编译下载了:

poYBAGJD_4KAJ-N9AAE9xKGrbZQ185.png

如果编译报错的话,首先确认已经点了安装所有依赖,另外记得先点一下编译左边的垃圾桶图标进行项目清理,再尝试编译。

IDE下面这一排按钮其实就是顶部菜单栏的Kendryte选项下的内容。

另外值得注意的是,如果使用IDE的Flash Manager下载文件,一定要记得勾选交换大小端,否则烧录进去的格式是有问题的,切记!

3. MicroPython开发环境

上面介绍的两种开发环境都是编写代码,然后编译下载,而这里介绍的这种方式只需要下载一次固件,然后就可以用串口的方式进行Python交互,或者也可以把脚本存在SD卡里然后开机运行。

这种脚本式的交互固件式基于一个叫MicroPython的开源项目做的。

MicroPython 是基于 Python3 的语法做的一款解析器,包含了 Python3 的大多数基础语法, 主要运行在性能和内存有限的嵌入式芯片上(最早开始火的是STM32上),注意 Micropython 不包含 Python3 的所有语法。

poYBAGJD_4uAUIQEAAB976g0c5U660.png

MaixPy是将Micropython移植到K210的一个项目, 支持 MCU 常规操作, 也集成了机器视觉和麦克风阵列等模块, 以快速开发智能应用。

MaixPy项目的开源地址:

sipeed/MaixPygithub.com

Micropython 可以让我们在 K210 上编程更加简单快捷,比如我们需要寻找I2C总线上的设备,只需要使用如下代码即可实现:

poYBAGJD_5OAckSLAAB0TCobrZs695.png

同样,实现一个呼吸灯,只需要如下代码:

poYBAGJD_5uAAkdDAAFxEFUwya0821.png

实时拍照:

poYBAGJD_6SANhQUAADmk6o2e7w777.png

总之就是非常简单易用,感兴趣的同学可以移步官方WiKi和教程网站:

关于MaixPy · MaixPy 文档maixpy.sipeed.com

总结

本文从芯片架构,到开发板选型,再到软件开发环境的搭建介绍了关于K210的基础ABC,这块KPU其实有很多有意思的应用,我会在后面的文章中进行更多介绍,包括SDK中各个模块的使用方式,以及如何将自己的AI模型部署到K210上面去运行。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17040

    浏览量

    350511
  • 嵌入式
    +关注

    关注

    5076

    文章

    19045

    浏览量

    303853
  • AI
    AI
    +关注

    关注

    87

    文章

    30348

    浏览量

    268600
  • 稚晖君
    +关注

    关注

    5

    文章

    35

    浏览量

    5141
  • 嵌入式AI
    +关注

    关注

    0

    文章

    34

    浏览量

    815
收藏 人收藏

    评论

    相关推荐

    嵌入式学习建议

    培训班的宣传所误导,而忽视实际嵌入式系统软硬件基础知识的学习。 ⑤要避免片面地单纯“电子”或“计算机软件”角度认识嵌入式系统。前面说过,嵌入式
    发表于 10-22 11:41

    什么是嵌入式?一文读懂嵌入式主板

    在现代科技浪潮中,嵌入式技术已成为支撑各种智能设备和系统运行的核心力量。那么,究竟什么是嵌入式嵌入式系统,顾名思义,是将计算机的硬件和软件嵌入
    的头像 发表于 10-16 10:14 623次阅读

    《DNK210使用指南 -CanMV版 V1.0》第六章 Kendryte K210固件烧录

    第六章 Kendryte K210固件烧录 本章将为读者介绍Kendryte K210的固件烧录,以及Kendryte K210外部NOR Flash的空间分布。本章分为如下几个小节:6.1 外部
    发表于 09-12 14:20

    ARM MCU嵌入式开发 | 基于国产GD32F10x芯片+开始

    的整体架构图 展示了嵌入式系统的主要硬件组成,核心处理器各种外围硬件的详细布局。 嵌入式分类
    发表于 09-02 19:26

    《DNK210使用指南 -CanMV版 V1.0》第二章 Kendryte K210简介

    8x8x0.953mm的体积下封装了丰富的引脚资源和外设资源,Kendryte K210硬件资源,如表2.2.1所示:表2.2.1Kendryte K210硬件资源表从上表中可以看出
    发表于 08-30 17:34

    《DNK210使用指南 -CanMV版 V1.0》第一章本书学习方法

    ,坚持循序渐进的思路讲解,基础入门,从简单复杂;2,将知识进行分类介绍,简化学习过程;3,将板卡硬件资源介绍独立成一个文档《DNK
    发表于 08-28 17:57

    K210使用创世NAND flash完成火灾检测

    K210使用创世NAND flash完成火灾检测
    的头像 发表于 08-10 11:29 535次阅读
    <b class='flag-5'>K210</b>使用创世NAND flash完成火灾检测

    嵌入式软件开发与AI整合

    嵌入式软件开发与AI整合是当前技术发展的重要趋势之一。随着人工智能技术的快速发展,嵌入式系统越来越多地集成了AI算法,以实现更复杂的智能功能。以下是关于
    的头像 发表于 07-31 09:25 669次阅读
    <b class='flag-5'>嵌入式</b>软件开发与<b class='flag-5'>AI</b>整合

    嵌入式入门心得:从新手到老鸟的蜕变

    作为一名在嵌入式领域摸爬滚打多年的老鸟,我深知新手在入门时面临的困惑与挑战。嵌入式系统是一个复杂而迷人的领域,它涉及硬件、软件以及它们之间的交互。在这里,我想分享一些我的
    的头像 发表于 07-24 09:34 574次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>入门</b>心得:从新手到老鸟的蜕变

    菜鸟大牛!嵌入式完整学习路线:STM32单片机-RTOS-Linux

    嵌入式linux”的顺序帮助您入门进阶,掌握嵌入式开发的精髓。第一阶段单片机单片机是嵌入式
    的头像 发表于 07-23 16:11 3760次阅读
    <b class='flag-5'>从</b>菜鸟<b class='flag-5'>到</b>大牛!<b class='flag-5'>嵌入式</b>完整学习路线:STM32单片机-RTOS-Linux

    请问做图像处理可以用k210吗?

    做图像处理可以用k210吗?
    发表于 03-19 08:29

    ARM嵌入式Linux 系统开发入门精通

    ARM嵌入式Linux 系统开发入门精通
    发表于 03-10 18:44

    嵌入式学习步骤

    硬件组件。 (4).开发固件:编写嵌入式系统的固件,这是嵌入式系统的软件部分。固件负责控制硬件并执行特定任务。 (5).调试和测试:在将嵌入式
    发表于 02-02 15:24

    嵌入式自学好书推荐

    令、编辑器VI、编译器GCC、调试器GDB以及Make项目管理工具、Shell和Makefile脚本编写等知识,并搭建嵌入式开发环境。推荐书籍:《Linux入门
    发表于 01-11 15:13

    嵌入式硬件和软件哪个好?

    嵌入式硬件和软件哪个好? 嵌入式硬件工程师哪个更有前途呢?一起来看看。 嵌入式是分为软硬件工程
    发表于 12-05 15:17