【正点原子Linux连载】第四章 SDK包的使用 摘自【正点原子】ATK-DLRV1126系统开发手册

1)实验平台:正点原子RV1126 Linux开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=692176265749
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html

第四章 SDK包的使用

ATK-DLRV1126开发板具有高性能低功耗,是一款基于Rockchip RV1126芯片开发的开发板。RV1126是Rockchip推出的一款编解码芯片,CPU为4核ARM Cortex-A7 32位,专用于面向人工智能的机械视觉领域,支持4K编解码,支持8路1080P同时进行编解码,内置2.0TOPS的NPU。像这种专用芯片,芯片厂商都会给出芯片的SDK包进行二次开发,用它来开发有很多好处,比如:不用安装一下特殊的软件和库,自带交叉工具链、文件系统和第三方库,可以直接编译出系统镜像,开发环境搭建比较容易等等。但是开发自由度不够高,更新软件版本很麻烦,代码里有很多私货(芯片厂商自己定义的代码)等等,所以本章节就讲解如何使用和编译SDK包。下图是RV1126芯片框架图,如下图所示:
在这里插入图片描述

4.1 SDK包源码简要
首先建议大家在编译SDK之前,先到正点原子资料网站下载ATK-DLRV1126开发板最新的SDK包,地址为:http://www.openedv.com/docs/boards/arm-linux/RV1126%20Linux.html,点击下载链接进入下载网站,如下图所示:
在这里插入图片描述

图4.1.1 ATK-DLRV1126下载链接图
在上图红色框住的为SDK下载链接地址,进入百度云下载完整的SDK包,下完成后如下图所示:
在这里插入图片描述

图4.1.2 SDK完整目录图
进入01、程序源码01、正点原子SDK源码目录,里面有一个atk-rv1126_linux_release_v1.1_20221207.tar.bz2文件,此文件是正点原子维护的RV1126 SDK包,把此包拷贝到Ubuntu系统里面,在Ubuntu下解压出来,进入工程目录有下图的文件目录,如下图所示:
在这里插入图片描述

图4.1.1 SDK包目录
从上图可以看出有很多文件夹,我们讲解一下每个目录或者文件的作用:
app : 存放上层应用程序的目录。
buildroot :SDK包使用的文件系统为buildroot。
build.sh :编译用的脚本,使用方法后面会教。
device/rockchip :存放每个平台的一些编译和打包固件的脚步和预备文件。
docs :存放RK开发指导文件、平台支持列表、工具使用文档、Linux 开发指南等。
envsetup.sh :要修改文件系统时候要设置的环境脚本。
external : 存放相关的库,包括音频,视频等。
kernel :kernel源码。
makefile :整个SDK包编译的Makefile。
mkfirmware.sh :固件打包使用的脚本,默认在当前路径下的rockdev目录。
prebuilts : 存放交叉编译工具链。
rkbin: 存放固件和工具。
rkflash.sh : linux下的系统烧录脚本。
tools :存放固件和工具的目录。
u-boot :U-boot源码目录。
rockdev:存放编译输出固件的目录(整个SDK包编译完成后就会创建)。
4.1.1 rv1126模块代码目录相关说明
什么叫做模块代码?一个完整的SDK包除了kernel、u-boot、buildroot之外,还需要提供上层的第三方库和APP,第三方库和APP合起来叫做模块代码。像阿尔法开发板或者ATK-CLMP157B开发板只有3座大山(kernel、u-boot和buildroot),没有模块代码,这样开发起来很麻烦。有了模块代码后,我们做产品就很容易了。比如:在rv1126上做人脸识别可以参考rockface模块代码。也可以做监控摄像头可以参考common_algorithm、ipc-daemon、ipcweb-backend和ipcweb-ng等等。一个SDK包包含了很多产品的应用代码。
在这里插入图片描述

