嵌入式Linux系统BSP的设计与实现

关于驱动程序与BSP的区别 BSP即Board Support Package,板级支持包。它来源于嵌入式操作系统与硬件无关的设计思想,操作系统被设计为运行在虚拟的硬件平台上。对于具体的硬件平台,与硬件相关的代码都被封装在BSP中,由BSP向上提供虚拟的硬件平台,BSP与操作系统通过定义好的接口进行交互。BSP是所有与硬件相关的代码体的集合。 BSP在嵌入式系统中的角色,很相似于在PC系统中的BIOS和驱动程序的地位。 BSP就看成BIOS+驱动或者bootloader+驱动 BSP和驱动的区别:bsp还包括了bootloader,或 阅读详情
1. 引言
    嵌入式系统由硬件环境、嵌入式操作系统和应用程序组成,硬件环境是操作系统和应用程序运行的硬件平台,它随应用的不同而有不同的要求。硬件平台的多样性是嵌入式系统的主要特点,如何使嵌入式操作系统在不同的硬件平台上有效地运行,是嵌入式系统开发中需要解决的关键问题。解决的方法是在硬件平台和操作系统之间提供硬件相关层来屏蔽这些硬件的差异,给操作系统提供统一的运行环境,这种硬件相关层就是嵌入式系统中的板级支持包BSP(Board Support Package,简称BSP)。本文以PXA250处理器为硬件环境,研究了在嵌入式Linux系统中不同开发阶段BSP的设计与实现。

2. BSP及其作用
    BSP是嵌入式系统中介于硬件平台和操作系统之间的中间层软件,主要目的是为了屏蔽底层硬件的多样性,根据操作系统的要求完成对硬件的直接操作,向操作系统提供底层硬件信息并最终启动操作系统。BSP具有硬件相关性和操作系统相关性的特点,其主要作用包括:
    (1)初始化底层硬件,为操作系统提供底层硬件信息;
    (2)初始化相关硬件设备,主要是存储设备、通信设备;
    (3)检测系统硬件是否正常;
    (4)加载操作系统并启动系统运行。

3. 嵌入式Linux系统BSP的实现
    BSP是相对于操作系统而言的,不同的操作系统有不同定义形式的BSP,要求BSP所实现的功能也有所不同。在嵌入式Linux系统中,主要是初始化底层硬件并引导操作系统;同时,BSP又是和硬件相关的,还要考虑对硬件的初始化操作。在基于PXA250的系统中,这些初始化操作主要是对cPU、内存、中断等相关的寄存器及PXA25O的协处理器进行正确的配置。在不同的开发阶段,因为核心和文件系统所处的位置不同,BSP所要完成的工作也有所不同:在开发调试阶段,BSP要能够与主机通信并从主机下载核心;在目标产品中,BSP要能够从非易失存储设备中加载核心。 

3.1. 开发调试阶段BSP的实现
    开发初期由于调试系统的需要,BSP需把核心和文件系统从主机直接下载到目标板的内存中运行,其开发环境如图1所示。

    与BSP通信 操作系统及上层应用程序
    BSP的程序 P
    硬件层
    图1 嵌入式系统开发调试环境

    由图1中BSP所处的位置可知,BSP要完成如下工作:
    (1)硬件的初始化和配置。
        ① 设置PXA250的协处理器,将内存管理单元(MMU)关掉,清空读、写缓冲和TLB。
        ②设置CPU的核心寄存器和各种控制寄存器,将CPU从加电时的缺省状态设置为系统所要求的工作状态叫。
        ③设置内存配置寄存器和内存刷新寄存器,确定内存的大小和刷新频率[】]。

    (2)通信设备的初始化。
        BSP需与主机通信,从主机下载核心和文件系统,因此要完成相应通信设备的初始化。与主机通信的设备一般是网卡和串口。串口间通信要遵循一定的协议,包括数据格式、同步方式、传输速率、纠错方式等。对串口的初始化就是对这些协议进行设定,使通信双方处于相同的传输模式。在目标板上初始化串口是通过设置其寄存器实现的:设置串口的行控制寄存器确定串口接收数据的格式,设置串口的波特率产生寄存器确定串口接收数据的速率。设置串口的通信协议为:八个数据位、一个停止位,没有奇偶校验位,9 600波特率。串口初始化后就可以从其数据接收寄  存器中读取数据。
        对网卡初始化也是通过设置其寄存器实现的,设置控制寄存器,使网卡处于接收模式。用网卡与主机通信时,主机端的通信程序要知道目标板上网卡的MAC地址才能发送数据。因此,我们要把网卡的MAC地址设定为指定值。
