RTT 全志D1s RDC2022纪念版开发板开箱使用分享与折腾记录
原文链接:https://bbs.aw-ol.com/topic/3021/
作者@caoxuetian
1:开发板介绍
RTT D1s RDC2022纪念版开发板是一块基于全志科技RISC-V内核 芯片 D1S的小尺寸开发板,尺寸仅为5.5cm*4cm,能够已非常小的体积带来舒适的开发感受:
到手开箱:

包装盒很精致,开发板暂时不用的时候可以放起来。


主板正面和背面集成了很多的元件,而且可供用户使用的也不少,以下是部分解析:


全志D1S芯片介绍
全志D1S是由全志公司推出的,基于阿里平头哥的C906内核的全新一代应用处理器。
C906兼容RISC-V架构,标配内存管理单元,可运行Linux等操作系统。C906采用5级整型流水线设计,并可选性能优异的单双精度浮点和128位矢量运算单元,
适用于消费类IPC、多媒体、消费类电子等应用领域
全志D1s,又名 F133,它是今年早些时候和支持 Linux 的开发板一起推出的全志D1 RISC-V 处理器的低成本版,它和D1的主要区别在于D1s内置的RAM是 64MB DDR2。
芯片框图如下:

原理图解析:
RTT D1s RDC2022纪念版开发板使用了核心板+底板的设计方式,一般核心板使用多层板设计,完成最小系统设计后,底板可以使用双面板设计,这样可以节省制作成本,也方便开发板在项目直接购核心板,自行根据项目需求设计底板,降低了硬件设计的繁琐程度。

主供电采用EA3036,提供0.9V, 1.8V, 3.3V三路电源供电,其中0.9V电压为内核电压,1.8V为全志D1S内封的DDR2内存供电,3.3V为外设接口供电。



板载了一颗贴片SD卡,四线SDIO模式,方便量产时直接SMT即可完成贴片,通过丝印查找出其型号为苏州澜智公司推出的1Gb (128MByte) SD NAND,采用SLC,稳定性比普通的TF卡高。

板载的CH340连接到的是D1s的GP8/PG9/USART3引脚,这个有印象即可,其他接口后面使用到的时候再做提及。
2: RT-Thread smart开发
RT-Thread smart介绍
RT-Thread Smart 是基于 RT-Thread 操作系统上的混合操作系统,简称为 rt-smart,它把应用从内核中独立出来,形成独立的用户态应用程序,并具备独立的地址空间(32 位系统上是 4G 的独立地址空间)。
以下是 rt-smart 的整体结构框图,在硬件平台的基础上通过 MMU、系统调用的方式把整个系统分成了内核态及用户态。

基于RTT D1s 开发板运行RT-smart
从上面的架构图中,我们可以看出,RM-smart层级关系是和linux内核具有一些相似之处的,都是分为用户态和内核态,我们开发一般也是从这两方面入手。
通过查阅全志D1的用户手册,我们可以知道,在默认情况下,其启动顺序为:
SMHC0 -> SPI NOR -> SPI NAND -> SMHC2
而RTT D1s开发板上的贴片SD卡连接到的正是SDIO0 (也就是SMHC0),那么我们只要把rt-smart的系统烧录到贴片SD卡里面,上电后就能够运行rt-smart操作系统了。
RT-smart操作系统在SD卡中的分区如下图:

- 从
0处开始的8KB空间是MBR分区头,这是文件系统规定的,直接跳过即可。 - 从
0x2000开始的是SPL,SPL类似于arm嵌入式开发中常用的uboot,主要起到的功能是初始化DDR2,从SD卡中把内核或下一阶段的引导程序等复制到DDR2中,然后把程序指针指向内存空间中对应的起始地址并运行。 - 从
0xE000开始的就是OpenSBI, 设备树和RT-smart内核,这一段代码会被复制到内存中以内核态运行。 - 从
0x800000开始的是用户态程序,用户自己编写的程序就下载到这个位置,以用户态运行。
内核态与用户态的编译
本段内容主要参考了这篇文章:快来尝鲜!!使用 D1s (RDC2022 纪念版) 运行 RT-Smart
SPL
当前阶段,RT-smart的SPL程序尚未开源,所以该部分程序我们直接在上面的帖子里翻到最后,下载附件里的二进制文件即可。最终SPL程序文件名称为:boot0_sdcard_sun20iw1p1_f133.bin
内核程序
开发环境:
- 虚拟机/实体机等方式运行
Ubuntu20.04
首先创建一个工作文件夹:
mkdir ~/work/rttd1s
cd ~/work/rttd1s
然后克隆用户态仓库到该目录:
git clone https://github.com/RT-Thread/userapps.git
进入该目录后,下载RT-smart内核代码,并执行环境变量配置:
cd userapps
git clone https://github.com/RT-Thread/rt-thread.git
source smart-env.sh riscv64
结果出现了报错:

打开脚本后,发现是SHELL_FOLDER这个变量获取失败了,他获取的是执行该命令时第一个参数的所在位置。我们这个脚本是通过source命令来执行的。
SHELL_FOLDER=$(cd $(dirname $0); pwd)
我们可以通过直接硬编码其位置来修复这个问题,就像下图这样:

再次执行,没有再出现错误。

配置工具链:
python3 tools/get_toolchain.py riscv64
编译内核程序
进入 rt-thread/bsp/allwinner/d1s 目录下
使用 scons --menuconfig 查看配置。smart 使用的串口为 UART3 ,对应引脚为 PG8 和 PG9。检查 UART3 是否开启,以及引脚是否正确。
> General Drivers Configuration > General Purpose UARTs > Enable UART3

然后检查内核是否是使用的uart3
> RT-Thread Kernel > Kernel Device Object

后面我们会需要点亮屏幕,所以在这里提前打开LCD驱动:
> General Drivers Configuration ─────

使用 scons 命令编译 内核
编译完内核之后,会自动执行打包命令 ./mksdimg.sh 打包出 sd.bin 镜像文件。该文件就是rt-smart系统的内核文件,根据上文中描述的那样,我们后面就会将其下载到SD卡的对应位置。
......
LINK rtthread.elf
riscv64-unknown-linux-musl-objcopy -O binary rtthread.elf rtthread.bin
riscv64-unknown-linux-musl-size rtthread.elftext data bss dec hex filename879356 60472 274136 1213964 12860c rtthread.elf
./mksdimg.sh
Allwinner TOC1 Image
Size: 1072640 bytes
Contents: 3 items00000000:00000490 Headers00000600:000188e0 => 40000000 opensbi00019000:00007475 => 40200000 dtb00020600:000e5748 => 40400000 kernel
scons: done building targets.

编译用户态程序
打包用户态程序需要用到当前目录下制作SDcard镜像的脚本,我们回到userapps主目录然后把脚本复制过去.
cd ~/work/rttd1s/userapps/
cp rt-thread/bsp/allwinner/d1s/mksdcard.sh ./mksdcard.sh
在当前目录下执行scons ,编译用户态程序,当出现提示scons: done building targets后,即为编译成功。
$ scons
.....
....
scons: done building targets
然后在当前目录下运行mkcard.sh,没有提示报错,即为成功,在当前目录下会生成sdroot.bin,这就是我们的用户态镜像,我们会将其烧录到sd卡的对应位置。

下载烧录
通过前文的努力,我们已经获得了所需的3个文件,分别是rt-smart提供的SPL,我们自己编译的内核文件和用户态文件,下面我介绍将其下载到开发板上SD卡的方法:
我们需要使用带数据传输功能的USB-TYPE-C线缆连接开发板的USB接口和电脑。这里有两种方法:
- 首先按住开发板上的
FEL按键,然后插入电脑上电 - 先把线缆连接好,然后按住
FEL按键,点击一次RST按键
,默认情况下会出现一个新的USB设备,但是会提示没有驱动。

然后我们需要使用zadig这个软件给该设备强制安装winusb驱动,zadig这个软件在前面的帖子里或者互联网上都可以找到。打开软件后,确认当前显示的设备是Unknown Device #1,然后安装驱动。