表4.1.1.1 rv1126模块功能表格
4.1.2 rv1126开发相关文档说明
本小节就列出官方开发文档说明:(默认的路径为:开发板光盘A-基础资料08、rv1126参考资料)。
摄像头的驱动开发文档为:RV1126_RV1109CameraRockchip_Driver_Guide_VI_CN_v1.0.8.pdf。
后续更新……
4.2 SDK包下的脚本使用
在4.1小节讲解SDK包的源码目录下有4个重要的脚本,本小节就教大家如何使用这些脚本进行编译。
build.sh脚本使用
瑞芯微官方使用build.sh脚本来控制整个SDK包的编译和打包镜像,可以使用“-h”或者“help”命令来查看支持那些参数。运行以下命令即可查看:
./build.sh lunch
第一运行的时候必须要指定板级的配置信息(瑞芯微很多芯片都是基于此SDK进行开发的,所以要告诉SDK包我们使用什么芯片),运行结果如下:
在这里插入图片描述

图4.2.1 板级配置文件选择图
查看build.sh使用帮助,命令如下所示:
./build.sh -h //或者./build.sh help
运行结果如下所示:
在这里插入图片描述

图4.2.2 帮助命令参数
上图可以build.sh支持很多参数,不是所有参数都可以使用的。在rv1126上比较常用的参数有:uboot、lunch、kernel、all、buildroot和recovery等等。下面我们说下常用的参数,如下表格所示:
在这里插入图片描述

表4.2.1 build.sh参数表格
envsetup.sh 脚本使用
envsetup.sh脚本主要的作用是,使能buildroot的配置文件。在RV1126这个芯片里,一共可以选择的配置文件有3种分别为:文件系统的配置文件,recovery分区的配置文件(此分区主要是用作升级和复原的文件系统,它也是一个文件系统)和libs的配置文件(生成一些库,方便我们写应用层代码做测试,导出文件系统的库文件)。运行命令如下所示:
./envsetup.sh
运行结果如下图所示:
在这里插入图片描述

图4.2.3 envsetup的运行结果
Buildroot的输出目录下只能有一个“.config”文件,所以我们配置不同的如果我们要修改文件系统的配置文件,需要先使用./envsetup.sh 选择1这个配置,就会在输出目录下生成“.config”文件,运行结果如下图所示:
在这里插入图片描述

图4.2.4 选择文件系统的配置
图中红色框的内容“/home/alientek/atk-rv1126/buildroot/output/alientek_rv1126/.config”是配置文件的绝对路径,此时的配置文件只能配置文件系统,不能配置recovery和libs。使能完成后,在源码目录下可以当作buildroot的源码目录,比如我们可以进行文件系统的图形配置文件,运行以下代码即可:
make menuconfig
如下图所示:
在这里插入图片描述

图4.2.5图形化配置文件
mkfirmware.sh 脚本使用
mkfirmware.sh脚本主要的作用是,把uboot、kernel、文件系统等等进行打包和生成镜像。使用方法请看4.11小节。
rkflash.sh脚本使用
rkflash.sh脚本主要的作用是,在linux系统下进行固件的烧录,使用方法请看3.9小节。
4.3 板级文件说明
BoardConfig-alientek-rv1126.mk是正点原子为ATK-DLRV1126开发板添加的板级信息,在源码目录下device/rockchip/rv1126_rv1109/BoardConfig-alientek-rv1126.mk,此文件包含整个SDK包所需要的配置信息,文件内容如下所示:
示例代码 4.3.1 BoardConfig-alientek-rv1126.mk文件内容