从网卡的数据接收寄存器读取数据时要把数据包中的非数据信息(包的状态、长度、原地址、目的地址和类型)丢掉。
BSP从主机接收文件,因此必须要提供主机与BSP通信的程序。主机端的通信程序可用操作系统提供的系统调用直接设置串口的属性,使主机端串口的通信协议与目标板串口的通信协议一致。主机端的程序通过与目标板连接的串口线将数据写到目标板串口的数据寄存器中。用网卡时,用原始套接口对网卡进行写操作,把数据包发送到目标板上网卡的数据接收缓存寄存器中。

    (3)从主机接收核心和文件系统,启动核心运行。
        系统加电时,BSP从位于0地址的非易失存储器FLASH中执行,和运行在主机上的程序通信,从串口或网卡的数据寄存器中读取数据,把核心和文件系统下载到内存中指定的位置,最后将CPU中的程序计数器PC置为核心在内存中的起始地址,实现核心启动。但是,程序在FLASH中执行时不能对变量进行写操作,为了使程序能正确执行,BSP必须将自己重定位(即把自己搬运到)到内存中,并且在进入c语言函数执行前要设置好堆栈指针。

    其主要实现过程的伪码如下:
        硬件(cup、内存等)初始化;
        通信设备(网卡、串口)初始化;
        将自己重定位到内存中;
        设置系统的堆栈指针;
        跳转到从串口读取核心和文件系统的函数;
        从串口读取核心和文件系统的函数(void)
        {
            while(核心没读取完){
                while(串口的接收数据寄存器为空)(等待);
                从串口的数据寄存器读取数据到内存中;
                核心大小减去已读取的大小,确定核心是否读取完;
                if(核心读取完){
                    -asm{mov pc,一核心在内存中的起始地址;}
            }
        }

3.2. 目标产品中BSP的实现
3.2.1 BSP独立实现
    把核心和文件系统直接从主机下载到内存中运行,只适用于开发调试阶段。目标产品中核心和文件系统烧写在非易失性存储设备上,因此BSP要从这些设备中加载并启动核心。此时,BSP不需要与主机通信,可以将其单独实现在产品中。将BSP单独实现时,可以根据需要向其中灵活地添加多种功能:启动核心前检测内存是否能被正确读写,通过判断网卡、声卡等硬件的属性寄存器确定硬件设备是否正常等。此时,BSP要完成的工作如下:
    (1)初始化硬件及存储设备。
    (2)测试硬件设备是否正常。
    (3)从相应的存储设备中加载核心到内存中,并启动核心。

    硬件的初始化和配置与前面相同,主要完成CPU和内存的初始化。此时,BSP要从存储设备中加载并启动核心,因此要对存储设备(一般是FLASH或CF卡)进行初始化,使其能被正确寻址。BSP中读取核心的代码与具体的操作系统及文件格式无关,不能从文件系统层把核心作为一个文件读进来,只能从硬件接口来实现具体的操作,把核心从存储设备读入内存,然后把核心的开头当作一段程序的起点,使CPU转入核心执行[ 。
    非易失性存储器FLASH和内存统一寻址,对它的访问和访问内存是一样的,可以利用寄存器将核心直接从FALSH读取到内存。CF卡相对内存来说属于外设,对其进行读取操作是通过控制其寄存器(数据寄存器、状态与控制寄存器)来实现的,向其控制寄存器发布ATA命令OA何处读取,读取数据的大小等)后,判断其状态寄存器是否准备好,才能从其数据寄存器中读取数据到内存中。把核心从非易失性存储设备读到内存中后,将CPU中的程序计数器PC置为核心在内存中的起始地址,实现系统的启动。


    对应的伪码如下:
    硬件(cup、内存等)初始化;
    存储设备(FLASH、CF卡)初始化;
    测试硬件设备是否正常;
    根据CF卡的属性寄存器判断CF卡是否存在;
    如果存在,跳转到从CF卡加载核心到内存的函数;
    如果不存在,直接将核心从FLASH加载到内存中;
    mov pc,一核心在内存中的起始地址;
    从CF卡加载核心到内存的函数(void)
    {
        while(核心没加载完){
            向CF卡发布ATA命令,确定从CF卡的哪一块开始读,
            读多少块
            while(CF卡的状态没准备好){等待;}
            从CF卡的数据寄存器读数据到内存中;
            核心大小减去所读的块数乘以块大小;
            if(核心加载完){
                -asm{mow pc,=核心在内存中的起始地址;}
        }
    }

3.2.2 在核心中实现BSP
    BSP单独实现易于修改,当硬件改变时,只需要对相关硬件的初始化代码进行修改并重新编译。但是,对于嵌入式系统的存储介质FLASH,有些文件系统对它的分区有字节对齐性的要求,也就是说分区必须是特定大小或特定大小的倍数才能有写访问权限,如果把BSP单独写在一个分区中会造成存储空间的浪费。实质上,BSP是属于操作系统的一部分且和操作系统绑定在一起运行,在开发板硬件固定的情况下,可以将其实现在Linux核心中。在核心中实现BSP时,BSP应能向核心提供必要的底层硬件信息,实现核心从非易失性存储器FLASH到内存的加载和启动。
    在嵌入式系统的存储介质FLASH中没有所谓的引导扇区,相应的嵌入式Linux内核映象zImage也没有如PC机上的引导扇区代码bootsect及辅助代码setup,而是由head.o、misc.o、head-xscale.o和piggy.o几个文件顺序连接而成。其中,head.o是由/arch/arm/boot/compressed/head.S汇编而成,是核心最先执行的代码,主要作用是用misc.o解压缩核心并使CPU转到核心解压缩后所在的内存地址执行。head-xscale.o是体系结构相关的代码。piggy.o是系统启动后保留在内存中的全部有用程序[3],也就是head.o要解压缩的代码。由以上分析可知,嵌入式Linux的内核不能自启动,要启动核必须满足以下两个条件:

    (1)系统硬件已被正确初始化;
    (2)核心在内存中,并且CPU中的程序计数器被置为核心在内存中的起始地址。

    在核心中实现BSP时,BSP必须位于核心代码的最前面,即将其实现在head.S文件的最前面,完成如PC 机上的BIOS、bootsect和setup的功能。同时,要保证核心在加载到内存后必须能跳转到和没有BSP时核心中相同的地方执行。重新编译核心后,就将BSP实现在核心映象zImage中的开始代码中。把核心烧到FLASH的0地址,系统启动时首先执行上述代码,将核心加载到内存中执行,实现核心的自启动。
基于ARM-Linux系统开发平台下嵌入式MP3的设计与实现 基于ARM-Linux系统开发平台下 嵌入式MP3的设计与实现 [摘  要] 随着计算机技术和微电子的的迅速发展,嵌入式系统己经被广泛地应用到许多领域,如科学研究、工程设计、军事技术以及各种商业应用等。嵌入式系统被定义为以应用为中心,以计算机技术为基础、软硬件可裁剪、适应于特定应用系统对功能、可靠性、成本、体积、功耗等严格要求的专业计算机系统。在目前的各种嵌入式处理器中,由于ARM芯片的低功耗 阅读详情

相关推荐

嵌入式开发实战:从i.MX31 PDK看BSP与模块化设计的核心价值

在嵌入式系统开发中,板级支持包(BSP)是连接硬件与操作系统的关键软件层,它抽象了底层硬件细节,为上层应用提供统一的驱动接口。其核心原理在于通过预置的引导程序、硬件初始化代码和设备驱动,实现操作系统的快速移植与稳定运行。BSP的技术价值在于大幅降低开发门槛、缩短产品上市周期,并确保系统稳定性,是嵌入式产品从芯片到原型的关键桥梁。这一技术广泛应用于消费电子、工业控制和物联网设备等场景。以经典的i.MX31产品开发套件为例,其提供的经过深度优化的BSP和模块化的硬件设计,正是这一理念的杰出实践,有效解决了多媒体

weixin_30861459的博客 530

bsp开发包含哪些内容

3. 文档和示例代码:BSP通常会提供详细的文档和示例代码,帮助开发人员更好地理解硬件平台和BSP的工作方式,并提供一些开发指南和最佳实践。1. 设备驱动程序:BSP包含特定硬件平台的设备驱动程序,这些驱动程序是为了使操作系统与硬件之间进行通信,实现对硬件的控制和访问。6. 其他特定于硬件平台的功能:BSP还可能包含其他特定于硬件平台的功能代码,例如对特定硬件设备的支持、电源管理和调试功能等。总之,BSP提供了一个操作系统和硬件之间的桥梁,帮助软件开发人员实现对硬件的控制和访问。

m0_71402089的博客 2872

嵌入式系统开发实战:从i.MX35 PDK参考设计到产品化全流程解析

在嵌入式系统开发领域,参考设计是连接芯片原厂能力与终端产品实现的关键桥梁,其核心价值在于提供了一套经过充分验证的软硬件协同解决方案。从原理上看,一个优秀的参考设计通常基于核心板+底板+调试板的模块化架构,实现了硬件功能的解耦与复用,并严格遵循电源时序、信号完整性等基础设计准则。这种设计哲学的技术价值在于能极大降低硬件开发风险,支持软硬件并行开发,从而显著缩短产品上市周期。其应用场景广泛覆盖工业控制、消费电子、物联网终端等需要基于应用处理器(如ARM系列)进行快速原型开发与产品定制的领域。本文以经典的i.MX

weixin_31887307的博客 333

什么是BSP?理解LINUX BSP

例如 VxWorks 的BSP 和 Linux 的 BSP 相对于某一 CPU 来说尽管实现的功能一样,可是写法和接口定义是完全不同的,所以写 BSP 一定要按照该系统 BSP 的定义形式来写,这样才能与上层 OS 保持正确的接口。由于 BSP 处于在硬件和操作系统、上层应用程序之间,因此 BSP 程序员需要对硬件、软件和操作系统都要有一定的了解。

usstmiracle的博客 3万+

手把手教你学BSP(9.1)--开发一个完整的 BSP

处理器内存存储:16GB eMMC外设开发板型号通过上述步骤,我们可以系统地开发一个完整的 BSP,包括硬件初始化、设备驱动编写、Bootloader 配置等。希望这些详细的解释和示例能够帮助你更好地理解和实施 BSP 的开发。

MHD0815的博客 3516

【4. BSP开发指南 - [4.1. 环境搭建及编译说明]】

【4. BSP开发指南 - [4.1. 环境搭建及编译说明]】

Sugar_wolf的博客 503

(转)嵌入式Linux系统BSP的设计与实现

1. 引言    嵌入式系统由硬件环境、嵌入式操作系统和应用程序组成,硬件环境是操作系统和应用程序运行的硬件平台,它随应用的不同而有不同的要求。硬件平台的多样性是嵌入式系统的主要特点,如何使嵌入式操作系统在不同的硬件平台上有效地运行,是嵌入式系统开发中需要解决的关键问题。解决的方法是在硬件平台和操作系统之间提供硬件相关层来屏蔽这些硬件的差异,给操作系统提供统一的运行环境,这种硬件相关层就是嵌入式系

Edai9508的专栏 6379

嵌入式Linux网络调试踩坑记:YT8531/YT8521 PHY驱动移植与设备树配置实战

本文深入解析嵌入式Linux系统中YT8531/YT8521 PHY驱动移植与设备树配置的实战经验。从网络不通的常见现象入手,详细介绍了驱动移植关键点、设备树配置详解及常见问题排查技巧,帮助开发者快速解决RGMII接口调试难题,提升嵌入式网络开发效率。

weixin_42525328的博客 444

Linux BSP开发指导

1. 引言     嵌入式系统由硬件环境、嵌入式操作系统和应用程序组成,硬件环境是操作系统和应用程序运行的硬件平台,它随应用的不同而有不同的要求。硬件平台的多样性是嵌入式系统的主要特点,如何使嵌入式操作系统在不同的硬件平台上有效地运行,是嵌入式系统开发中需要解决的关键问题。解决的方法是在硬件平台和操作系统之间提供硬件相关层来屏蔽这些硬件的差异,给操作系统提供统一的运行环境,这种硬件相关层就是嵌入

Jesse_Yeh的博客 837

外贸英文函电第三版张梅英课后习题答案解析

我参加了一些外贸模拟竞赛,将所学知识运用到实际工作中,取得了不错的成绩。此外,我还积极参与了一些外贸实践活动,如参加实习、担任志愿者等,从中积累更多的经验。在这个过程中,我逐渐摸索出了一套适合自己的学习方法,不仅提高了学习效果,还增强了自信心。通过学习这本书,我们可以提高自己在外贸领域的沟通能力,更好地应对未来的工作挑战。在学习这本书的过程中,我遇到了一些困难,比如对某些专业术语的理解不够透彻,对信件的结构和格式掌握不够熟练。出版社: 高等教育出版社。上传者: ʚ河西撒手没ɞ。

weixin_58833001的博客 1424

配置思科交换机冗余链路汇聚

本文对交换机端口汇聚配置进行说明

istrangeboy&begin zero的博客 6684

linux BSP开发指导

引言嵌入式系统由硬件环境、嵌入式操作系统和应用程序组成,硬件环境是操作系统和应用程序运行的硬件平台,它随应用的不同而有不同的要求。硬件平台的多样性是嵌入式系统的主要特点,如何使嵌入式操作系统在不同的硬件平台上有效地运行,是嵌入式系统开发中需要解决的关键问题。解决的方法是在硬件平台和操作系统之间提供硬件相关层来屏蔽这些硬件的差异,给操作系统提供统一的运行环境,这种硬件相关层就是嵌入式系统中的板级支持包

linzhihan7410的博客 1165

港口集装箱码头运营FlexSim仿真

列队4中的集装箱会根据不同类型的集装箱会放置在不同的堆场,因此根据前面对集装箱设置的标签Type的数值不同,设置不同的发送端口。集装箱到达列队3后,会有70%的集装箱到达堆场,30%的集装箱运出港口,因此在Queue列队3的Flow界面设置按照百分比发送端口,其中70%发送到端口1,即发送到列队4等待进入堆场,30%发送到端口2,即发送至出闸口。通过上述对比表格可以看出,当集卡数量在10的时候,岸桥和场桥的设备利用率达到了最高,当集卡数量为12的时候场桥1和场桥3的利用率有所下降,因此综合考虑。

m0_72514516的博客 1331

嵌入式Linux BSP的设计与实现

原文地址:http://blog.sina.com.cn/s/blog_54f82cc201012jvi.html [Linux BSP]嵌入式Linux BSP的设计与实现 (2012-08-29 14:04:52) 转载▼ 标签: linux kernel bsp it 分类:NSN_BspDriver 1. 引言    嵌入式

HULIHONG的专栏 1892

Megatron单机多卡Qwen2.5:pre-train+sft

英伟达:https://github.com/NVIDIA/Megatron-LM/releases/tag/core_r0.8.0阿里:https://github.com/alibaba/Pai-Megatron-Patch/releases/tag/v0.10.2。

weixin_46873015的博客 2178

【AI智能体】基于OpenCode 搭建Skills环境与项目实战开发详解

基于OpenCode 搭建Skills环境与项目实战开发详解

congge 8899

Linux kernel

个人理解BSP(板级支持包)是Bootloader,Kernel 和文件系统加起来的统称。 Linux和Unix中任何东西都是文件。目录是文件,文件是文件,设备也是文件。设备通常被当作节点,但仍然是文件。 在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环...

qq_15063463的博客 1220

9.9华为OD机试真题 新系统 - 受限任务分配 (Java/Py/C/C++/Js/Go)

华为OD机试真题 新系统【受限任务分配】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【受限任务分配】多语言题解。

qq_45776114的博客 723

嵌入式软件工程师杂谈 —– BSP工程师学习路线

上篇文章给大家介绍了嵌入式BSP工程师这个行业,简单来讲,作为一名嵌入式BSP工程师,既要和懂硬件工作原理,还要能编写对应的软件使之正常工作。其学习和开发难度就不言而喻了。那么,究竟学习哪些知识,怎么学习才能成为一名合格的嵌入式BSP工程师呢? 一、专业背景 我们首先从专业背景谈起。经过我的了解,从事嵌入式BSP开发的人员主要来源于计算机专业和电子信息专业。这两个专业是和嵌入式BSP最相关的专业了。当然也有一些同事是从其他专业转过来的(比如我,熟悉我的朋友知道我大学学的是物理专业,这相对来讲是比较偏..

闲人的专栏 5768

【华为OD机试真题 新系统】1021、API请求日志去重分析 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 新系统】1021、API请求日志去重分析 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备

KJ.JK 144

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

基于ARM体系的嵌入式系统BSP的程序设计

bsp(board support package)板级支持包介于主板硬件和操作系统之间,其功能与pc机上的bios相类似,主要完成硬件初始化并切换到相应的操作系统。bsp是相对于操作系统而言的,不同的操作系统对应于不同定义形式的bsp,例如vxworks的bsp和linux的bsp相对于某一cpu来说,尽管实现的功能一样,可是写法和接口定义是完全不同的。另外,仔细研究所用的芯片资料也十分重要,例

第七章的专栏 2903

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Vivado下载与Zynq嵌入式系统开发全流程

最近在做一个Zynq-7000系列SoC的嵌入式系统开发项目,从Vivado下载到最终实现GPIO控制LED的完整流程走了一遍。我经常用它来快速测试一些嵌入式系统中的软件算法,再移植到Zynq项目中,省去了很多搭建测试环境的时间。Vivado提供了强大的仿真功能,可以在生成硬件前验证设计的正确性。Zynq开发的学习曲线比较陡峭,但只要掌握了基本流程,后面的工作就会顺利很多。整个开发过程中,Vivado的自动化工具帮了大忙,大大简化了硬件设计的复杂度。设计PL端时,要注意时钟域的划分和时序约束的设置。

NightshadeEagle34的博客 914

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: 嵌入式系统HAL原理与BSP的实现方法
下一篇: 浮点数的二进制表示学习笔记
csshuke
博客等级 码龄16年 1517粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值