驱动安装完成之后,我们就可以使用xfel这个软件来下载程序了,改软件同样在上面帖子最后的附件里。
烧录的命令有三个,分别如下:
烧录boot镜像:
xfel.exe sd write 8192 boot0_sdcard_sun20iw1p1_f133.bin
烧录内核镜像:
xfel.exe sd write 57344 sd.bin
烧录用户态应用
xfel.exe sd write 8388608 sdroot.bin
我们把从Ubuntu中编译完的镜像复制到xfel同级目录,然后依次运行以上命令即可。命令中的sd write就是指烧录到贴片sd卡里,后面的数字是烧录的起始地址,就对应着SPL, 内核和用户态程序的起始地址。
PS E:\MP\RTT-D1S\RDC资料\出厂固件+工具> ./xfel.exe sd write 8192 boot0_sdcard_sun20iw1p1_f133.bin
write 48Kbytes
swap buf:00023E00,len=512, cmdlen=512
Found SD card 125173760 bytes
100% [================================================] 48.000 KB, 226.353 KB/s
PS E:\MP\RTT-D1S\RDC资料\出厂固件+工具> ./xfel.exe sd write 57344 sd.bin
align up to 8KB, write 1072640 ==> 1048Kbytes
swap buf:00023E00,len=512, cmdlen=512
Found SD card 125173760 bytes
100% [================================================] 1.023 MB, 218.882 KB/s
PS E:\MP\RTT-D1S\RDC资料\出厂固件+工具> ./xfel.exe sd write 8388608 sdroot.bin
write 8192Kbytes
swap buf:00023E00,len=512, cmdlen=512
Found SD card 125173760 bytes
100% [================================================] 8.000 MB, 217.951 KB/s
烧录完成后,我们将串口的USB接口连接到电脑,然后重新上电即可运行。
串口的软件这里推荐使用mobaXterm,打开软件后, 创建一个新的串口,波特率默认为500000。依次点击以下按钮:

然后按下重启键,就可以看到rt-smart系统已经运行起来了。
\ | /
- RT - Thread Smart Operating System/ | \ 5.0.0 build Feb 22 2023 22:26:542006 - 2022 Copyright by RT-Thread team
hal_sdc_create 0
card_detect insert
Initial card success. capacity :60014MB
sdmmc bytes_per_secotr:200, sector count:7537400
found part[0], begin: 8388608, size: 58.614GB
found partition:sd0 of mbr at offset 0x0000000000004000, size:0x0000000007533400
hal_sdc_create 1
card_detect insert
Initial card failed!!
[E/drv-sdmmc] init sdmmc failed!
[E/drv-sdmmc] sdmmc_init failed!
[D/FAL] (fal_flash_init:47) Flash device | sdcard0 | addr: 0x00000000 | len: 0xa6e80000 | blk_size: 0x00000200 |initialized finish.
[I/FAL] ==================== FAL partition table ====================
[I/FAL] | name | flash_dev | offset | length |
[I/FAL] -------------------------------------------------------------
[I/FAL] | download | sdcard0 | 0x00800000 | 0x00800000 |
[I/FAL] | easyflash | sdcard0 | 0x01000000 | 0x00100000 |
[I/FAL] | filesystem | sdcard0 | 0x01100000 | 0x00c00000 |
[I/FAL] =============================================================
[I/FAL] RT-Thread Flash Abstraction Layer initialize success.
Hello RISC-V
[W/DBG] disp:[parser_disp_init_para 575]of_property_read screen1_output_type failmsh />Mount "sd0p0" on "/" success
hal_sdc_create 1
[os E] OS_MutexCreate():42, handle 0x4056e348
card_detect insert
mmc_send_app_op_cond,109 100
Initial card failed!!
[E/drv-sdmmc] init sdmmc failed!
sdmmc bytes_per_secotr:200, sector count:0
[E/drv-sdmmc] read offset 0 over part sector 0
[E/drv-sdmmc] device read mbr 1-sector failuremsh />ls bin/
Directory bin/:
hello.elf 341224
ping.elf 347336
pong.elf 342160
umailbox.elf 357440
vi.elf 517464
webclient.elf 393032
webserver.elf 489416
msh />
而RT-smart的msh就类似于linux里的shell,使用ls命令是查看文件, 用户态程序存放在bin文件夹下。
用户程序开发
RT-smart的用户态程序是和内核分离的,我们在userapps文件夹下可以看到一个叫做apps的文件夹,里面存放的就是用户程序的代码,每个程序以文件夹的形式分开。

默认带的这些程序就是rt-smart自带的示例,用于演示相关api的使用。
比如这里的hello程序,执行后功能就是在控制台打印出一行hello, world!\n。
我们需要开发任何用户程序都是按照类似的流程做的。
我们在msh里运行bin/hello,查看一下效果:
msh />bin/hello.elf
msh />hello world!
如果我们要创建新的程序,就复制hello程序目录到当前文件夹,然后在此基础上进行开发,程序写完后依然是使用scons命令完成编译,mksdcard.sh打包镜像即可
运行lvgl
在rt-smart上运行lvgl也很方便,而且得益于rt-smart的内核态与用户态分离,我们可以很方便的借(zhao)鉴(chao)大佬们之前的研究成果。
这里非常感谢网友Rb君的努力!他的工作如下:
丝滑的在RT-Smart用户态运行LVGL
https://club.rt-thread.org/ask/article/e8bc90918bd055eb.html
具体的原理我这里不再赘述,大家可以进他的帖子看看,我这里给出最快速的体验方法:
首先克隆 lvgl用户态程序
mkdir git_projs
cd git_projs/
git clone https://github.com/Rbb666/RT-Smart-UserAPP.git
cd .. # 回到userapps目录
cp -r git_projs/RT-Smart-UserAPP/userapps/media/ ./ # 复制media文件夹到我们的userapps
然后我们需要修改scons的编译脚本,这里用任何喜欢的编辑器打开userapps目录下的SConstruct文件,翻到最后,添加一行编译media文件夹:

因为我手上只有一块不支持电容触摸的RGB-LCD屏幕,所以很遗憾,我在这里将lvgldemo 里的auto play打开,达到不需要触屏,自动播放的效果。

然后依然是使用scons编译用户程序,mksdcard.sh打包镜像,重新下载到贴片TF卡中后,即可运行lvgl程序下面是效果演示:

可以看到效果还是很不错的,480*272分辨率的屏幕能够达到60fps.
3: 感想
RISCV内核是一种全新开放指令集risc核心,打断了之前arm内核在相关领域内的垄断低位,几年内就推出了应用处理器级别的SOC,具有强大的性能,而且开发方式和之前基于arm的开发基本没有什么区别。
RT-smart操作系统其实我之前并未怎么了解,只知道是一种用于应用处理器(带MMU)的实时操作系统。
经过实际使用下来,我感觉用起来还是很舒服的,有别于linux,其具有启动快,中断快等优点,(arm-linux启动一般都需要数十秒,rt-smart可能只需要1秒)
使用scons开发,这一点也有别于linux的那一套makefile。需要一定的学习过程。
但是最大的问题是相关的文档还是太缺少了,光是对rt-smart这一套概念的理解就花了不少的时间,希望国内厂商以后还是能够在文档相关的工作做的更好。
4: 感谢
快来尝鲜!!使用 D1s (RDC2022 纪念版) 运行 RT-Smart
丝滑的在RT-Smart用户态运行LVGL
相关文章:
RTT 全志D1s RDC2022纪念版开发板开箱使用分享与折腾记录
原文链接:https://bbs.aw-ol.com/topic/3021/ 作者caoxuetian 1:开发板介绍 RTT D1s RDC2022纪念版开发板是一块基于全志科技RISC-V内核 芯片 D1S的小尺寸开发板,尺寸仅为5.5cm*4cm,能够已非常小的体积带来舒适的开发感受&#…...
24日常实习万得一面面径
文章目录分析与复盘面试题分析与复盘 应该将项目进行复习好的,两个项目都应该对简历写的那些进行复习,以为日常不问项目的一面。哭死… 面试题 1.自我介绍 2.为什么从土木转到开发,学习java有哪些途径 3.介绍下项目中你觉得最有设计的模…...
MySQL的DML和DDL操作(1)
这里介绍几种DML操作INSERT INTO——插入记录插入一条记录插入一条记录 INSERT INTO table [(column [, column . ])] VALUES(value [,value . ]); 例子: insert into student values( 1,"承太郎" )default charset utf8;插入多条记录插入多条…...
Kafka系列之:Kafka生产者和消费者
Kafka系列之:Kafka生产者和消费者 一、Kafka生产者发送流程二、提高生产者吞吐量三、Kafka消费方式四、Kafka消费者总体工作流程五、按照时间消费Kafka Topic一、Kafka生产者发送流程 batch.size:只有数据积累到batch.size之后,sender才会发送数据,默认16K。linger.ms:如果…...
Linux进程间通信:信号量(一)
前提知识 在介绍信号量之前,先来看看一些概念和一些简单的前提知识: 进程间通信的前提是让不同的进程看到同一份资源。于是,就有提出让这种资源成为一种公共资源的方法,方法的提出,导致了一种新的问题的出现…...
Python笔记一之excel的读取
这里我常用的 python 对于 excel 的读取库有两个,一个是 xlsxwriter 用于操作 excel 的写入,一个是 xlrd 用于 excel 文件的读取。 使用的库的版本如下: xlsx1.2.6xlrd1.1.0 xlsxwriter 写入 excel 新建一个 excel import xlsxwriterpat…...
JavaScript Number 数字对象
文章目录JavaScript Number 数字对象JavaScript 数字所有 JavaScript 数字均为 64 位精度八进制和十六进制无穷大(Infinity)NaN - 非数字值数字可以是数字或者对象数字属性数字方法JavaScript Number 数字对象 JavaScript 只有一种数字类型。 可以使用也…...
设计模式-服务定位器模式
设计模式-服务定位器模式一、背景1.1 服务定位模式1.2 策略模式二、代码实战2.1 服务定位器2.2 配置ServiceLocatorFactoryBean2.3 定义一个支付的接口2.4 根据不同类型处理Bean2.5 controller层三、项目结构及测试结果3.1 测试结果3.2 项目结构及源码(欢迎star)四、参考资料一…...
Android Dalvik虚拟机 GC流程分析
前言 本篇继续介绍安卓dalvik虚拟机,介绍Dalvik虚拟技的GC流程。 GC结构体 dalvik/vm/alloc/Heap.h static const GcSpec kGcForMallocSpec {true, /* isPartial */false, /* isConcurrent */true, /* doPreserve */"GC_FOR_ALLOC" }; /* Not eno…...
opencv读入图片注意事项
来源:投稿 作者:蓬蓬奇 编辑:学姐 深度学习数据预处理中常用opencv读入图片,一般在__getitem__函数中调用。本文主要介绍opencv读取图片的一些细节以及注意事项。本文中使用的图片见第6节“opencv测试使用的图片”。 1.如何通过o…...
学习渗透测试,考CISP-PTE还是考NISP-PT证书呢?
其实两者都可以,但是要看考生的实际需求! 为什么说两者都可以? 两个证书都由中国信息安全测评中心颁发,CISP-PTE(注册信息安全渗透测试工程师),NISP-PT(国家信息安全水平考试渗透测试工程师),…...
记录自己遇到的关于Hashmap的面试题
一.麻烦讲述一下Hashmap的扩容原理 jdk1.8中的hashmap扩容原理 1.put流程图 首先贴一张图(图片来源于传送门),多谢大佬的美图,此图已经完美的描述了put的整个流程,我也就不想自己画了,嘿嘿: 2.hashmap中几个比较重…...
mysql数据库之sql语句性能分析工具
一、sql执行频率。 mysql客户端连接成功后,通过show [session | global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT/UPDATE/DELETE的访问频次。 #一个下划线代表一个字符 show global status like com_; 二、慢查…...
搭建SpringBoot项目
文章目录前言准备工具创建项目前言 为什么使用SpringBoot?它有什么好处? SpringBoot可以快速构建出独立的Spring应用,简化了配置文件。内嵌Tomcat服务器,无须手动部署war文件。 准备工具 idea2022navicat16postmanjdk1.8 创建项目 File-&…...
“一网统管”视频融合平台EasyCVR页面tab切换细节优化
EasyCVR视频融合平台基于云边端协同架构,能支持海量视频的轻量化接入与汇聚管理,借助大数据分析的决策判断,为网络摄像头、网络存储设备、智能终端、无人机、车载设备、移动执法仪、视频监控平台等提供一体化的视频接入、分发、存储、处理等能…...
【Python入门第二十天】Python Lambda
lambda 函数是一种小的匿名函数。 lambda 函数可接受任意数量的参数,但只能有一个表达式。 语法 lambda arguments : expression执行表达式并返回结果: 实例 一个 lambda 函数,它把作为参数传入的数字加 10,然后打印结果&…...
比特数据结构与算法(第四章_下)二叉树OJ(力扣:144,965,104,226,100,572)
144. 二叉树的前序遍历难度简单给你二叉树的根节点 root ,返回它节点值的 前序 遍历。示例 1:输入:root [1,null,2,3]输出:[1,2,3]示例 2:输入:root [ ]输出:[ ]示例 3:输入&#…...
【C++】inline 内联函数
文章目录📕 概念📕 使用前的准备📕 使用📕 特性📕 概念 在 C 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,表…...
如何审计一个智能合约
智能合约审计用于整个 DeFi 生态系统,通过对协议代码的深入审查,可以帮助解决识别错误、低效代码以及这些问题。智能合约具有不可篡改的特点,这使得审计成为任何区块链项目安全流程的关键部分。 代码审计对任何应用程序都很重要,…...
不用PS,也能实现抠图的工具
对于非设计专业的同学来说,专门下载 PS 抠图有点大材小用,而且运用 PS 对电脑配置一定要求。不过现在有了更多选择,市面上出现了越来越多的抠图软件,不过越多的抠图软件选择也意味着需要花费时间试错因此本文将给大家推荐 3 款非常…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...