1   #!/bin/bash
2 
3   # Target arch
4   export RK_ARCH=arm
5   # Uboot defconfig
6   export RK_UBOOT_DEFCONFIG=alientek_rv1126
7   # Uboot image format type: fit(flattened image tree)
8   export RK_UBOOT_FORMAT_TYPE=fit
9   # Kernel defconfig
10  export RK_KERNEL_DEFCONFIG=alientek_rv1126_defconfig
11  # Kernel defconfig fragment
12  export RK_KERNEL_DEFCONFIG_FRAGMENT=
13  # Kernel dts
14  export RK_KERNEL_DTS=rv1126-alientek
15  # boot image type
16  export RK_BOOT_IMG=zboot.img
17  # kernel image path
18  export RK_KERNEL_IMG=kernel/arch/arm/boot/zImage
19  # kernel image format type: fit(flattened image tree)
20  export RK_KERNEL_FIT_ITS=boot.its
21  # parameter for GPT table
22  export RK_PARAMETER=parameter-buildroot-fit.txt
23  # Buildroot config
24  export RK_CFG_BUILDROOT=alientek_rv1126
25  # Recovery config
26  export RK_CFG_RECOVERY=alientek_rv1126_recovery
27  # Recovery image format type: fit(flattened image tree)
28  export RK_RECOVERY_FIT_ITS=boot4recovery.its
29  # ramboot config
30  export RK_CFG_RAMBOOT=
31  # Pcba config
32  export RK_CFG_PCBA=
33  # Build jobs
34  export RK_JOBS=2
35  # target chip
36  export RK_TARGET_PRODUCT=rv1126_rv1109
37  # Set rootfs type, including ext2 ext4 squashfs
38  export RK_ROOTFS_TYPE=ext4
39  # rootfs image path
40  export RK_ROOTFS_IMG=rockdev/rootfs.${RK_ROOTFS_TYPE}
41  # Set ramboot image type
42  export RK_RAMBOOT_TYPE=
43  # Set oem partition type, including ext2 squashfs
44  export RK_OEM_FS_TYPE=ext2
45  # Set userdata partition type, including ext2, fat
46  export RK_USERDATA_FS_TYPE=ext2
47  #OEM config
48  export RK_OEM_DIR=oem_ipc
49  # OEM build on buildroot
50  export RK_OEM_BUILDIN_BUILDROOT=YES
51  #userdata config, if not define this, system will format by RK_USERDATA_FS_TYPE
52  export RK_USERDATA_DIR=userdata_normal
53  #misc image
54  export RK_MISC=wipe_all-misc.img
55  #choose enable distro module
56  export RK_DISTRO_MODULE=
57  # Define pre-build script for this board
58  export RK_BOARD_PRE_BUILD_SCRIPT=app-build.sh
59  # Define package-file for update.img
60  export RK_PACKAGE_FILE=rv1126_rv1109-package-file
第4行:开发板的架构为ARM。
第6行:Uboot的配置文件为alientek_rv1126_defconfig。
第8行:Uboot的镜像格式为fit。
第10行:kernel的配置文件为alientek_rv1126_defconfig。
第14行:kernel的设备树为rv1126-alientek.dts。
第16行:内核的镜像类型为zboot.img(此文件包含zImage、设备树和logo)。
第18行:内核镜像文件为zImage。
第20行:kernel镜像的加载位置配置文件为boot.its。
第22行:开发板的分区文件,emmc会按照此分区文件进行分区。
第24行:buildroot的默认配置文件为alientek_rv1126_defconfig。
第26行:recovery的默认配置文件为alientek_rv1126_recovery_defconfig。
第28行:recovery镜像的加载位置配置文件为boot4recovery.its。
第34行:以2进程进行编译。
第36行:指定芯片为rv1126_rv1109。
第38行,文件系统的格式为ext4,只读文件系统可以设置为spuashfs格式。
第40行,文件系统的路径保存到rockdev/rootfs.ext4。
第44行,oem分区的格式类型为ext2,只读oem可以设置为spuashfs。
第46行,userdata分区的格式类型为ext2。
第48行,oem的配置文件夹为oem_ipc,在device/rockchip/oem目录下。
第50行,在buildroot上创建oem。
第52行,userdata的配置文件夹为userdata_normal,在device/rockchip/userdata/目录下。
第54行,misc分区使用img文件为wipe_all-misc.img。
第58行,模块编译的先后顺序,由app-build.sh文件控制。
第60行,打包的配置文件为rv1126_rv1109-package-file。
从上面的配置文件看出来,RK官方都是使用XXXX.mk文件,如果我们要基于原厂的SDK包进行开发,首先要先配置此文件。

4.4 全自动编译
编译前必须看3.1小节,重点是第51页安装软件。
第一次编译的时候需要下载很多压缩包,有些压缩包下载不了的,所以笔者把下载好的压缩包打包成dl.tar.gz,这样大家编译的时候不用下载了。此文件在开发板光盘A-基础资料01、程序源码02、buildroot下载源码包bl.tar.gz,此压缩包拷贝到Ubuntu系统下,这边笔者拷贝到家目录。在源码目录下运行此命令进行创建dl目录:
mkdir buildroot/dl/ -p
运行结果如下图所示:
在这里插入图片描述

