Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页
    1. Home
    2. Hazelijy
    • Profile
    • Following 0
    • Followers 0
    • my integral 745
    • Topics 11
    • Posts 11
    • Best 1
    • Groups 0

    HazelijyLV 4

    @Hazelijy

    745
    integral
    1
    Reputation
    20
    Profile views
    11
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    Hazelijy Unfollow Follow

    Best posts made by Hazelijy

    • 【转载】关于d1哪吒开发板的启动流程分析

      关于d1哪吒开发板的启动流程分析

      原稿来自公众号:嵌入式IoT
      原创:bigmagic
      链接:关于d1哪吒开发板的启动流程分析

      • 1.本文概述
      • 2.D1上电后启动的第一个程序
      • 3.启动SPL
      • 4.启动opensbi
      • 5.裸机程序的编写
      • 6.小结

      1.本文概述

      从RISCV生态的角度上来看,D1哪吒开发板确实是一块不错的可以研究很深的开发板。本文主要从研究D1启动流程的角度出发,探索一下D1的裸机开发实践。对于研究D1的底层裸机开发,首先需要知道可以玩那些东西,也可以对RISCV相关的软件生态有比较透彻的理解,本文会从spl阶段到opensbi阶段以及后续阶段做一个简单的分析。

      2.D1上电后启动的第一个程序

      D1上电后,首先启动一个(Boot ROM)BROM。根据芯片手册的描述,该BROM的启动地址是0地址处开始启动。

      ec29a5bb-77a4-48ac-b6e3-71618132920f-image.png

      一共是48KB的内存空间用于运行BROM,那么这个BROM做了哪些事情?首先它根据efuse和GPIO选择了启动的媒体类型。支持的启动方式有

      • SD card
      • eMMC
      • SPI NOR Flash
      • SPI NAND Flash

      并且可以根据GPIO的选择和Efuse的选择决定启动的模式。同时也支持USB的启动方式,这就为fel启动方式做了很好铺垫。

      总的说来,BROM就是从其他的介质中读取SPL,然后放到SRAM中执行,同时也通过FEL运行环境。

      3.启动SPL

      当BROM启动完成后,接下来要去存储介质中寻找SPL的程序,这部分可以通过对全志D1 SDK的源代码进行查看。

      72a58f94-0cca-4fcb-b7b1-5a323debbb7d-image.png

      不难看出,在tina-d1-open的源代码下有lichee的代码。另外brandy-2.0下有spl、opensbi和u-boot的代码。通过对spl代码的研究,主要从流程上可以知道,spl的代码运行在sram中。

      351b9729-475b-481b-8893-c14a88963add-image.png

      通过查看,可以看到SRAM为32KB,但是实际编译出来的估计大小在32KB~64KB,远大于32KB,这样怀疑的可能性是SRAM可能大于32KB或者利用了DSP0 IRAM的空间。在编译的过程中,发现SPL的固件的头部一段区域,也就是0x00020000地址开始处的一段空间,是初始化的参数,SPL可以根据这个参数选择初始化的串口编号,初始化的DDR参数等等。在这里面编译的串口并非开发板的参数的串口参数,后面在制作固件的时候,会将头部的信息替换。为此我做了一个专门研究D1 哪吒裸机的仓库,来研究其实际的启动信息。

      https://github.com/bigmagic123/d1-nezha-baremeta
      

      首先下载平头哥的交叉编译工具链。

      链接:https://pan.baidu.com/s/1Mpfv_6BlarLSVZcgs548HQ 
      
      提取码:mipy
      

      然后通过设置

      export PATH=/yourpath/:$PATH
      

      将gcc的路径添加到环境变量,直接在spl目录下编译即可。

      编译后会在nboot的目录下生成相关的固件。

      a2e2346d-8a07-4f54-bf92-f78cd1600b94-image.png

      在生成的固件中,每个固件分别表示从哪种介质中启动下一阶段。前面说过,spl的头部存放了一些初始化的参数变量,所以我直接通过一个脚本make_download.sh将spl的头部一些信息替换了。这样下来,就能够正常的启动spl阶段了,并且可以正常的初始化DDR。按下开发板的FEL键并且上电。

      5d8c308f-e2f3-4211-8844-d62ba8cdf4e9-image.png

      下载可以利用tools/windows目录下的xfel工具进行下载。

      xfel.exe write 0x20000 boot0_sdcard_sun20iw1p1.bin
      
      xfel.exe exec 0x20000
      

      可以正常的启动SPL。xfel的工具是xboot大佬旨在打造全志裸机的万能开发工具,感觉用起来还是挺好。

      https://github.com/xboot/xfel
      

      当前xfel在d1上支持了ddr初始化,下载到SRAM和DDR3等操作,并支持运行程序。非常的强大,后面做裸机开发会经常用到,后续如果能够支持USB烧录SPI NAND Flash,那会更加的好用。那么在spl里做了哪些事情?首先SPL是运行在SRAM中的程序,这段程序受到SRAM尺寸大小的影响,并不会做的很复杂。主要功能来说:

      • 1.通过引脚判断是否启动JTAG
      • 2.初始化DDR
      • 3.使能MMU
      • 4.根据SD CARD、SPI NAND FLASH 、SPI NOR FLASH判断初始化那种外设。
      • 5.根据opensbi/rtos/uboot,将其搬运到DDR中执行,然后程序运行在DDR中。

      4.启动opensbi

      此时程序就运行在DDR中了,对于开发RISCV的人来说,opensbi并不陌生,一方面这个是后台常驻程序,提供S-mode和M-mode的转换层,另外也起到引导下一阶段程序的目的。这个d1下个阶段指的是uboot。然后opensbi就常驻在M-mode下了。作为独立的程序,我也在裸机层面去编译下载opensbi。

      https://github.com/bigmagic123/d1-nezha-baremeta/tree/main/opensbi
      

      编译的过程可以通过

      要想在d1上运行opensbi,首先需要根据下面的情况进行编译。

      cd d1-nezha-baremeta/opensbi
      

      然后导入环境变量

      export CROSS_COMPILE=/home/bigmagic/work/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-  PLATFORM_RISCV_ISA=rv64gcxthead FW_JUMP_ADDR=0x40200000 FW_TEXT_START=0x40000000
      

      最后进行编译

      make PLATFORM=thead/c910
      

      正常情况下,生成

      AS        platform/thead/c910/standby-normal/standby.o
       CC        platform/thead/c910/standby-normal/loadelf.o
       CC        platform/thead/c910/sunxi_platform.o
       CC        platform/thead/c910/opensbi_head.o
       AS        platform/thead/c910/sunxi_cpuidle.o
       CC        platform/thead/c910/sunxi_idle.o
       AR        platform/thead/c910/lib/libplatsbi.a
       AS        platform/thead/c910/firmware/fw_dynamic.o
       ELF       platform/thead/c910/firmware/fw_dynamic.elf
       OBJCOPY   platform/thead/c910/firmware/fw_dynamic.bin
       AS        platform/thead/c910/firmware/fw_jump.o
       ELF       platform/thead/c910/firmware/fw_jump.elf
       OBJCOPY   platform/thead/c910/firmware/fw_jump.bin
      

      可以把build/platform/thead/c910/firmware/fw_jump.bin文件下载。

      1c168109-975e-4827-a753-a631e270159d-image.png

      可以通过下面的三条指令进行下载

      .\xfel.exe ddr ddr3
      .\xfel.exe write 0x40000000 fw_jump.bin
      .\xfel.exe exec 0x40000000
      

      最后可以看到启动如下

      ec7c86d2-61c5-4df6-a34e-f5b92fb67ef0-image.png

      其中对opensbi的下载流程,实际上这里直接是通过xfel初始化ddr,然后将程序加载到ddr中直接启动运行。并没有通过spl阶段,如果想要自己编译的程序通过spl --> opensbi。可以在Linux上通过dd命令将程序烧录到sd卡中。

      b7d05074-6325-4212-a706-1298685f6b74-image.png

      这里将boot0的固件烧录到sd卡的8K处,系统可以正常的启动。

      5.裸机程序的编写

      在分析了上述SPL和opensbi的启动流程后,自行编译一个简单的裸机程序就容易许多。从启动流程的角度上来说,只需要实现初始化时钟、串口即可。这样就能够享受D1上裸机开发的乐趣了。更多的外设扩展需要根据芯片手册去进行编程。

      https://github.com/bigmagic123/d1-nezha-baremeta/tree/main/src/1.startup
      

      而烧录的流程,可以利用xfel初始化ddr,然后烧录到ddr中,这样方便调试。目前裸机开发代码比较好的可以参考xboot的代码。

      https://github.com/xboot/xboot/tree/test-d1
      

      xboot的底层也会用到基本的裸机编程部分的代码实现,也是非常值得研究和学习的。

      6.小结

      全志D1芯片的启动流程最底层的分析来看,和其他全志产品线的芯片的启动流程基本类似,主要需要理解的是fel模式下对SRAM,DDR等操作,这样在做裸机开发的时候,才能将程序下载进去。有了这些理解,在做riscv的底层编程的时候,才能透彻的理解其启动的流程和原理。

      posted in D1系列-RISC-V
      Hazelijy
      Hazelijy

    Latest posts made by Hazelijy

    • 腾讯优图ncnn新版本适配国产CPU,全志D1加持最高速度提升70倍!

      腾讯优图ncnn新版本适配国产CPU,全志D1加持最高速度提升70倍!

      随着自主信息技术创新应用的持续推进与发展,国产PC、国产OS和软硬件设备日趋成熟。为了更好的助力国产CPU在AI软件生态从“可用”到“好用”, ncnn作为腾讯优图实验室推出的首个高性能神经网络前向计算开源框架,近期在国产芯片之光D1和CPU龙芯上进行了较为全面的适配和性能优化,ncnn携手全志科技与龙芯共同打通了AI应用和国产CPU硬件间的壁垒!

      • ncnn
        是腾讯社交网络事业群公布的首个AI开源项目,也是腾讯优图实验室第一次对外公开深度学习的研究成果。ncnn于2017年7月正式开源,作为一个为手机端极致优化的高性能神经网络前向计算框架,在设计之初便将手机端的特殊场景融入核心理念,是业界首个为移动端优化的开源神经网络推断库。

      • D1
        是全志科技首款基于RISC-V指令集的芯片,集成了阿里平头哥64位C906核心,支持RVV,1GHz主频,可支持Linux、RTOS等系统。同时支持最高4K的H.265/H.264解码,内置一颗HiFi4 DSP,最高可外接2GB DDR3,可以应用于智慧城市、智能汽车、智能商显、智能家电、智能办公和科研教育等多个领域。

      • 龙芯
        是中国科学院计算所自主研发的通用CPU,采用自主LoongISA指令系统,兼容MIPS指令。
         

      本次ncnn更新的20210720版本,完成了risc-v与mips架构cpu的适配,并利用risc-v vector与mips msa矢量加速扩展指令集,优化了绝大多数常用算子的性能。在ncnn附带的benchmark测试中,在D1上速度可提升最高70倍!在龙芯CPU上速度提升最高18.64倍,满足了AI端侧推理部署的基本需求。

      8fc91725-1b0b-455f-bd84-a814cc2b3d41-image.png

      ncnn在全志D1上测试数据,速度最高提升70倍
       

      7860d3d5-0f01-422d-9dab-43ca17a0eab7-image.png

      ncnn在龙芯CPU上测试数据,速度最高提升18.64倍

       

       
      eac4d6d7-7efa-4680-8ff7-130f2920ceee-image.png

      D1开发板上使用ncnn部署nanodet检测算法效果
       
       
      28c09e90-8fd8-445f-98e8-33be3d7d3cf6-image.png

      龙芯2k派开发板上使用ncnn部署yolov5检测算法效果

       

      ncnn 20210720版本的其他更新

      - 支持 x86 avx-only cpu 优化加速

      - 数学函数 log/exp/tanh arm 优化

      - 提升 ncnn 量化工具的多线程效率

      - 修复某些手机gpu推理的内存泄漏和其他bugfix等等

      - 支持龙芯自主指令集架构loongarch

       

      测试平台-1

      D1,1线程,risc-v架构,开启v扩展

      5f75b3b5-f582-401f-af68-5208be6d6e7e-image.png

       
      ncnn在全志D1适配测试数据

      c179d129-fe48-466b-bd86-d3368a5620b5-image.png

       
       

      测试平台-2

      龙芯2K1000,2线程,mips架构,开启msa

      4801e68c-ca13-4b58-946e-20e7b40cfcaf-image.png

      ncnn在龙芯CPU上适配测试数据

      dce3d547-5ebb-4232-8b1a-f7f74aa29184-image.png

       

      最后,也欢迎大家访问ncnn项目主页,阅读Readme加入ncnn技术交流QQ群,与一线工程师和众多技术大佬沟通交流。

       

      详情见下:

      ncnn 20210720版本下载地址或点击阅读原文
      (linux/windows/macos/android/ios/webassembly,cpu+gpu)
      https://github.com/Tencent/ncnn/releases/tag/20210720

      ncnn开源项目访问地址
      https://github.com/Tencent/ncnn

      原贴转跳:腾讯优图ncnn新版本适配国产CPU,最高速度提升70倍

      posted in D1系列-RISC-V
      Hazelijy
      Hazelijy
    • 全志成为RISC-V International官方核心战略成员,「哪吒开发板体验」全球开放申请中

      全志成为RISC-V International官方核心战略成员,「哪吒开发板体验」全球开放申请中

      0ac04c23-e0d6-44cb-b7f6-30b42f97c234-image.png

      RISC-V作为开源趋势的代表,目的旨在激发创造力,让用户能更专注于应用的创新;因此,为使更多的开发者以及学研机构能更早的体验到RISC-V产品,RISC-V International官方核心战略成员:全志、阿里等,共同携手开启「哪吒开发板-全球体验申请活动」。

      申请方法

      1. 浏览器进入“RISC-V International官方申请”链接:https://riscv.org/risc-v-developer-boards/;

      2. 文章中找到“Google form”链接点击申请,或输入此链接直接跳转至申请表:https://docs.google.com/forms/d/1GDg3yY_PAOH1qtM4K5fxQj1yiwNgOnjPsajxqUaK934/viewform?edit_requested=true;

      3. 根据表格提示,正确填写申请表,RISC-V International官方会尽快回复体验申请。

      申请资格

      面向全球所有开发者、学生、学校、研究机构、企业等等,只要你对RISC-V感兴趣即可提出体验申请。

      活动细则

      • 列表RISC-V International官方将每周对申请进行收集、评估和审核;

      • 列表获取体验资格将按目的项目的价值高低进行优先级排序;

      • 列表申请成功者须每月回复RISC-V International官方所发送的项目反馈收集邮件;

      • 列表RISC-V International作为该计划的管理者将遵守美国的所有法律和其他政府规定;

      • 列表RISC-V International不提供直接技术支持;

      • 列表开发板供应有限,视供应情况而定。

      拥抱开源,拥抱信息技术的未来,全志正以开源开放的模式,打破学科壁垒,强化交叉融合,助力人才培养,助力集成电路事业创新发展。

      点击链接可直接跳转:RISC-V International官方申请链接

      posted in D1系列-RISC-V
      Hazelijy
      Hazelijy
    • 【转载】基于全志R329芯片的AI开发板免费发放

      基于全志R329芯片的AI开发板免费发放

      转自: 极术社区
      原文链接:基于全志R329芯片的AI开发板免费发放

      为了让开发者更快得体验搭载周易AIPU处理器的R329芯片,极术社区联合矽速科技共同推出了R329开发板,支持智能语音和视频,提供周易AIPU SDK下载。

      相关介绍可以查看R329开发板产品介绍。

      如何申请R329开发板?

      申请条件

      1. 面向对象:AI开发者,嵌入式开发者以及对嵌入式AI感兴趣的高等院校等群体。

      2. 分享和反馈:本次推出R329开发平台,旨在推广R329生态和应用的普及,让更多的人了解R329芯片。为了让R329开发板充分发挥它的作用,我们需要开发者预先在我们提供的周易AIPU SDK中的simulator里跑通AI模型,然后我们会免费提供R329开发板及相关环境。开发者需要在1个月内,将开发板的使用经验,开发经验或教程等,通过极术社区矽速科技专栏和矽速科技社区,与其他开发者分享。

      申请流程

      1. 直接点击报名参与按钮,提交周易AIPU SDK申请表,申请会在1~2个工作日内批准。

      2. 提交申请通过后,下载周易AIPU SDK后,在simulator里跑通相关模型,教程请见此处

      3. 请按照R329 开发板申请Sample发帖并提交给极术小姐姐,经确认后,会邮寄R329开发板寄到指定地址。

      4. 收到开发板一个月内,需要在之前的贴里补充评测说明,同时评测说明同步至矽速社区。

      5. 未按规定完成任务的会收回R329开发板。

      6. R329开发板教程请在收到开发板后在极术社区矽速科技查看,更多开发文档、教程等,将通过专区陆续开放。

      开发过程中,遇到任何问题,欢迎访问矽速科技及加入R329评测开发者交流群,有任何问题也可以直接在微信群里咨询。

      a734361a-63d8-4015-b07b-5a37dd0a3623-image.png

      如想直接购买R329开发板,请关注https://sipeed.taobao.com/

      本活动解释权属极术社区所有。

      posted in R128系列-智能硬件
      Hazelijy
      Hazelijy
    • 【转载】哪吒D1开发板RISC-V CLINT编程实践

      哪吒D1开发板RISC-V CLINT编程实践

      原稿来自公众号:嵌入式IoT
      原创:bigmagic
      链接:哪吒D1开发板RISC-V CLINT编程实践

      • 1.本文概述

      • 2.D1上的软件中断与定时器中断分析

      • 3.CLINT的编程模型与实际演示

        -3.1 设置中断向量入口地址

        -3.2 设置RISCV核的中断使能

        -3.3 设置CLINT的寄存器的值

      • 4.测试结果

      • 5.小结

      1.本文概述

      当前riscv的中断控制器部分比较简单,不像arm那样复杂,设计的简单分析起来就比较容易理解清楚。相比于ARM的GIC,RISC-V这一套CLINT与PLINT简直太容易理解了。或许是因为ARM迭代的时间很长,积累了很多设计上的经验,RISCV还需要经过实际的市场的考验,才能真正的看到中断控制这一块的设计到底是否简洁并且设计合理。

      在RISCV的设计上,其规范《riscv-spec-20191213.pdf》是这样描述中断、异常、陷阱的。

      中断:

      由RISC-V HART运行的程序,意外被打断,转向执行意外事件的一种机制。例如串口中断,定时器中断等等。

      异常:

      异常就是指RISC-V HART在正常运行的过程中,突然发生了意外的情况。例如访问了没有分配的内存,或者访问未定义的指令等等。

      陷阱:

      陷阱就是主动的被唤起去做一件意料之中的事情,比如系统调用,软件中断等等。

      上述对RISCV的中断、异常、陷阱的描述都不够完全的覆盖,只是说了大概的意思,深入理解RISCV的中断、异常、陷阱的设计可以直接查看官方文档。

      https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf
      

      根据RISC-V架构的定义,当前主流RISC-V芯片设计上的中断控制器。

      sifive的芯片基本上采用clint+plic。

      gd32vf103(eclic)

      d1(clint+plic)

      本文分析的d1上的clint编程模型,将能够很好的理解riscv的中断编程的设计。

      de156e50-1893-4172-ace2-80d394a97a95-image.png

      图片上概述了相对标准的RISCV中断控制部分的机制,对于D1单核的情况来看,CLINT只负责处理软件中断和时钟中断,因为这两个中断是RISC-V架构中定义的。经过CLINT不需要进行任何的仲裁,直接将中断(Software与Timer)送入D1的RISC-V核中。

      e8e08af3-c7a3-4c28-a1c3-6b2b327bf5b3-image.png

      由于Software与Timer中断不需要任何外设控制,可以直接控制其产生对应的中断。

      2.D1上的软件中断与定时器中断分析

      CLINT本质上也是一个核内外设,由于D1采用的是平头哥的玄铁C906,所以可以从官方网站下载C906手册。

      CLINT的全称(Core-Local Interruptor)核间局部中断。

      c59a09ef-6f26-46d7-8fae-14f908b0c73e-image.png

      主要是定义了M-Mode(机器模式)的软件中断和计时器比较中断,S-Mode(超级用户模式)下的软件中断和计时器比较中断。

      b172b86c-485a-40c6-b82a-806c3c1a070b-image.png

      基本上和官方定义的一样,但是玄铁c906并未实现mtime寄存器,这一点是需要注意的。mtimer寄存器的作用是读取当前的cycle。

      软件中断

      作为CLINT来说,软件中断只需要向CLINT的MSIP0或者SSIP0寄存器的最高位写1即可,处理完中断后,将其置为0,这样就能够清除掉软件中断的标志位。

      定时器中断

      作为riscv内核特有的中断,其用法就是往MTIMECMP或者STIMECMP中写特定的值,当mtime达到该值时产生中断,此时继续填写特定的tick就可以继续产生下个中断,反复如此,便可产生周期性的tick中断。

      3.CLINT的编程模型与实际演示

      原理层面上理解不难,那么实际操作时又该是怎样的编程模型呢?下面详细分析一下CLINT的编程模型。

      3.1 设置中断向量入口地址

      要想让其产生中断,必须告诉处理器中断的处理的入口地址,这里通过写入mtvec,当程序运行在机器模式下时,其程序的入口地址是_trap_handler。

      .global table_val_set
      table_val_set:
         la t0, _trap_handler
         csrw mtvec, t0
         jr ra
      

      riscv支持向量中断和非向量中断两种编程模型,这里只演示用非向量中断,也就是中断发生后,所有的入口只有一个,不固定偏移。

      在_trap_handler函数中,需要做的事情其实就是三件:

      保存现场,判断并执行中断处理函数,恢复现场。

      .globl _trap_handler
      _trap_handler:
         SAVE_CONTEXT
         csrr a0,mcause
         csrr a1,mepc
         call irq_handle_trap
         RESTORE_CONTEXT
         mret
      

      其中判断中断的入口可以通过mcause寄存器来判断具体中断发生的原因。

      e5369318-483f-42c4-8299-59187cc217e9-image.png

      对于D1 rv64架构,寄存器的位宽是64位,所以最高位是1表示中断,为0表示异常。

      对于irq_handle_trap实际的判断,需要根据中断类型,从而去执行对应的中断逻辑。

      这里有个非常关键的地方,就是中断产生后,现场的保护和恢复,以及什么时候开关中断的问题,这些细节可以优化,从而让程序状态调整到最佳。

      /*
      Register    ABI Name            Description                             Saver
      x0           zero               Hard-wired zero                         --
      x1           ra                 Return address                          Caller
      x2           sp                 Stack pointer                           Caller
      x3           gp                 Global pointer                          --
      x4           tp                 Thread pointer                          --
      x5-7         t0-2               Temporaries                             Caller
      x8           s0/fp              Saved register/frame pointer            Caller
      x9           s1                 Save register                           Caller
      x10-11       a0-1               Function arguments/return values        Caller
      x12-17       a2-7               Function arguments                      Caller
      x18-27       s2-11              Saved registers                         Caller
      x28-31       t3-6               Temporaries                             Caller
      -------------------------------------------------------------------------------
      f0-7         ft0-7              FP temporaries                          Caller
      f8-9         fs0-1              FP save registers                       Caller
      f10-11       fa0-1              FP arguments/return values              Caller
      f12-17       fa2-7              FP arguments                            Caller
      f18-27       fs2-11             FP saved registers                      Caller
      f28-31       ft8-11             FP temporaries                          Caller
      */
      

      在这些寄存器中,有些是可以不用压入栈中的,具体哪些,我以后会慢慢分析,只有对riscv寄存器的特性有了足够清晰的认识,设计出最佳压栈入栈的设计,将程序调整到最优。因为在高性能,高实时性的场合下,多一个寄存器的压入都是一笔性能的损失。

      那么到底什么时候开关中断,这个问题是非常重要的。默认情况下,中断产生后进入中断处理的第一条指令都是关闭中断的,所以这里可能会有两种模型。

      217e9926-07cb-4f35-890b-5287554829c5-image.png

      按照正常的处理流程,第一种效率高一些,缩短关闭全局中断的时间,可以很大程度上提高系统的实时性,但是其实第二种才是正确的结果。第一种情况可能会在寄存器出栈的过程中再次产生中断,由于寄存器数据还没有恢复完成,此时又压入寄存器,这样是没有意义的操作,就算处理得当效率反而会下降。

      第二种是比较简单和安全的,但是存在时间长度过长的问题。

      由于当前的riscv中断编程模型较为简单,不存在咬尾中断,中断嵌套等模型。在目前的riscv中断设计中,其中只见到芯来的ECLIC有咬尾中断的处理过程。下面简述一下原理。

      其实就是中断产生后,并不会直接跳转到具体的中断入口函数,由统一的入口进行分发处理。

      eclic新增了下面的指令。

      csrrw ra, CSR_JALMNXTI, ra
      

      该指令做了两件事

      1.判断是否有挂起中断,如果有跳转到中断向量入口,开始执行具体中断,没有则向下执行
      2.如果有挂起中断,跳转到中断处理程序后,再次回到该指令,看是否还有中断处理
      

      a3c5afde-6426-483d-b6c8-31c8410650a3-image.png

      整个过程的流程稍微复杂一些,但是这样却增加了实时性,中断处理效率更高效。当然,CLINT没有这种特性。所以使用起来比较简单一些。

      3.2 设置RISCV核的中断使能

      既然需要理解D1的CLINT的使用,那么就必须使能全局中断。

      全局中断的使能在 mstatus 寄存器中。

      .global all_interrupt_disable
      all_interrupt_disable:
        csrrci a0, mstatus, 8
        ret
      

      其中 mstatus 叫做机器模式处理器状态寄存器,其中记录了机器模式下的状态和控制信息。包括中断有效位,异常特权模式位等等。

      d86f7e9d-6030-4671-869c-a2f4aaef2850-image.png

      而第三位则是机器模式下的中断开启或者使能位。

      当然,全局中断使能,还不能结束,还要使能机器模式中断使能控制寄存器MIE。

      b4bf6f42-3e10-4370-b503-5df7700e6d1d-image.png

      该寄存器定义了当前处理器需要开启哪些中断类型,C906支持超级用户模式\机器模式下的三种中断。

      MEIE:外部中断

      MTIE:定时器中断

      MSIE:软件中断

      比如这里使能定时器中断,此时就需要开启MSTATUS的全局中断与中断使能寄存器MIE寄存器进行开启。

      3.3 设置CLINT的寄存器的值

      进行到这里,基本上riscv中断产生的条件就有了,就差最后一步,配置CLINT寄存器。

      #define D1_MSIP0        0x14000000
      #define D1_MTIMECMPL0   0x14004000
      #define D1_MTIMECMPH0   0x14004004
      
      #define D1_SSIP0        0x1400C000
      #define D1_STIMECMPL0   0x1400D000
      #define D1_STIMECMPH0   0x1400D004
      

      在D1上,CLINT的寄存器地址如上所示,比如开启定时器,那么只需要保证两点。C906自定义了一个机器模式扩展状态寄存器MXSTATUS。

      ed407d0b-9b94-497e-8496-a8493e3e619d-image.png

      保证第17位是1表示可以开启CLINT功能。

      另外,还需要将MTIMECMPL0的值设置的大于当前的时间基点。

      问题是标准的CLINT上有MTIME寄存器,而C906上可以通过time的csr来获取当前机器的时基。

      uint64_t counter(void)
      {
          uint64_t cnt;
          __asm__ __volatile__("csrr %0, time\n" : "=r"(cnt) :: "memory");
          return cnt;
      }
      

      设置定时器中断,主要分为三部分:

      1.开启全局中断

      通过设置mstatus寄存器。

      2.开启中断使能控制器

      通过设置mie寄存器开启定时器中断。

      3.设置clint的MTIMECMP寄存器

      让该计数值大于当前时间,即可产生定时器中断。

      csr_clear(mie, MIP_MTIP | MIP_MSIP);
      write32(CLINT + 0x4000, counter() + 1000000);
      write32(CLINT + 0x4004, 0);
      csr_set(mie,  MIP_MTIP | MIP_MSIP);
      

      这样就可正常产生定时器中断了。

      在中断处理程序中不断的添加MTIMECMP值即可。

      4.测试结果

      通过对结果的分析,可以看到正常的产生了定时器中断。

      0d27ece2-8e7e-4e56-8c25-5712ccc30c51-image.png

      mcause表示的是中断的原因,最高位是1表示中断,否则为陷阱或者异常。

      实现代码可以参考

      https://github.com/bigmagic123/d1-nezha-baremeta
      

      对D1裸机部分进行细致深入的分析。

      5.小结

      riscv的CLINT使用起来相比arm来说容易一些,掌握其编程模型,也非常容易实现自己的中断处理程序。但是不支持中断嵌套,更多的中断特性还需要实际的产品中使用才能真正的理解设计。

      对于CLINT,主要理解有两个中断,软件中断,定时器中断,这样两者几乎不依赖任何的驱动组件IP,所以一般做标准的RISCV核,都会集成这样的设计,对于编写操作系统,做生态软件的开发需要深刻理解。

      posted in D1系列-RISC-V
      Hazelijy
      Hazelijy
    • 【转载】用哪吒D1开发板体验riscv向量底层编程

      用哪吒D1开发板体验riscv向量底层编程

      原稿来自公众号:嵌入式IoT
      原创:bigmagic
      链接:用哪吒D1开发板体验riscv向量底层编程

      • 1.前言
      • 2.机器模式处理器状态寄存器(MSTATUS)
      • 3.编译选项支持V扩展
      • 4.RISCV向量计算的原理
      • 5.通过实例分析RISCV V扩展的运作机制
      • 6.RVV使用体验

      1.前言

      RISCV V扩展即向量指令扩展(RVV),这部分作为研究AI加速计算领域有着非常关键的作用。既然的D1支持了rvv扩展(0.7.1,最新的版本已经0.10版本),那么就实际的从底层原理角度分析一下使用的流程。利用了多媒体加速指令集,可以让计算变得更加的高效,同时并行计算的特性使得同时多次计算一组数字成为可能,类似于arm的NEON等等,那么RISCV又该如何去开启和使用V扩展指令,让计算变得更加高效呢?

      下面会通过一个裸机代码入手,结合实战去展示riscv rvv的使用。

      https://github.com/bigmagic123/d1-nezha-baremeta/tree/main/src/2.vector_example
      

      2.机器模式处理器状态寄存器(MSTATUS)

      机器模式状态处理寄存器可以查看玄铁C910的用户手册,开启的V扩展的位是[23:24]位,如果不设置这两位,那么使用V扩展指令的时候,会出现指令未定义的异常。

      dc17de47-a000-4246-9a8a-4c0577c468ad-image.png

      这里需要注意的是,RISCV的各家的VS标志并不是一定是这两位,比如sifive会定义在

      bec35594-a910-4405-8a00-7b1f37513640-image.png

      但是无论怎么说,都需要设置机器状态控制器去开启v扩展指令的支持。

      /* Enable FPU and accelerator if present */
      li t0, MSTATUS_FS | MSTATUS_XS | (0x01800000)
      csrs mstatus, t0
      

      在启动代码中,通过0x01800000设置mstatus开启V扩展支持。

      3.编译选项支持V扩展

      默认情况下,平头哥提供的交叉编译工具链已支持了V扩展的编译。只需要在编译选项中开启即可。

      661c2b00-4e03-4b71-a973-cb5805954297-image.png

      从传递给riscv 的gcc的选项来看,带有v扩展即可。

      -march是指定了riscv的模块化的指令集选项,可以通过选项指定目标RISC-V支持的模块化的指令集的组合。比如下面几种组合。

      rv32i[m][a][f[d]][c]
      rv32g[c]
      rv64i[m][a][f[d]][c]
      rv64g[c]
      

      往往也会结合-mabi进行使用。-mabi决定了RISCV目标支持的ABI函数调用的规程。

      4.RISCV向量计算的原理

      在riscv的V扩展中,一共定义了32个寄存器,v0~v31,这32个寄存器,每个长度都是VLEN长度。在玄铁C906定义长度为128位。

      而在V扩展的操作中,需要扩展下面的寄存器组。

      2b8da3a0-989c-4151-96cf-29d32db0eb7a-image.png

      下面来具体分析一些每个寄存器的作用。

      vstart

      矢量起始位置寄存器指定了执行矢量指令时起始元素位置,每条矢量指令执行后 VSTART 会被清零。

      该寄存器只有在处理器进入陷阱或者中断状态时,才会被硬件写入。

      所以的向量指令都会从vstart中给定的元素编号开始执行,支持完成后,自动变为0。

      为什么会有这个寄存器,原因是在V扩展指令中,每个寄存器是可以分割与合并的,并不是单独操作。

      vxsat

      这个是向量定点的饱和标志位,该位指示定点指令是否必须使输出值饱和,以此适应目标格式。

      vxrm

      向量定点舍入模式寄存器,指定了定点指令采用的舍入模式。

      8822162c-d7a1-4c29-b8a1-3c29e77667f6-image.png

      vl

      矢量长度寄存器指定了矢量指令更新目的寄存器的范围,矢量指令更新目的寄存器中元素序号小于 VL 的元素,清零目的寄存器中元素序号大于等于 VL 的元素。特别的,当 VSTART>=VL 或 VL 为 0 时,目的寄存器的所有元素不 被更新。该寄存器是任意模式下的只读寄存器,但是 vsetvli、vsetvl 以及 fault-only-first 指令能够更新该寄存器的值。

      该寄存器的值是通过vsetvli/vsetvl指令自动设置的。

      vtype

      VTYPE 寄存器指定了矢量寄存器组的数据类型以及矢量寄存器的元素组成。

      4f736c50-1799-4920-81d7-4006eac4bd09-image.png

      通过C910的数据手册,可看出

      8a49d018-ca87-4280-97d4-63164c9ac4bc-image.png

      向量长度寄存器VLENB

      该寄存器用于表示矢量寄存器的数据位宽,以实际位宽除以 8 得到的字节数体现。C906 矢量寄存器为 128 位,因此 VLENB 值固定为 16。该寄存器位长是 64 位,用户模式只读。

      5.通过实例分析RISCV V扩展的运作机制

      下面一个rvv实际的函数

      void test_v(void)
      {
        float a[]={1.0,2.0,3.0,4.0};
        float b[]={1.0,2.0,3.0,4.0};
        float c[]={0.0,0.0,0.0,0.0};
        int len=4;
        int i=0;
        //inline assembly for RVV 0.7.1
        //for(i=0; i<len; i++){c[i]=a[i]+b[i];}
        asm volatile(
                     "mv         t4,   %[LEN]       \n\t"
                     "mv         t1,   %[PA]        \n\t"
                     "mv         t2,   %[PB]        \n\t"
                     "mv         t3,   %[PC]        \n\t"
                     "LOOP1:                        \n\t"
                     "vsetvli    t0,   t4,   e32,m1 \n\t"
                     "sub        t4,   t4,   t0     \n\t"
                     "slli       t0,   t0,   2      \n\t" //Multiply number done by 4 bytes
                     "vle.v      v0,   (t1)         \n\t"
                     "add        t1,   t1,   t0     \n\t"
                     "vle.v      v1,   (t2)         \n\t"
                     "add        t2,   t2,   t0     \n\t"
                     "vfadd.vv   v2,   v0,   v1     \n\t"
                     "vse.v      v2,   (t3)         \n\t"
                     "add        t3,   t3,   t0     \n\t"
                     "bnez       t4,   LOOP1        \n\t"
                     :
                     :[LEN]"r"(len), [PA]"r"(a),[PB]"r"(b),[PC]"r"(c)
                     :"cc","memory", "t0", "t1", "t2", "t3", "t4",
                      "v0", "v1", "v2"
                     );
      
                    for(i=0; i<len; i++){
                                  printf("\n");
                                  printf("%f\n",c[i]);
                                  printf("\n");
                     }
      }
      

      这里采用的是内联汇编,可以更加深入的分析RVV的运作机制和底层原理。

      在riscv中,内联汇编的写法

      asm volatile("nop");
      

      这样编译器在编译后会生成可以执行的汇编代码。

      该函数的功能

      for(i=0; i<len; i++){c[i]=a[i]+b[i];}
      

      通过上述分析,通过向量计算,可以一次性计算出上面四次循环加法。

      vsetvli    t0,   t4,   e32,m1
      

      vsetvli表示设置每个向量的长度,t4的值表示的是len,也就是4。

      e32表示每个元素为32位,m1表示使用1倍数量的向量寄存器。

      该条指令相当于把一个向量寄存器(128位)分成四等分,这是一条设置指令,设置vl寄存器。返回值为t0,这里由于是刚好装下4条32位的数字,所以返回值为4。

      sub        t4,   t4,   t0
      

      通过查看数组是否计算完成,来进行循环计算,这里t4为0了。

      slli       t0,   t0,   2
      

      往左移动两位,也就是将t0乘以4。这里计算的目的是如果存在很长的数组,可以偏移t0个字节从而指向数组的下个地址。

      vle.v      v0,   (t1)
      

      填充向量寄存器(t1)为a数组,一条指令将数据放到向量寄存器v0中。

      add        t1,   t1,   t0
      

      将a数组的起始元素加上16字节(4个元素)的偏移。

      vle.v      v1,   (t2)
      

      填充b数组的数组到向量寄存器v1中。

      add        t2,   t2,   t0
      

      将数组b的元素的起始地址偏移16字节,也就是4个元素。

      vfadd.vv   v2,   v0,   v1
      

      执行向量加法,将向量的结果保存到向量寄存器v2中。

      vse.v      v2,   (t3)
      

      将向量寄存器中值写回到c数组中。

      add        t3,   t3,   t0
      

      将数组c的元素指针偏移4个元素。

      bnez       t4,   LOOP1
      

      直到计算的len长度为0,此时跳出循环计算。

      由于此时计算只有4字节,所以一次循环就计算完成了,不用多次计算。

      采用向量寄存器的计算,可以把四次循环计算用一次计算就完成。当然这种如果大量计算时,才能体现出更大的优势。

      最后的结果如下:

      e96daaad-0f2b-40d1-89dc-d30d5c4dd07d-image.png

      通过对数组的计算

      float a[]={1.0,2.0,3.0,4.0};
      float b[]={1.0,2.0,3.0,4.0};
      float c[]={0.0,0.0,0.0,0.0};
      

      最后c数组的结果

      float c[]={2.0,4.0,6.0,8.0};
      

      其理论数据和实际数据一样。

      6.RVV使用体验

      刚接触到riscv 的 V扩展编程时,很多概念都理解的很模糊,感觉十分的困难,通过一段时间梳理之后,发现和以前mips上接触的mxu或者arm的neno使用上大多数是一样的,就需要去设置使用寄存器的长度,当然这些底层函数如果进行一层封装后,再给用户使用,那才是比较方便的,但是本文只是介绍底层实现的原理,并不多介绍使用的细节。

      RVV还有一个特性就是寄存器的扩充,比如D1采用的玄铁C906的核,支持的是32个128位的向量寄存器,也可以将两个或多个向量寄存器拼成一个来使用。这样寄存器的长度更加长,能够同时做到并行计算也就更多。这取决于如何做向量的优化设计。

      posted in D1系列-RISC-V
      Hazelijy
      Hazelijy
    • 【转载】关于d1哪吒开发板的启动流程分析

      关于d1哪吒开发板的启动流程分析

      原稿来自公众号:嵌入式IoT
      原创:bigmagic
      链接:关于d1哪吒开发板的启动流程分析

      • 1.本文概述
      • 2.D1上电后启动的第一个程序
      • 3.启动SPL
      • 4.启动opensbi
      • 5.裸机程序的编写
      • 6.小结

      1.本文概述

      从RISCV生态的角度上来看,D1哪吒开发板确实是一块不错的可以研究很深的开发板。本文主要从研究D1启动流程的角度出发,探索一下D1的裸机开发实践。对于研究D1的底层裸机开发,首先需要知道可以玩那些东西,也可以对RISCV相关的软件生态有比较透彻的理解,本文会从spl阶段到opensbi阶段以及后续阶段做一个简单的分析。

      2.D1上电后启动的第一个程序

      D1上电后,首先启动一个(Boot ROM)BROM。根据芯片手册的描述,该BROM的启动地址是0地址处开始启动。

      ec29a5bb-77a4-48ac-b6e3-71618132920f-image.png

      一共是48KB的内存空间用于运行BROM,那么这个BROM做了哪些事情?首先它根据efuse和GPIO选择了启动的媒体类型。支持的启动方式有

      • SD card
      • eMMC
      • SPI NOR Flash
      • SPI NAND Flash

      并且可以根据GPIO的选择和Efuse的选择决定启动的模式。同时也支持USB的启动方式,这就为fel启动方式做了很好铺垫。

      总的说来,BROM就是从其他的介质中读取SPL,然后放到SRAM中执行,同时也通过FEL运行环境。

      3.启动SPL

      当BROM启动完成后,接下来要去存储介质中寻找SPL的程序,这部分可以通过对全志D1 SDK的源代码进行查看。

      72a58f94-0cca-4fcb-b7b1-5a323debbb7d-image.png

      不难看出,在tina-d1-open的源代码下有lichee的代码。另外brandy-2.0下有spl、opensbi和u-boot的代码。通过对spl代码的研究,主要从流程上可以知道,spl的代码运行在sram中。

      351b9729-475b-481b-8893-c14a88963add-image.png

      通过查看,可以看到SRAM为32KB,但是实际编译出来的估计大小在32KB~64KB,远大于32KB,这样怀疑的可能性是SRAM可能大于32KB或者利用了DSP0 IRAM的空间。在编译的过程中,发现SPL的固件的头部一段区域,也就是0x00020000地址开始处的一段空间,是初始化的参数,SPL可以根据这个参数选择初始化的串口编号,初始化的DDR参数等等。在这里面编译的串口并非开发板的参数的串口参数,后面在制作固件的时候,会将头部的信息替换。为此我做了一个专门研究D1 哪吒裸机的仓库,来研究其实际的启动信息。

      https://github.com/bigmagic123/d1-nezha-baremeta
      

      首先下载平头哥的交叉编译工具链。

      链接:https://pan.baidu.com/s/1Mpfv_6BlarLSVZcgs548HQ 
      
      提取码:mipy
      

      然后通过设置

      export PATH=/yourpath/:$PATH
      

      将gcc的路径添加到环境变量,直接在spl目录下编译即可。

      编译后会在nboot的目录下生成相关的固件。

      a2e2346d-8a07-4f54-bf92-f78cd1600b94-image.png

      在生成的固件中,每个固件分别表示从哪种介质中启动下一阶段。前面说过,spl的头部存放了一些初始化的参数变量,所以我直接通过一个脚本make_download.sh将spl的头部一些信息替换了。这样下来,就能够正常的启动spl阶段了,并且可以正常的初始化DDR。按下开发板的FEL键并且上电。

      5d8c308f-e2f3-4211-8844-d62ba8cdf4e9-image.png

      下载可以利用tools/windows目录下的xfel工具进行下载。

      xfel.exe write 0x20000 boot0_sdcard_sun20iw1p1.bin
      
      xfel.exe exec 0x20000
      

      可以正常的启动SPL。xfel的工具是xboot大佬旨在打造全志裸机的万能开发工具,感觉用起来还是挺好。

      https://github.com/xboot/xfel
      

      当前xfel在d1上支持了ddr初始化,下载到SRAM和DDR3等操作,并支持运行程序。非常的强大,后面做裸机开发会经常用到,后续如果能够支持USB烧录SPI NAND Flash,那会更加的好用。那么在spl里做了哪些事情?首先SPL是运行在SRAM中的程序,这段程序受到SRAM尺寸大小的影响,并不会做的很复杂。主要功能来说:

      • 1.通过引脚判断是否启动JTAG
      • 2.初始化DDR
      • 3.使能MMU
      • 4.根据SD CARD、SPI NAND FLASH 、SPI NOR FLASH判断初始化那种外设。
      • 5.根据opensbi/rtos/uboot,将其搬运到DDR中执行,然后程序运行在DDR中。

      4.启动opensbi

      此时程序就运行在DDR中了,对于开发RISCV的人来说,opensbi并不陌生,一方面这个是后台常驻程序,提供S-mode和M-mode的转换层,另外也起到引导下一阶段程序的目的。这个d1下个阶段指的是uboot。然后opensbi就常驻在M-mode下了。作为独立的程序,我也在裸机层面去编译下载opensbi。

      https://github.com/bigmagic123/d1-nezha-baremeta/tree/main/opensbi
      

      编译的过程可以通过

      要想在d1上运行opensbi,首先需要根据下面的情况进行编译。

      cd d1-nezha-baremeta/opensbi
      

      然后导入环境变量

      export CROSS_COMPILE=/home/bigmagic/work/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-  PLATFORM_RISCV_ISA=rv64gcxthead FW_JUMP_ADDR=0x40200000 FW_TEXT_START=0x40000000
      

      最后进行编译

      make PLATFORM=thead/c910
      

      正常情况下,生成

      AS        platform/thead/c910/standby-normal/standby.o
       CC        platform/thead/c910/standby-normal/loadelf.o
       CC        platform/thead/c910/sunxi_platform.o
       CC        platform/thead/c910/opensbi_head.o
       AS        platform/thead/c910/sunxi_cpuidle.o
       CC        platform/thead/c910/sunxi_idle.o
       AR        platform/thead/c910/lib/libplatsbi.a
       AS        platform/thead/c910/firmware/fw_dynamic.o
       ELF       platform/thead/c910/firmware/fw_dynamic.elf
       OBJCOPY   platform/thead/c910/firmware/fw_dynamic.bin
       AS        platform/thead/c910/firmware/fw_jump.o
       ELF       platform/thead/c910/firmware/fw_jump.elf
       OBJCOPY   platform/thead/c910/firmware/fw_jump.bin
      

      可以把build/platform/thead/c910/firmware/fw_jump.bin文件下载。

      1c168109-975e-4827-a753-a631e270159d-image.png

      可以通过下面的三条指令进行下载

      .\xfel.exe ddr ddr3
      .\xfel.exe write 0x40000000 fw_jump.bin
      .\xfel.exe exec 0x40000000
      

      最后可以看到启动如下

      ec7c86d2-61c5-4df6-a34e-f5b92fb67ef0-image.png

      其中对opensbi的下载流程,实际上这里直接是通过xfel初始化ddr,然后将程序加载到ddr中直接启动运行。并没有通过spl阶段,如果想要自己编译的程序通过spl --> opensbi。可以在Linux上通过dd命令将程序烧录到sd卡中。

      b7d05074-6325-4212-a706-1298685f6b74-image.png

      这里将boot0的固件烧录到sd卡的8K处,系统可以正常的启动。

      5.裸机程序的编写

      在分析了上述SPL和opensbi的启动流程后,自行编译一个简单的裸机程序就容易许多。从启动流程的角度上来说,只需要实现初始化时钟、串口即可。这样就能够享受D1上裸机开发的乐趣了。更多的外设扩展需要根据芯片手册去进行编程。

      https://github.com/bigmagic123/d1-nezha-baremeta/tree/main/src/1.startup
      

      而烧录的流程,可以利用xfel初始化ddr,然后烧录到ddr中,这样方便调试。目前裸机开发代码比较好的可以参考xboot的代码。

      https://github.com/xboot/xboot/tree/test-d1
      

      xboot的底层也会用到基本的裸机编程部分的代码实现,也是非常值得研究和学习的。

      6.小结

      全志D1芯片的启动流程最底层的分析来看,和其他全志产品线的芯片的启动流程基本类似,主要需要理解的是fel模式下对SRAM,DDR等操作,这样在做裸机开发的时候,才能将程序下载进去。有了这些理解,在做riscv的底层编程的时候,才能透彻的理解其启动的流程和原理。

      posted in D1系列-RISC-V
      Hazelijy
      Hazelijy
    • 【转载】全志D1开发板(哪吒 RISCV64)开箱评测

      全志D1开发板(哪吒 RISCV64)开箱评测

      原稿来自公众号:嵌入式IoT
      原创:bigmagic
      链接:全志D1开发板(哪吒 RISCV64)开箱评测

      • 1.概述

      • 2.开箱体验

      • 3.资料情况
        -3.1 上手情况
        -3.2 芯片文档

      • 4.总体感受

      1.概述

      作为主打RISC-V架构芯片的国产开发板,哪吒开发板这次的发布也算是良心之作。随着第一批板子的公开发售,立即购置一块,准备好好研究一下平头哥C906的处理器核以及探索一下这个开发板的可玩性。

      5e8a799b-66fe-4730-93fc-69d5c1eb8de2-image.png

      从以前断断续续的了解到的一些消息,只知道这个板子是类似于树莓派,主要是用来建立riscv上的生态,从而进行推广的。目前arm已经独霸江湖很久了,此时杀出了一个riscv,虽然目前riscv的生态建设远远没有arm强大,但是也在开源思想的引领下,开始逐步走向大众的视野。

      这块哪吒 RISCV64的板子,从主要的核的特性上来看,与目前市面上可见的riscv开发板相比,特性主要有以下几点:

      1.主频高

      主频高意味着处理性能的强劲,主频是1.1GHz,主要是运行Linux,目前因为riscv芯片流片出来的并且做成开发板的并不常见,而且主要是以MCU这类芯片为主,性能较弱,可玩性差一些。

      2.支持RVV

      这个也较为关键,在RISCV中对于多媒体加速指令上,采用的是V扩展,也就是RISCV V-extension。

      目前支持的RVV版本 v0.7版本,最新的正式发布版本为v0.10版本。

      有了V扩展,意味着计算性能的提升,此时图像处理、音视频处理的性能将大幅度的提升,做AI应用,也是非常好的选择。

      3.支持硬解码

      做音视频处理,支持硬件解码非常的占优势,做Linux的应用或者多媒体应用领域,这种芯片是必备的功能。增加了音视频,摄像头等功能,对该板子的可玩性,有着非常大的提升。

      bbfe92b9-ed03-4bef-a181-62d50832ef80-image.png

      因为这批板子是第一批公开售卖,所以淘宝上的售价目前为599RMB,从价格上来讲,同等价位的arm开发板可以选择的更多,性能更好,毕竟树莓派4b也只需要300~400RMB。

      从RISCV的开发板的角度上来说,这个价位也还可以接受,因为毕竟是一款高性能的完整的RISCV的开发板。

      2.开箱体验

      做开发板的开箱,也可以看到很多细节,可以看出产品设计的用心程度。

      354ae197-e8c8-4909-b2b4-cde99c163808-image.png

      该板子的外形特点主要还是比较像树莓派的,包括基本的布局,外设的摆放,外扩GPIO引脚等等。但是最有特点的还是wifi芯片上的一个哪吒的眼睛,让开发板瞬间增加了几分灵性。

      (开箱的细节视频可访问原文进行查看)

      因为开发板配套了各种线、还有一些转接扩展口等等,可见还是用了心在做开发板。

      开箱后,当然要上电进行通电测试,默认情况下,板子的SD卡中是有RVBOARDS提供烧录好的debian镜像的。给板子接上电源,接上HDMI线,还有USB的鼠标和键盘,等待许久,终于看到屏幕上出现了界面。

      188e35a4-1b5b-4532-9296-811c8b509331-image.png

      开机的时间有点长,输入用户名root,密码rvboards就进入了系统桌面。

      ca70d112-7e73-44e6-961a-888e927b6317-image.png

      通过网络设置,可以选择wifi联网或者有线网进入网络,这样就可以正常的上网了。

      接着又体验了一下命令行

      dde6ffa8-5ac3-4fd0-a5b7-f96b929ceb98-image.png

      通过查看isa,可以看到该riscv指令集支持的是rv64,,支持单双精度浮点,压缩指令以及V扩展等等。

      f2aa79c5-10b6-4f7d-8e46-2aa61cd170e7-image.png

      接着通过查看内存,知道总的内存为1G。

      be2b64d8-fdc5-4129-83c8-6bd0cb687674-image.png

      通过浏览器访问来看,很难打开网页,而且内存消耗很大,性能处理能力不够。

      120eca07-c3d5-47dd-8ae2-65c424e8be69-image.png

      也可能是优化做的不好,导致性能上不来。

      总的评价起来,基本功能可以使用,命令行也能流畅使用,桌面应用有些卡,拖动窗口应用有重影现象,浏览器访问网页也经常打不开,个人估计应该是优化做的不好。并且该处理器为单核,性能方面和树莓派等等还是有一些距离的。

      3.资料情况

      作为一款riscv开发板,其定位还算比较高,所以资料是否全面也是非常重要的。这直接关系到可玩性以及生态建设的问题。

      3.1 上手情况

      从当前的一些情况上来看,rvboards提供了一些基本的上手教程。

      https://www.rvboards.org/mkdocs/zh/nezha-d1/

      其开箱烧录就介绍了如何在SD卡中烧录Debian系统。

      可以跟着教程来进行烧录。就是利用PhoenixCard的工具,将镜像烧录到SD卡中,这一点和树莓派的操作方法有点类似。

      然后接上串口,就可以看到串口的输出信息了。

      7f87b5c2-d698-47b2-b7d3-128d3727cadc-image.png

      这里的串口是单独引出了,不像树莓派那样在排针上,好处是更加方便调试。

      通过对信息打印的分析,不难看出

      3a09091c-43a1-4b24-9e1f-d33d547a7fd9-image.png

      第一阶段的boot应该是芯片在探测启动方式,从板子的设计上来看,处理支持SD卡启动,也支持nand flash启动。

      8947756b-37d7-4eb0-a7d0-649edf81b52a-image.png

      第二和第三阶段的启动则是启动了opensbi和uboot,最后启动Linux的kernel。

      这样看来,和一般的riscv的启动流程基本一样。

      3.2 芯片文档

      芯片资料才是最关键的,包括芯片手册,寄存器手册,编程指南等等。

      目前论坛还比较rvboards的论坛还是很活跃

      https://www.rvboards.org/forum/cn/category/7/perf-abc-risc-v-soc-board

      还有awol的社区也很多相关的资料

      https://bbs.aw-ol.com/category/6/d1

      但是对于底层编程来说,关键的芯片手册,寄存器手册,还是很关键。

      全志的官网提供了一些相关的芯片资料

      2f48f2fd-f00a-4435-85ff-273f47b3490c-image.png

      这次发布的D1_User_Manual_V0.1长达1391页,内容还是比较详细。

      50adb102-d983-44ae-8fc5-ae70b702029c-image.png

      在软件类文档中,全志提供了一些SDK相关开发的指南,关于源代码可以通过官网上进行下载SDK,这部分源码基本上是开源的。

      4.总体感受

      初步上手了一下全志D1 哪吒开发板。从总体的性能上和树莓派没法正面对抗,但单从RISCV的角度上来说又值得研究。整个尝试下来,对新手并不是特别的友好,但是对于对RISCV有一定经验的工程师来说,也是算比较友好的了。

      树莓派虽然生态软件做的非常的不错,但是底层资料非常的缺乏,比如上电从GPU启动,而且还有一些高级外设资料不全,比如网卡,WIFI之类的全都不开源,另外完整的原理图也没有。玩上层应用很简单,但是底层就很复杂了。

      这块板子,因为只配置了单核,感觉学习Linux、学习riscv,使用rtos等等,都是不错的选择,我感觉移植rt-smart或者鸿蒙系统还是有点意思。

      posted in D1系列-RISC-V
      Hazelijy
      Hazelijy
    • 【转载】毕昇JDK 11 for RV64GC在D1开发板构建过程

      文章转自 知乎
      原文链接 https://zhuanlan.zhihu.com/p/386123758?utm_source=wechat_timeline&utm_medium=social&s_r=0&wechatShare=1
      作者 阿翔与山海经

      13560d74-e534-492e-8db0-4979167ee7b5-image.png

      前言

      作为嵌入式开发的初学者,这个构建过程对我来说,受益匪浅。。。

      特别感谢大神 @Bamboo 的倾情支援,泪目。。

      另外记录了开发过程遇到的一些问题

      https://github.com/openjdk-riscv/jdk11u/issues/156

      1、开发板的前期准备

      1.1 技术指导

      关于D1开发板,目前我拿到手是没有具体的开发说明书(产品盒子上给的是二维码),只提供了开发者交流论坛:

      由于某些原因,我们有时候需要科学上网才能登陆

      https://www.rvboards.org/forum/cn/topic/61/rvboards-哪吒-d1-debian系统镜像和安装方法/3

      1.2 板子介绍

      98aac583-20ad-4451-a8ba-cdc84a3abd2e-image.png

      1ff99e38-71d5-4fba-8c57-f88757cc8b64-image.png

      第一个图比较简单,主要是插了个32g的内存卡(具体作用下文介绍)

      主要注意第二个图:板子上有两个usb接口,“1”处是电源接口(也就是靠近HDMI接口的),另一个USB接口暂时没开发到。

      目前我是通过串口链接的,所以需要关注红圈处的串口顺序"黑绿白"(沿着DEBUG方向),另注意接好网线。

      1.3 烧录过程

      我拿到的板子的内存卡是空的,所以需要进行烧录,全志的网站提供了比较详细的教程了,基本上属于一键式傻瓜操作。

      其中需要下载相关的软件,下载地址需要先浏览上文的开发论坛:

      烧录工具

      本人用的系统镜像

      安装好烧录工具,解压

      4f27d040-aaa3-4686-abda-93ecf969f9aa-image.png

      1.4 连接

      下载对应串口驱动:

      全志在线开发者社区-资源下载

      安装完后进入“我的电脑->管理->串口”进行查看。

      本人使用的xshell连接工具,建一个链接,协议采用“serial”,串口出现的端口号与上文中的串口显示应该一致。

      毕昇jdk的构建

      在服务器上进行毕昇jdk的构建(交叉编译),具体编译过程参考

      https://zhuanlan.zhihu.com/p/302421409

      https://zhuanlan.zhihu.com/p/372067562

      2、交叉编译开始

      2.1 前提准备:

      ubuntu 18.04

      需要的安装包

      apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev  gawk build-essential bison flex texinfo gperf libtool patchutils bc   zlib1g-dev libexpat-dev git      libglib2.0-dev libfdt-dev libpixman-1-dev   libncurses5-dev libncursesw5-dev ninja-build   python3 autopoint pkg-config zip unzip screen   make libxext-dev libxrender-dev libxtst-dev     libxt-dev libcups2-dev libfreetype6-dev   mercurial libasound2-dev cmake libfontconfig1-dev git vim gettext rysnc wget
      

      2.2 交叉工具链 riscv-gnu-toolchain

      TIPS:这个过程是关键过程,由于D1的板子不支持2.33版本的glibc,导致在后续移植jdk时一直会报错,显示glibc的版本不支持。

      $ git clone https://github.com/riscv/riscv-gnu-toolchain
      $ cd riscv-gnu-toolchain
      #回退版本
      git checkout 6f498c63c9333d396b07dd572d2770b422e338a8
      $ git submodule update --init --recursive
      #子模块的回退处理
      cd  riscv-gcc
      git checkout riscv-gcc-10.2.0
      
      #进入子模块riscv-binutils 回退到24a16d8b93774234148bcb7d40b7ba7f00cb7991
      cd riscv-binutils
      git checkout 24a16d8b93774234148bcb7d40b7ba7f00cb7991
      
      #进入子模块riscv-gdb回退到 24a16d8b93774234148bcb7d40b7ba7f00cb7991
      cd riscv-gdb
      git checkout 24a16d8b93774234148bcb7d40b7ba7f00cb7991
      
      #进入子模块riscv-glibc回退到git checkout riscv-glibc-2.29:
      cd riscv-glibc
      git checkout riscv-glibc-2.29
      
      #进入子模块riscv-newlib 回退到47e698cc04109a188d8bba6be8f7fe2e307410a4:
      cd riscv-newlib
      git checkout 47e698cc04109a188d8bba6be8f7fe2e307410a4
      

      2.3 编译安装

      $ PREFIX="/path/to/riscv"
      $ cd riscv-gnu-toolchain
      $ ./configure --prefix="${PREFIX}"
      $ make newlib -j $(nproc)
      $ make linux -j $(nproc)
      $ export PATH="$PATH:$PREFIX/bin"
      $ export RISCV="$PREFIX"
      

      结束之后可以上述第一行以及最后两行加入到~/.bashrc中,并执行$ source ~/.bashrc方便以后的工作。

      3. 编译 QEMU(此过程在本次构建中的目的仅限于验证,所以安装成功与否意义不是很大)

      3.1 下载源码

      $ wget https://download.qemu.org/qemu-5.1.0.tar.xz
      $ tar xvJf qemu-5.1.0.tar.xz
      

      3.2 编译和安装

      $ cd qemu-5.1.0/
      $ ./configure --target-list=riscv64-softmmu,riscv64-linux-user --prefix=/path/to/qemu
      $ make -j $(nproc)
      $ sudo make install
      

      3.3 验证安装是否正确:

      $ /path/to/qemu/bin/qemu-system-riscv64 --version
      

      出现类似如下输出,则安装成功

      QEMU emulator version 5.1.0
      Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers
      

      安装额外的库文件(脚本来源 https://zhuanlan.zhihu.com/p/372067562)

      在进入到工具链安装目录/path/to/riscv,直接执行下面的脚本(vimxxx.sh复制粘贴下面的内容,然后sh xxx.sh执行脚本)

      #!/bin/bash
      
      mkdir build_ext_libs_riscv64 && cd build_ext_libs_riscv64
      
      git clone --depth=1 https://github.com/libffi/libffi
      
      git clone --depth=1 https://github.com/apple/cups
      
      git clone --depth=1 https://github.com/libexpat/libexpat
      
      git clone --depth=1 https://github.com/madler/zlib
      
      git clone --depth=1 https://github.com/glennrp/libpng
      
      wget https://download.savannah.gnu.org/releases/freetype/freetype-2.10.4.tar.gz && tar -xzvf freetype-2.10.4.tar.gz && mv freetype-2.10.4 freetype2 && rm -f freetype-2.10.4.tar.gz
      
      git clone -b json-c-0.13 --depth=1 https://github.com/json-c/json-c
      
      git clone --depth=1 https://gitlab.freedesktop.org/fontconfig/fontconfig
      
      git clone --depth=1 https://github.com/alsa-project/alsa-lib
      
      git clone --depth=1 https://github.com/karelzak/util-linux
      
      mkdir xorg && cd xorg && wget https://gitee.com/zdlgv5/jdk-riscv/raw/riscv/dev-riscv/toolchain/xorg_modules && git clone --depth=1 -b riscv64 https://gitee.com/zdlgv5/xorg-util-modular.git util/modular
      
      cd ..
      

      接着,之后在/path/to/riscv/build_ext_libs_riscv64目录下保存下述脚本为build_ext_libs_64.sh,执行脚本时输入工具链的路径作为参数:

      sh build_ext_libs_64.sh /path/to/riscv(注意这里不需要配置到/path/to/riscv/bin目录,且/path/to/riscv后不能带有/,脚本会自动配置环境变量$PATH)

      #!/bin/bash
      
      # exit on error
      set -e
      
      if [ ! -n "$1" ];then
          echo "Please designate riscv toolchain path"
          exit 1
      else
          riscvpath=$1
          echo "riscv toolchian path was set as: $riscvpath"
      fi
      
      export PATH=$riscvpath/bin:$PATH
      export sysroot=$riscvpath/sysroot
      export prefix=$sysroot/usr
      
      # libffi
      cd libffi && ./autogen.sh && ./configure --host=riscv64-unknown-linux-gnu --prefix=$prefix 
      
      make && make install
      
      cd -
      
      # cups
      cd cups && ./configure --host=riscv64-unknown-linux-gnu --disable-ssl --disable-gssapi --disable-avahi --disable-libusb --disable-dbus --disable-systemd
      
      make CFLAGS="-Wno-error=sign-conversion -Wno-error=format-truncation" CXXFLAGS="-Wno-error=sign-conversion -Wno-error=format-truncation" && make install DSTROOT=$sysroot
      
      cd -
      
      # libexpat
      cd libexpat/expat && ./buildconf.sh &&./configure --host=riscv64-unknown-linux-gnu --prefix=$prefix
      
      make && make install
      
      cd -
      
      # zlib
      cd zlib && CHOST=riscv64 CC=riscv64-unknown-linux-gnu-gcc AR=riscv64-unknown-linux-gnu-ar RANLIB=riscv64-unknown-linux-gnu-ranlib ./configure  --prefix=$prefix
      
      make && make install
      
      cd -
      
      # libpng
      cd libpng && ./configure --host=riscv64-unknown-linux-gnu --prefix=$prefix
      
      make && make install
      
      cd -
      
      # freetype2
      cd freetype2 && ./autogen.sh && ./configure --host=riscv64-unknown-linux-gnu --prefix=$prefix --with-brotli=no --with-harfbuzz=no --with-bzip2=no
      
      make && make install
      
      cd -
      
      # json-c
      cd json-c && ./autogen.sh &&  ./configure --host=riscv64-unknown-linux-gnu --prefix=$prefix
      
      make && make install
      
      cd -
      
      # fontconfig
      cd fontconfig && PKG_CONFIG_PATH=$prefix/lib/pkgconfig ./autogen.sh --host=riscv64-unknown-linux-gnu --prefix=$prefix
      
      make && make install
      
      cd -
      
      # alsa-lib
      cd alsa-lib && libtoolize --force --copy --automake && aclocal && autoheader && automake --foreign --copy --add-missing && autoconf && ./configure --host=riscv64-unknown-linux-gnu --prefix=$prefix
      
      make && make install
      
      cd -
      
      # util-linux
      cd util-linux && ./autogen.sh && ./configure --host=riscv64-unknown-linux-gnu --prefix=$prefix --disable-all-programs --enable-libuuid
      
      make && make install || true
      
      cd -
      
      # xorg
      cd xorg && CONFFLAGS="--host=riscv64-unknown-linux-gnu --disable-malloc0returnsnull" ./util/modular/build.sh --modfile ./xorg_modules --clone $prefix
      
      echo "Success. exit"
      

      tips:注意相比较原文,这里的脚本稍作修改了,主要是32-->64;

      4、编译JDK

      4.1获取毕昇JDK11 for RISCV的源码

      可以在gitee上获取毕昇JDK11 for RISCV的源码:

      $ git clone -b risc-v https://gitee.com/openeuler/bishengjdk-11.git
      

      也可以从软件所的github repo中获取(mirror):

      $ git clone -b risc-v https://github.com/isrc-cas/bishengjdk-11-mirror.git
      

      4.2 下载openJDK10:

      $ wget https://download.java.net/openjdk/jdk10/ri/jdk-10_linux-x64_bin_ri.tar.gz
      

      4.3 解压

      $ tar -xzvf jdk-10_linux-x64_bin_ri.tar.gz
      

      4.4 开始构建JDK

      bash configure \
      --openjdk-target=riscv64-unknown-linux-gnu \
      --disable-warnings-as-errors \
      --with-sysroot=/path/to/riscv/sysroot \
      --x-includes=/path/to/riscv/sysroot/usr/include \
      --x-libraries=/path/to/riscv/sysroot/usr/lib \
      --with-boot-jdk=/path/to/jdk-10 
      
      $ make images
      

      4.5 验证

      在/path/to/bishengjdk-11/build/linux-riscv64-normal-server-release/images/jdk/bin下输入

      /path/to/qemu/bin/qemu-riscv64 -L /path/to/riscv/sysroot ./java -version
      

      出现下述即成功

      root@5a51df28def0:/path/to/bishengjdk-11/build/linux-riscv64-normal-server-release/images/jdk/bin# /root/path/to/qemu/bin/qemu-riscv64 -L /root/path/to/riscv/sysroot ./java -version
      openjdk version "11.0.11-internal" 2021-04-20
      OpenJDK Runtime Environment (build 11.0.11-internal+0-adhoc..bishengjdk-11)
      OpenJDK 64-Bit Server VM (build 11.0.11-internal+0-adhoc..bishengjdk-11, mixed mode)
      root@5a51df28def0:/path/to/bishengjdk-11/build/linux-riscv64-normal-server-release/images/jdk/bin#
      

      至此,在服务器上毕昇jdk11的构建即完成,下面准备移植到D1开发板上

      5. 移植

      5.1 打包镜像

      注意路径,在/path/to/bishengjdk-11/build/linux-riscv64-normal-server-release/下

      $ tar -zcvf openjdk.tar.gz images/
      

      5.2 拷贝镜像

      5.2.1连接设置

      利用windows的powershell进行镜像的复制移动

      在windows 的C:\Users\zx.ssh路径下找到秘钥

      de6f8857-74b5-472f-94df-8fb6b7abefcf-image.png

      在config目录下,添加D1以及服务器的信息设置

      # Read more about SSH config files: https://linux.die.net/man/5/ssh_config
      Host p9//编译毕昇jdk的服务器
          HostName xxxxxx  //ip地址
          User xxxxx  //登录名
          Port 22
          TCPKeepAlive yes
          ServerAliveInterval 15
          ServerAliveCountMax 6
          StrictHostKeyChecking no
          ForwardAgent yes
          Compression yes
          IPQoS throughput
      
      Host D1
          HostName  xxxxxx  //ip地址,通过命令“ifconfig”查询
          User  xxxxx  //登录名
          Port 22
          TCPKeepAlive yes
          ServerAliveInterval 15
          ServerAliveCountMax 6
          StrictHostKeyChecking no
          ForwardAgent yes
          Compression yes
          IPQoS throughput
      

      在D1以及服务器的”~/.ssh/authorized_keys“添加C:\Users\zx.ssh路径下的authorized_keys,直接空一行添加,不用覆盖原秘钥(如果有)。

      Tips: 用powershell链接D1时,需要注意默认情况下ssh默认root用户不能登录(服务器本来就不是root用户)

      所以需要在D1上增加一个普通用户,用windows登录普通用户

      76d6345f-be8d-49e8-a78c-8b7f2d463b37-image.png

      5.2.2 传输镜像

      cf3336a2-da98-4c71-ada7-1b8419261cf7-image.png

      5.2.3 解压镜像

      $ tar -xzvf zxopenjdk.tar.gz
      

      注意镜像所在的路径

      zhangxiang@RVBoards:~$ ls
      bishengjdk.tar  jdk            jdk.tar      zxjdk.tar
      home            jdk-11.0.10+9  zxd1.tar.gz  zxopenjdk.tar.gz
      zhangxiang@RVBoards:~$ tar -xzvf zxopenjdk.tar.gz
      

      5.2.4 解压获得images文件

      cd  images/jdk/bin
      ./java -version
      

      5.2.5 出现下面情况即表示构建成功

      zhangxiang@RVBoards:~/images/jdk/bin$ ./java -version
      openjdk version "11.0.11-internal" 2021-04-20
      OpenJDK Runtime Environment (build 11.0.11-internal+0-adhoc..bishengjdk-11)
      OpenJDK 64-Bit Server VM (build 11.0.11-internal+0-adhoc..bishengjdk-11, mixed mode)
      

      注意:如果出现

      719b364e-b5e0-43ca-89d0-3496b1c1d0f7-image.png

      解决办法:

      sudo apt install zlib1g-dev
      
      posted in D1系列-RISC-V
      Hazelijy
      Hazelijy
    • 【转载】在全志d1开发板上玩ncnn

      文章转自 知乎
      原文链接 https://zhuanlan.zhihu.com/p/386312071?utm_source=wechat_session&utm_medium=social&utm_oi=33855348146176&utm_campaign=shareopn&s_r=0
      作者 nihui

      68e329cc-c078-44fb-ba1a-15e4fa95c6db-image.png

      可在不修改本文章内容和banner图前提下,转载本文

      这是我最后一次优化 risc-v
      这 1.4w 行代码是我最后的倔强
      你们不可能再看见我为这个 d1 写一行代码,不可能
      这 96 个 cpp 文件,我要用到 2030 年
      

      首先感谢全志科技公司送了我d1开发板,以及sipeed、rvboards在系统底层技术工作和支持,才有了ncnn AI推理库在risc-v架构上更好的优化 qwqwqwq

      0x0 ncnn risc-v 优化情况

      https://github.com/Tencent/ncnn

      ncnn 是腾讯开源的神经网络推理框架

      • 列表支持深度学习模型 caffe/mxnet/keras/pytorch(onnx)/darknet/tensorflow(mlir)

      • 列表跨平台:Windows/Linux/MacOS/Android/iOS/WebAssembly/...

      • 列表兼容多种 CPU 架构:x86/arm/mips/risc-v/...

      • 列表支持 GPU 加速:NVIDIA/AMD/Intel/Apple/ARM-Mali/Adreno/...

      • 列表支持各种常见的模型结构,比如 mobilenet/shufflenet/resnet/LSTM/SSD/yolo...

      • 列表很强,qq群请移驾 ncnn github 首页README

      因为据全(某)志(人)说,全志的用户基础都挺一般,可能不知道 ncnn 是什么东西,所以便罗嗦一番...

      从上次发了开箱自拍jpg,到现在一个月了,ncnn risc-v vector 优化情况还算不错,大部分重要的优化都做了,剩下一些会留给社区学生pr,和慢慢变聪明的编译器

      ncnn risc-v 目前使用 rvv-1.0 intrinisc 编写优化代码,并支持任意 vlen 的配置,面向未来顺便兼容了 d1开发板

      • 列表rvv-0.7.1 某些 intrinisc 转换可能有效率问题

      • 列表有遇到过 0.7.1 intrinisc 行为怪异只能写 C 代码绕过

      • 列表gcc 还比较笨,每行 intrinisc 都会加一条无用的 setvli 指令

      • 列表因为没法同时兼容 rvv-1.0 和 rvv-0.7.1,便没有写汇编

      • 列表一些算子,如 hardswish/hardsigmoid/binaryop/eltwise/slice/... 待优化(欢迎pr!!!qaq)

      下面这张图只是最近一周多的情况。如果跟最开始比,柱状图就太高了...

      0883e9a6-d02e-4ed8-8bb3-95df52795f13-image.png

      288428d9-f4ef-4002-af2b-012812e84834-image.png

      0x1 准备交叉编译工具链

      去平头哥芯片开放社区下载 工具链-900 系列
      ​
      平头哥芯片开放社区(OCC)

      比如 riscv64-linux-x86_64-20210512.tar.gz,下载后解压缩,设置环境变量

      tar -xf riscv64-linux-x86_64-20210512.tar.gz
      export RISCV_ROOT_PATH=/home/nihui/osd/riscv64-linux-x86_64-20210512
      

      0x2 下载和编译ncnn

      为 d1 架构交叉编译 ncnn

      因为编译器 bug,release 编译会导致运行时非法指令错误,必须使用 relwithdebinfo 编译哦

      • 列表ncnn 已支持直接用 simpleocv 替代 opencv 编译出 examples

      • 列表列表不需要配opencv啦!

      • 列表不需要配opencv啦!

      • 列表不需要配opencv啦!(重要,说了三遍)

      git clone https://github.com/Tencent/ncnn.git
      cd ncnn
      mkdir build-c906
      cd build-c906
      cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/c906.toolchain.cmake -DCMAKE_BUILD_TYPE=relwithdebinfo -DNCNN_OPENMP=OFF -DNCNN_THREADS=OFF -DNCNN_RUNTIME_CPU=OFF -DNCNN_RVV=ON -DNCNN_SIMPLEOCV=ON -DNCNN_BUILD_EXAMPLES=ON ..
      make -j32
      

      0x3 测试benchncnn

      d1 默认的 TinaLinux 执行 ncnn 程序时会发生非法指令错误,必须使用 Debian 系统哦

      • 列表vgg16 这类大型模型在内存不足时会发生 segmentation fault,是 d1开发板硬件条件不够,不管即可

      将 ncnn/build-c906/benchmark/benchncnn 和ncnn/benchmark/*.param 拷贝到 d1开发板上

      ./benchncnn 4 1 0 -1 0
      

      0x4 测试example

      将 ncnn/build-c906/examples/nanodet 和测试图片拷贝到 d1开发板上

      从这里下载 nanodet 模型文件并拷贝到 d1开发板上

      https://github.com/nihui/ncnn-assets/tree/master/models

      ./nanodet test.jpg
      

      输出检测结果信息,并保存在 image.png

      0 = 0.82324 at 200.04 44.89 198.96 x 253.33
      0 = 0.78271 at 32.98 63.45 178.15 x 232.92
      56 = 0.45923 at 1.46 71.92 90.14 x 117.85
      imshow save image to image.png
      waitKey stub
      

      把image.png下载到本地查看,结果已经画在图片上了!d1开发板AI目标检测成功 w

      20eeacd7-9ae7-4daf-868a-5fe9ab37d5ff-image.png

      0x5 mips大概也会安排啦,欢迎关注 ncnn github,加qq群交流!

      https://github.com/Tencent/ncnn

      qq群在 ncnn github 首页 readme 中~

      posted in D1系列-RISC-V
      Hazelijy
      Hazelijy
    • “创造 · 无限” 全志主题活动@2021 RISC-V中国峰会圆满收官!

       

      近日,“2021年RISC-V中国峰会”在上海科技大学圆满收官,在本次峰会中,本公司向用户展示了“RISC-V产品化“的多个场景生态方案,并举办了以“RISC-V产品化研讨”为主题的Workshop。

       

      5b8de7bd-56e0-4f14-b57a-b9c1ebe22f87-image.gif 6月22日倪光南院士在主题演讲中向观众介绍全志与平头哥联合推出的「D1芯片」与「哪吒开发板」

       
      同时,在6月23日全志科技产品研发中心总经理/全志在线总经理孙彦邦的演讲《RISC-V产品化之路》中,他分享到:“从发展历史来看,处理器技术一直向更开放的方向发展,RISC-V架构具有开放、精简、模块化、可扩展的优势,从全志科技D1芯片产品化的实践来看,这样的架构优势能更灵活的满足AIoT时代的定制需求。”
       

      889b4557-8d55-4b9a-92cd-9ad406114111-image.png本公司产品研发中心 总经理/全志在线 总经理 孙彦邦受邀分享

       

      主题Workshop

       
      全志作为RISC-V领域先锋,已在今年4月和5月分别发布了首颗应用处理器「D1」和开源开发板「哪吒」。6月24日,我们在峰会现场开展了自己的专属Workshop,以“RISC-V产品化”为主题向现场用户分享了全志在RISC-V领域的现有产品和未来生态建设布局。
       

      e1cb2ff6-f5bb-4618-976e-ae310a2b9d10-image.gif 本公司产品研发中心技术总监 黄少锐

      “全志作为SoC设计厂商,在RISC-V生态的构件上,我们更多关注在内核以下这一层。来自我们的产品研发中心技术总监黄少锐说到:“对于Linux生态,我们主要针对:第一,把整个BSP开放出来,把RISC-V的平台推到内核主线;第二,接入大家都熟悉的系统,包括Yocto、openWrt;第三,融入主流OS。总结来说就是开放BSP,融入OS。” 
       

      b82f48dc-c075-416a-beba-d67ed4ccc7ce-image.gif 本公司RISC-V产品总监 陈鹍遥

      本公司RISC-V产品总监 陈鹍遥 分享到:“「哪吒」是AP级别的芯片开发板,它不像普通的MCU,不是给一份寄存器手册给到开发者就可以玩起来的。需要非常丰富的软硬件支持才可以在上面开发。所以,我们给「哪吒」同步打包了非常丰富和完善的产品包,包括软件的配套、SDK、教学视频都已在平台开放。硬件部分,我们也联合合作伙伴一起做了周边的配件;同时,由于全志拥有多年的芯片级量产的经验,所以我们把调试工具也一并提供给给了开发者;最后,我们还搭建了社区平台,方便我们释放资料,以及给大家提供比较好的交流机制。”
       

      cfefbc4c-03ab-41fb-9781-5ffee9d07255-image.gif 红帽(Red Hat)高级工程师 傅炜

      全志的核心合作伙伴“红帽 Red Hat”高级工程师 傅炜在会上说到:整个生态,不单只是我们Red Hat在RISC-V上发力,我们跟众多行业中的社区、工程师、创客等等,都有在合作,很快就会有更多的选择提供给大家。大家可以看到,一旦有一个Linux搞定了以后,其他的慢慢都会起来,所以我们对「哪吒」开发板的前景、软件生态的前景都非常乐观,相信在未来一年左右的时间里面,支持D1的软件会越来越多,软件生态很快就会被建立起来。”
       

      cb6ee66f-9187-468f-8a2b-7a80f91a8885-image.gif 全志科技 产品研发中心 总经理/全志在线 总经理 孙彦邦

      最后,我们产品研发中心总经理/全志在线总经理孙彦邦分享到:“开源是不可阻挡的趋势,开源硬件与开源软件一样,它能够降低开发和创新的门槛,在根部为用户打好坚实的硬件基础,让用户真正能专注于有核心价值的“应用创新”,这是我们对全志RISC-V产品的期待,也是我们做RISC-V产品的初心。”
       
       

      Demo展示

       
      在峰会展区中,本公司还为观众准备了各类型Demo体验:

      339ab4a3-9f28-410a-af93-45115e82a72b-image.gif Debian操作系统+麦克风阵列声源定位demo(由合作伙伴Sipeed提供)
       

      359f5f94-048c-4056-850f-8d8c5561045e-image.gif Tina Linux:哪吒开发板官方自带系统,针对AIoT场景深度定制化,图为双屏高清显示功能演示
       

      697c66f3-04c6-46ea-9c99-ab042c2a4ad7-image.gif Fedora操作系统演示(由合作伙伴傅炜提供)
       

      73fd8a19-ec38-4458-852b-f2068e23ce34-image.gif Tina Linux+阿里云游戏demo(由合作伙伴阿里云提供)
       

      37467aa5-7d6b-4a37-abd7-b8a8f1c0cc32-image.gif Debian操作系统+摄像头 demo(由合作伙伴澎峰科技提供)
       

      通过本次峰会,我们不仅向观众展示了RISC-V领域的成果,线下与用户面对面沟通的形式也提高了全志对各方需求的进一步了解,并现场针对这些问题展开了研讨,有助于接下来产品的优化升级,建立更完整的生态。
       
      未来,我们将持续积极投入到RISC-V生态建设中去,携手行业伙伴,以开放的心态吸收更多“新能量”探索更多可能,共同构建更美好的万物互联的智能世界!
       

      posted in 公告
      Hazelijy
      Hazelijy