图4.4.1 创建dl目录
创建完成后,把dl.tar.gz解压到buildroot/dl目录下,如下命令所示:
tar -axvf ~/dl.tar.gz -C buildroot/dl/
运行结果如下图所示:
在这里插入图片描述

图4.4.2解压dl.tar.gz文件
RK官方提供了一按键编译功能,使用一条命令即可编译出镜像文件,在官方的源码目录下运行以下命令即可:
./build.sh lunch //选择1
./build.sh
编译成功后运行结果如下图所示:
在这里插入图片描述

图4.4.1 全自动编译

4.5 U-Boot编译和配置
4.5.1 uboot的编译
RK官方提供了很方便的编译方法,直接运行以下./build.sh uboot命令可以编译uboot。运行命令如下所示:
./build.sh uboot
运行结果如下图所示:
在这里插入图片描述

图4.5.1.1 编译uboot图
编译完成后,会在u-boot目录下生成uboot.img文件和rv1126_spl_loader_v1.08.108.bin文件,uboot.img文件就是我们要烧录的img镜像,rv1126_spl_loader_v1.08.108.bin是启动引导uboot的文件,就是在第3.7.2章节里的MiniLoaderAll.bin文件。查看结果如下所示:
在这里插入图片描述

图4.5.1.2 查看编译后的Uboot目录
4.5.2 uboot和SPL文件单独烧录
把这两个文件拷贝到Windows下,打开RKDevTool工具,导入配置选项“ATK-DLRV1126出厂系统配置.cfg”到软件里面,ATK-DLRV1126开发板进入LOADER模式(不能进入MASKROM)。在方框里面对“1”和“3”勾选上, Loader分区配置rv1126_spl_loader_v1.08.108.bin;Uboot分区配置uboot.img。配置结果如下图所示:
在这里插入图片描述

图4.5.2.1 上位机单独烧录uboot图
点击执行即可烧录。烧录完成后系统会自动重启,看看打印信息就知道有没有编译成功了,如下图所示:
在这里插入图片描述

图4.5.2.2 新烧录的uboot启动信息
图4.5.2.2中的红色框里打印日期为“2022-11-15 18:42:58”。
4.5.3 uboot的配置
如果想要配置自己的uboot,可以运行以下命令进行操作,在SDK源码目录下:
cd u-boot //跳转到uboot目录下
make alientek_rv1126_defconfig //选择要修改Uboot配置文件,从板级文件知道
make menuconfig //进入图形界面配置
运行结果如下所示:
在这里插入图片描述

图4.5.3 menuconfig图形配置
从图4.5.3中可以看出RK官方是使用2017.09月份的uboot进行修改,我们就可以配置自己的Uboot了,配置完运行以下命令进行保存配置文件。
make savedefconfig //把.config 保存为defconfig
cp defconfig configs/alientek_rv1126_defconfig //更新修改好的配置文件到alientek_rv1126_defconfig
./make.sh uboot //编译uboot
配置完成后我们可以直接用build.sh脚本进行编译了,就会生成我们想要的uboot.img文件和rv1126_spl_loader_v1.08.108.bin。可以把这几条命令写成脚本,就方便我们测试了。
4.6 kernel编译和配置
4.6.1 kernel的编译
编译kernel和uboot一样命令很简单,运行以下命令即可编译:
./build.sh kernel
运行此命令结果如下所示:
在这里插入图片描述

图4.6.1.1编译kernel图
在这里插入图片描述

图4.6.1.2 设备树的电源域配置
图4.6.2中警告是build.sh打印出来的提醒我们注意设备树的电源域(图4.6.1.2)和硬件要一致,如果电压不一致可能会烧CPU,千万、千万、千万不要修改电源域的配置。
编译完成后在“kernel”目录下生成zboot.img(配置文件里面决定生成为zboot.img)。可以跳转到内核里面,运行“ls”命令查看,结果如下所示:
在这里插入图片描述

图4.6.1.3 kernel文件夹目录
4.6.2 kernel的烧录
和单独烧录uboot系统一样,先把zboot.img文件拷贝到Windows系统里面,ATK-DLRV1126开发板进入LOADER模式,打开烧录软件,在方框里面对“6”勾选上,Boot分区配置zboot.img。配置结果如下图所示:
在这里插入图片描述

图4.6.2.1 上位机烧录kernel配置图
点击运行即可进行烧录。烧录成功会自动重启,我们查看打印信息内核有没有替换成功,如下图所示:
在这里插入图片描述

图4.6.2.2 内核烧录成功打印信息
4.6.3 kernel 的配置
如果想修改内核,也可以运行以下命令进行修改:
cd kernel/ //跳转到kernel
make ARCH=arm alientek_rv1126_defconfig //选择要修改的kernel配置文件
make ARCH=arm menuconfig //进入图形界面配置
运行结果如下所示:
在这里插入图片描述

图4.6.3.1 kernel menuconfig配置图形界面
从图4.6.3.1中可以看出RK官方是使用4.19.111版本的kernel进行修改,我们就可以配置自己的kernel了,配置完运行以下命令进行保存配置文件。
make ARCH=arm savedefconfig //把.config保存为defconfig
cp defconfig arch/arm/configs/alientek_rv1126_defconfig //更新修改好的配置文件到alientek_rv1126_defconfig
cd … //跳转到源码目录
./build.sh kernel //编译内核
配置完成后我们可以直接用build.sh kernel脚本进行编译了,就会生成我们想要的zboot.img文件。可以把这几条命令写成脚本,就方便我们测试了。
4.6.4 logo的修改
在源码目录下,进入内核目录,运行以下命令:
ls
运行结果如下所示:
在这里插入图片描述

图4.6.4.1 查看kernel源码目录内容
在图4.6.4.1中红色框住的两个bmp文件就是启动的logo。logo.bmp为uboot的logo;logo_kernel.bmp为内核的logo。如果要替换自己的logo替换这两个文件即可。然后重新编译内核。注意:两个文件的8位的bmp格式的图片。
4.7 recovery编译和配置
Recovery不是必须要的功能,板级配置了此功能,所以我们也需要编译。
4.7.1 recovery编译
编译recovery的命令也是很简单的,命令如下图所示:
./build.sh recovery
运行此命令结果如下所示:
在这里插入图片描述

图4.7.1.1 编译recovery图
如果编译不过通常是网络问题,这边笔者把要下载的软件包放到:开发板光盘A-基础资料01、程序源码02、buildroot源码包dl.tar.bz2,把此文件解压到buildroot/dl目录(如果没有此目录可以自行创建)。编译完成就会生成buildroot/output/alientek_rv1126_recovery/images/recovery.img文件。运行以下命令可以查看文件有么有生成:
ls buildroot/output/alientek_rv1126_recovery/images/recovery.img
运行结果如下图所示:
在这里插入图片描述

图4.7.1.1 查看recovery.img文件的生成
4.7.2 recovery的烧录
先把recovery.img文件拷贝到Windows系统里面,ATK-DLRV1126开发板进入LOADER模式,打开烧录软件,在方框里面对“7”勾选上,Recovery分区配置recovery.img。配置如下图所示:
在这里插入图片描述

图4.7.2.1 recovery烧录配置
4.7.3 recovery的配置
在SDK包的源码目录下,运行以下命令即可配置recovery:
source envsetup.sh alientek_rv1126_recovery //配置recovery的板级信息
make menuconfig //进入图形界面配置
运行结果如下图所示:
在这里插入图片描述

图4.7.3.1 配置recovery图
从图中可以看出recovery也是一个文件系统,只是此系统RK官方做了修改,是用buildroot 2018.02做的。配置完成后我们可以运行以下代码就行保存:
make savedefconfig //保存到buildroot/configs/alientek_rv1126_recovery_defconfig里
./build.sh recovery //重新编译recovery
保存成功后,可以直接运行./build.sh recovery进行编译。
4.8 rootfs编译和配置
4.8.1 rootfs的编译
编译文件系统,还是一条命令解决,命令如下图所示:
./build.sh rootfs
编译结果如下所示:
在这里插入图片描述

图4.8.1.1 编译rootfs图
编译完成就会在源码目录下创建一个“rockdev”文件夹,跳转到此目录下查看究竟生成了那些文件,查看结果如下图所示:
在这里插入图片描述

图4.8.1.2 查看rockdev目录
上图可以看出生成了“demo.img”、“oem.img”和“rootfs.ext4”,rootfs.ext4其实就是文件系统rootfs.img。rootfs.ext4文件就是一个软连接“…/buildroot/output/rockchip_rv1126_rv1109/images/rootfs.ext2”文件。
4.8.2 rootfs的烧录
先把rootfs.ext4、oem.img和demo.img文件拷贝到Windows系统里面,ATK-DLRV1126开发板进入LOADER模式,打开烧录软件,在方框里面对“5”、“8”和“10”勾选上,在配置我们要烧录的文件,rootfs分区配置rootfs.ext4;oem分区配置oem.img;demo分区配置demo.img。配置如下图所示:
在这里插入图片描述

图4.7.2.1 文件系统相关的配置
点击执行即可烧录rootfs、oem和demo。
4.8.3 rootfs的配置
buildroot配置
在SDK包源码目录下,运行以下命令进行配置buildroot:
source envsetup.sh alientek_rv1126 //配置buildroot对应defconfig
make menuconfig //进入图形化界面
运行结果如下所示:
在这里插入图片描述

图4.8.3.1 buildroot配置图
配置完成好保存。运行以下命令进行保存和重新编译(注意:buildroot有时候不能生成一些配置选项,要运行./build.sh cleanall 命令清除,在编译)
make savedefconfig //保存配置文件到buildroot/configs/alientek_rv1126_defconfig
./build.sh rootfs
busybox配置
在SDK包源码目录下,运行以下命令进行配置busybox:
source envsetup.sh alientek_rv1126 //配置buildroot对应defconfig
make busybox-menuconfig //进入图形化界面
运行结果如下所示:
在这里插入图片描述

图4.8.3.2 busybox配置图
配置完成后,放回最上层,如图4.8.3.2中所示,选择“save Configuration to an Alternate File”进行保存到“.config”文件。运行以下命令进行保存刚刚修改的配置。
make busybox-update-config
将修改保存到配置文件 board/rockchip/common/base/busybox.config。重新编译文件系统即可。
4.9 编译第三方库或者APP
整个SDK包里面包含了很多第三方库和APP,如果想单独编译这些可以运行以下命令即可,运行以下命令即可:
./build.sh external/mpp app/mediaserver
./build.sh rootfs
编译完成后可以重新烧录rootfs.img。
4.10 编译BSP包
我们可以编译出只包含音视频编解码库、NPU库以及头文件。注意:BSP包不包含文件系统的。
source envsetup.sh alientek_rv1126_libs
make -j12
编译BSP生成的目录buildroot/output/alientek_rv1126_libs/BSP。
4.11 固件打包
在上几章节中我们生成了很多的img文件,每次都要在不同的目录下拷贝很麻烦,官方提供了一个脚本,运行脚本命令如下所示(在SDK源码目录下运行):
source envsetup.sh alientek_rv1126 //选择环境变量alientek_rv1126
./mkfirmware.sh
运行结果如下图所示:
在这里插入图片描述

图4.11.1 固件打包
打包成功会在源码目录下新建一个“rockdev”目录,把需要烧录的文件打包进里面。我们可以把这些文件通过FTP拷贝到对应的Windows目录下进行烧录。也可以使用rkflash.sh脚本在Ubuntu进行烧录。到这里SDK已经编译完成了,我们就跳转到“rockdev”目录下查看生成了那些文件,运行“ls -l”查看文件,如下图所示:
在这里插入图片描述

图4.11.2 rockdev目录文件
可以看出很多文件都是通过软连接,简单的讲解每个文件的作用:
boot.img:里面包含了设备树、kernel和logo。注:里面有多个设备树文件。
demo.img:正点原子官方出厂demo。
MiniLoaderAll.bin:此文件负责初始化DDR,引导Uboot。相当于SPL或者TF-A。
misc.img:常用来作为系统升级时或者恢复出厂设置时使用。
oem.img:提供给厂商用的分区文件,像RK把他们自己库都放到这里。
parameter.txt:分区相关的文件。
recovery.img:升级相关的文件系统。
rootfs.img:buildroot的文件系统。
uboot.img:里面包含uboot和设备树。
update.img:整个SDK的img。
userdata.img:用户分区。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值