SylixOS I/O系统

初识SylixOS 初识SylixOS 一、SylixOS概述 SylixOS是一款支持对称多处理器(SMP)的大型嵌入式实时操作系统,支持 ARM、MIPS、PowerPC、x86、SPARC、RISC-V 等架构处理器,支持主流国产通用处理器,如飞腾 1500A、龙芯 2F、龙芯 3A 等。SylixOS诞生于 2006 年,起初它只是一个小型多任务调度器,经过多年开发SylixOS 目前已经成为一个功能完善、性能卓越、可靠稳定的嵌入式系统软件开发平台。 二、SylixOS应用领域 SylixOS 采用抢占式、多任务、硬实 阅读详情

SylixOS I/O系统简介

SylixOS 兼容标准的POSIX输入输出系统,使用户非常容易上手。SylixOS 的I/O概念与UNIX兼容系统相同,认为一切都是文件。这些文件有不同的类型,它们包括:

目录文件:这个文件包含了其他文件的名字以及这些文件的指针。
块设备文件:这种文件提供的 I/O 接口标准符合 SylixOS 对块设备的定义。
字符设备文件:这是标准的不带缓冲的设备文件,系统中的设备不是块设备就是字符设备。
FIFO文件:管道通信文件。它对应了一个命名管道。
套接字(socket)文件:进程间或者主机间的网络通信。

在SylixOS中对文件的操作也同样遵循UNIX的方法,主要通过open、read、write、close等函数调用来操作文件。

SylixOS I/O驱动结构

SylixOS中I/O驱动结构分为ORIG型和NEW_1型,下面的两幅图分别对应了这两种类型的驱动结构。

ORIG型驱动结构


NEW_1型驱动结构

从两幅图可以看出NEW_1型驱动结构在ORIG型驱动结构的基础上增加了文件节点层(这一层相当于UNIX系统的vnode),这一层的引入,使SylixOS对文件的操作支持了记录锁,文件权限的功能。下面我重点学习一下文件节点层之下的各层。

SylixOS设备头

typedef struct {
    LW_LIST_LINE               DEVHDR_lineManage;              /*  设备头管理链表              */
    UINT16                     DEVHDR_usDrvNum;                /*  设备驱动程序索引号           */
    PCHAR                      DEVHDR_pcName;                  /*  设备名称                   */
    UCHAR                      DEVHDR_ucType;                  /*  设备 dirent d_type        */
    atomic_t                   DEVHDR_atomicOpenNum;           /*  打开的次数                 */
    PVOID                      DEVHDR_pvReserve;               /*  保留                      */
} LW_DEV_HDR;
typedef LW_DEV_HDR            *PLW_DEV_HDR;

上面结构就是SylixOS设备头结构,此结构中包含以下一些信息:

  • DEVHDR_lineManage这是一个设备链表,设备安装时将自动链到系统设备链表上;
  • DEVHDR_usDrvNum设备驱动程序索引号,SylixOS内核维护了一个驱动表如上面的两个图所示,每一个SylixOS设备都对应了一个驱动表项,当然不同的设备可以对应到同一个驱动表项,也就是说可以拥有一套驱动方法;
  • DEVHDR_pcName设备名字,每一个SylixOS设备都应该有一个唯一的名字,如“/dev/hotplug”;
  • DEVHDR_ucType设备类型,例如,字符设备类型、块设备类型等;
  • DEVHDR_atomicOpenNum这个成员记录了设备的打开次数,内核提供了下面几个函数对它进行操作;
INT  LW_DEV_INC_USE_COUNT(PLW_DEV_HDR  pdevhdrHdr);  /* 增加一次打开计数    */
INT  LW_DEV_DEC_USE_COUNT(PLW_DEV_HDR  pdevhdrHdr);  /* 减少一次打开计数    */
INT  LW_DEV_GET_USE_COUNT(PLW_DEV_HDR  pdevhdrHdr);  /* 获得打开计数        */
  • DEVHDR_pvReserve暂时保留。

所有安装的设备将被链到下面这个链表头上,系统进行统一管理。

LW_LIST_LINE_HEADER   _S_plineDevHdrHeader;     /*  设备表表头                  */

SylixOS驱动结构

typedef struct {
    LONGFUNCPTR                DEVENTRY_pfuncDevCreate;      /*  建立函数                    */
    FUNCPTR                    DEVENTRY_pfuncDevDelete;      /*  删除函数                    */

    LONGFUNCPTR                DEVENTRY_pfuncDevOpen;       /*  打开函数                    */
    FUNCPTR                    DEVENTRY_pfuncDevClose;      /*  关闭函数                    */

    SSIZETFUNCPTR              DEVENTRY_pfuncDevRead;       /*  读设备函数                  */
    SSIZETFUNCPTR              DEVENTRY_pfuncDevWrite;       /*  写设备函数                  */

    SSIZETFUNCPTR              DEVENTRY_pfuncDevReadEx;      /*  读设备函数扩展函数          */
    SSIZETFUNCPTR              DEVENTRY_pfuncDevWriteEx;     /*  读设备函数扩展函数          */

    FUNCPTR                    DEVENTRY_pfuncDevIoctl;      /*  设备控制函数                */
    FUNCPTR                    DEVENTRY_pfuncDevSelect;     /*  select 功能                 */
    OFFTFUNCPTR                DEVENTRY_pfuncDevLseek;     /*  lseek 功能                  */

    FUNCPTR                    DEVENTRY_pfuncDevFstat;     /*  fstat 功能                  */
    FUNCPTR                    DEVENTRY_pfuncDevLstat;     /*  lstat 功能                  */

    FUNCPTR                    DEVENTRY_pfuncDevSymlink;    /*  建立链接文件                */
    SSIZETFUNCPTR              DEVENTRY_pfuncDevReadlink;    /*  读取链接文件                */

    FUNCPTR                    DEVENTRY_pfuncDevMmap;       /*  文件映射                    */
    FUNCPTR                    DEVENTRY_pfuncDevUnmap;      /*  映射结束                    */

    BOOL                       DEVENTRY_bInUse;            /*  是否被使用                  */
    INT                        DEVENTRY_iType;             /*  设备驱动类型                */

    LW_DRV_LICENSE             DEVENTRY_drvlicLicense;     /*  驱动程序许可证              */
} LW_DEV_ENTRY;
typedef LW_DEV_ENTRY          *PLW_DEV_ENTRY;

上面就是SylixOS目前支持的驱动方法,基本上涵盖了设备的各种操作,当然, Linux程序员可能更习惯于struct file_operations,SylixOS为了兼容这部分,也加入了struct file_operations。

SylixOS字符设备驱动

通过上面的一个简单介绍,接下来我们写一个简单的字符设备驱动来简单的练习一下。下面的程序展示了一个SylixOS字符设备的编写方法,程序实现了一个字符设备的读、写。

#define __SYLIXOS_KERNEL
#include <SylixOS.h>

typedef struct {
    LW_DEV_HDR   CDEV_devhdr;
    CHAR         CDEV_cBuf[64];
    time_t       CDEV_time;
} CDEV;

static INT  devDrvNum = -1;

static LONG  devOpen (CDEV  *pcdev, PCHAR  pcName, INT  iFlag, INT  iMode)
{
    if (!pcdev) {
        _ErrorHandle(EFAULT);
        return  (PX_ERROR);
    }

    LW_DEV_INC_USE_COUNT(&pcdev->CDEV_devhdr);

    return  ((LONG)pcdev);
}

static INT  devClose (CDEV  *pcdev)
{
    if (!pcdev) {
        _ErrorHandle(EFAULT);
        return  (PX_ERROR);
    }

    if (LW_DEV_GET_USE_COUNT(&pcdev->CDEV_devhdr)) {
        LW_DEV_DEC_USE_COUNT(&pcdev->CDEV_devhdr);
    }

    return  (ERROR_NONE);
}

static ssize_t devRead (CDEV  *pcdev, PVOID  pvBuf,  size_t  stLen)
{
    ssize_t   stTempLen;

    stTempLen = min(stLen, 64);

    lib_memcpy(pvBuf, (PVOID)&pcdev->CDEV_cBuf[0], stTempLen);

    return  (stTempLen);
}

static ssize_t devWrite (CDEV  *pcdev, PVOID  pvBuf,  size_t  stLen)
{
    ssize_t   stTempLen;

    stTempLen = min(stLen, 64);

    lib_memcpy((PVOID)&pcdev->CDEV_cBuf[0], pvBuf, stTempLen);

    return  (stTempLen);
}

static INT  devIoctl (CDEV  *pcdev, INT iCmd, LONG  lArg)
{
    INT                  iError = ERROR_NONE;
    struct stat         *pstatGet;

    switch (iCmd) {

    case FIOFSTATGET:
        pstatGet = (struct stat *)lArg;
        if (pstatGet) {
            pstatGet->st_dev     = (dev_t)pcdev;
            pstatGet->st_ino     = (ino_t)0;          /*  相当于唯一节点              */
            pstatGet->st_mode    = 0666 | S_IFCHR;
            pstatGet->st_nlink   = 1;
            pstatGet->st_uid     = 0;
            pstatGet->st_gid     = 0;
            pstatGet->st_rdev    = 1;
            pstatGet->st_size    = 0;
            pstatGet->st_blksize = 0;
            pstatGet->st_blocks  = 0;
            pstatGet->st_atime   = pcdev->CDEV_time;
            pstatGet->st_mtime   = pcdev->CDEV_time;
            pstatGet->st_ctime   = pcdev->CDEV_time;

        } else {
            errno  = EINVAL;
            iError = (PX_ERROR);
        }
    }

    return  (iError);
}

static struct file_operations  fop = {
        .owner = THIS_MODULE,
        .fo_open = devOpen,
        .fo_close = devClose,
        .fo_read = devRead,
        .fo_write = devWrite,
        .fo_ioctl = devIoctl
};

INT  devDrvInstall (VOID)
{
    if (devDrvNum > 0) {
        return  (ERROR_NONE);
    }

    devDrvNum = API_IosDrvInstallEx(&fop);

    DRIVER_LICENSE(devDrvNum,     "Dual BSD/GPL->Ver 1.0");
    DRIVER_AUTHOR(devDrvNum,      "xx.xxx");
    DRIVER_DESCRIPTION(devDrvNum, "char dev driver.");

    return  (devDrvNum > 0 ? ERROR_NONE : PX_ERROR);
}

INT devCreate (VOID)
{
    CDEV  *pcdev;
    INT    iRet;

    pcdev = __SHEAP_ALLOC(sizeof(CDEV));
    if (!pcdev) {
        return  (PX_ERROR);
    }

    lib_bzero(pcdev, sizeof(CDEV));

    iRet = API_IosDevAddEx(&pcdev->CDEV_devhdr, "/dev/cdev", devDrvNum, DT_CHR);
    if (iRet != ERROR_NONE) {
        __SHEAP_FREE(pcdev);
        return  (PX_ERROR);
    }

    pcdev->CDEV_time = lib_time(LW_NULL);

    return  (ERROR_NONE);
}

VOID devDelete (VOID)
{
    PCHAR        pcTail;
    PLW_DEV_HDR  pdevhdr;

    pdevhdr = API_IosDevFind("/dev/cdev", &pcTail);

    API_IosDevDelete(pdevhdr);
    API_IosDrvRemove(devDrvNum, LW_TRUE);
}

void module_init (void)
{
    INT  iRet;

    iRet = devDrvInstall();
    if (iRet == ERROR_NONE) {
        iRet = devCreate();
        if (iRet != ERROR_NONE) {
            printk(KERN_ERR "Char device install failed.\n");
        }
    } else {
        printk(KERN_ERR "Char driver install failed.\n");
    }
}

void module_exit (void)
{
    devDelete();
}
SylixOS 经得起检验的国产操作系统 (五) 本篇开始介绍“信号系统”、“IO系统”以及“标准设备”。详细信息请访问SylixOS官网:http://www.sylixos.com。 阅读详情

相关推荐

SylixOS 应用开发指南

SylixOS是一款可以应用于多种嵌入式平台的嵌入式实时操作系统,SylixOS本身集成了丰富的中间件,这给软件工程师的开发与维护带来了极大的方便。

SylixOS启程之旅

随着SylixOS在各领域的广泛应用,更多的工程师想深入了解SylixOS的产品特性、功能特点、应用场景。翼辉信息针对客户需求与当前疫情特殊情况,首批推出10节网络公开课。通过课程您将全面了解SylixOS的功能与使用方法。这也将为您后续产品选型提供一个优秀产品的选择。

openclaw + ollama本地模型 + 飞书平台 windows平台部署教程

本教程将指导您在 Windows 10/11 环境下,通过 Ollama 运行本地模型,并结合 OpenClaw 接入飞书,搭建一个完全本地化的 AI 助手。

专注于技术研发行业技术主要有AI人工智能视觉识别、物联网技术、电商平台、app原生技术、微信小程序、鸿蒙语言开发、办公企业oa、ERP等,致力于做东半球最优秀的程序员 2175

SylixOS到底是不是真国产?

经过多年的努力,越来越多的客户相信SylixOS是真正的国产操作系统,翼辉也参与了众多国家及重大专项,有力的支持了国内信息工业自主可控发展。

ScilogyHunter的博客 7710

STM32F103跑LVGL,用DMA加速刷屏,800*480大屏也能丝滑

本文详细介绍了如何在STM32F103芯片上通过DMA加速和内存优化,实现800*480大屏的LVGL流畅运行。通过FSMC+DMA硬件架构优化、双缓冲机制和LVGL参数调优,显著提升了界面刷新率和响应速度,适用于嵌入式GUI开发中的高性能需求场景。

weixin_30357231的博客 376

避坑指南:STM32H7不同DMA控制器(MDMA/DMA2D/BDMA)到底该用哪个?

本文深入解析STM32H7系列芯片的DMA控制器选型策略,涵盖MDMA、DMA2D、BDMA等不同控制器的架构原理与性能对比。通过实际项目案例,提供高速TCM数据搬运、GUI加速、低功耗传输等场景的选型决策树,并分享性能优化与调试技巧,帮助工程师避开常见陷阱,提升系统效率。

weixin_26876073的博客 447

SylixOS学习三—— SylixOS的引导与安装1

自学SylixOS启程之旅笔记一、SylixOS 引导过程分析1. SylixOS 常用引导程序2. SylixOS 支持ARM设备的几种引导方式3.SylixOS引导过程分析——总流程分析3.1 一个设备从上电到启动完成的整个流程3.2 引导程序和操作系统镜像的存储3.3 U-Boot引导SylixOS3.4 引导过程中的几个基本概念 《SylixOS启程之旅》是一门公开课,点开下面链接即可观看: SylixOS启程之旅 一、SylixOS 引导过程分析 1. SylixOS 常用引导程序 U-Boo

graceyun的博客 4420

一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

层次分析法: 层次分析法主要用于解决评价类问题(例如:选择哪种方案更好、哪位员工、运动员等表现得更优秀) 评价类问题: 分析问题得出评判问题的子标,分别给不同子标赋予权重(权重和要为1) ...

m0_58882109的博客 1万+

翼辉sylixos国产嵌入式操作系统介绍

SylixOS 的自主研发之路并非一帆风顺。从 2006 年完成最基本的内核,到 2007 年增加 I/O 系统,再到 2008 年引入网络与文件系统和实用工具,以及后续不断丰富的功能和对各种处理器体系结构的支持,SylixOS 一直在不断进化和完善。在当今科技飞速发展的时代,国产嵌入式操作系统领域不断涌现出创新的成果,比如都江堰操作系统(djyos),rt-thread os,sylixos,其中 SylixOS 作为一款由中国人自主开发的大型嵌入式实时操作系统,正以其独特的魅力和卓越的性能崭露头角。

低速无人驾驶自动技术 2702

Uncertainty-Aware Mean Teacher(UA-MT)

本文提出了一种新的基于不确定性的半监督学习框架(UA-MT),通过额外利用未标记的数据从3D MR图像中分割左心房。具体地说,本文建立了一个教师模型和一个学生模型,学生模型通过最小化标注数据上的分割监督损失和所有输入数据上的与教师模型预测输出的一致性损失进行优化。如果没有未标记输入中的注释,教师模型的预测目标可能不可靠且有噪声。:在估计不确定性 U 的指导下,我们过滤掉相对不可靠**(高不确定性),整个体积** U 的不确定性**是 {u} ∈ RH×W ×D。过滤掉高不确定性的,也就是熵大于某个值的。

Alexa_的博客 1870

自动驾驶入门到进阶完整指南:感知、预测、规划、端到端、仿真测评与场景挖掘全解析

对小白来说,不建议一开始直接冲端到端大模型。先学数据和坐标系:否则所有结果都看不懂。再学 LiDAR 3D 检测:最容易建立空间感。再学 BEV/多相机感知:这是当前主流。再学轨迹预测:理解交互和多模态。再学规划控制:理解车为什么这样开。再学仿真和闭环评测:理解 open-loop 和 closed-loop 差异。最后学端到端/VLM/VLA:这时候你才知道它到底替代了哪些模块。贯穿始终学习场景挖掘和安全测评:这是工业界最核心的能力之一。

u013250861的博客 394

SylixOS I/O系统

概述I/O 系统又称作输入输出系统, SylixOS兼容POSIX标准输入输出系统,SylixOS的I/O概念继承了UNIX操作系统的I/O概念,认为一切皆为文件。与UNIX操作系统相同, SylixOS中的文件也分为不同的类型。SylixOS的I/O系统结构,分为ORIG驱动结构和NEW_1驱动结构。NEW_1驱动结构就是在ORIG驱动结构基础上增加了设备节点结构,其负责文件访问权限、文件记录...

weixin_33963189的博客 187

光储微电网混合储能系统的控制策略

随着社会生产力的不断提高,对不可再生资源的大量消耗,人们已经意识到发展可再生能源的重要性,因此微电网技术作为再生能源利用的有效形式被快速发展。蓄电池容量无限大是传统光储微电网混合储能系统控制策略一种理想形式,但实际上蓄电池的容量是有限度的,传统控制策略在蓄电池剩余电量达到阖值时将无法正常使用,由此提出了光储微电网混合储能系统的新型控制策略,又结合实际情况,对开关进行了改进,利用开关与二极管并联,使其拥有四种工作状态,当储能元件剩余电量达到阈值时,可自动恢复电量降低成本,提高并输出电池电能质量。

nhkg888的博客 1744

SylixOS的I/O系统结构类型(ORIG型和NEW_1型)

SylixOS 的 I/O 系统结构,由于历史原因分为 ORIG 型驱动结构和 NEW_1 型驱动结构。NEW_1 型驱动结构在 ORIG 型驱动结构的基础上增加了文件节点(文件访问权限、文件记录锁等功能)。 ![ORIG型驱动结构](https://img-blog.csdnimg.cn/20210103154253381.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6L...

qq_41915323的博客 570

CS 188 Project3(RL) Q10:Approximate Q-Learning

实现一个近似的Q-learning学习代理,它学习状态特征的权重,其中许多状态可能共享相同的特征。在qlearningAgents.py中的ApproximateQAgent类中编写实现,它是PacmanQAgent的子类。 注:近似Q-learning学习假设在状态和动作对上存在一个特征函数f(s,a),它产生一个向量f1(s,a) .. fi(s,a) .. fn(s,a)特征值。我们在fe...

大模型与Agent智能体 2657

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SyliOS I/O 系统

I/O系统又称作输入输出系统,SylixOS 兼容POSIX标准输入输出系统,SylixOS 的IO概念继承了UNIX操作系统的I/O概念,认为一切皆为文件。与UNIX操作系统相同, SylixOS中的文件也分为不同的类型。 文件类型 SylixOS 系统最常见的是普通文件和目录文件,但也有另外一些特殊文件类型,这些文件类型包括以下几种: 普通文件,这是最常见的文件类型,这种文件包含了某种形式的数据。这种数据无论是普通文本还是二进制,对于 SylixOS 来说没什么区别。需要注意的是,一个二进制

动感超人_Crush 901

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

sylixos与harmonyOS,SylixOS 下的IO系统调用

SylixOS标准I/O基本介绍1.1 简介I/O 系统又称作输入输出系统,SylixOS 兼容POSIX标准输入输出系统,SylixOS的I/O概念继承了UNIX操作系统的I/O概念,认为一切皆为文件。与UNIX操作系统相同, SylixOS中的文件也分为不同的类型。1.2 两种I/O类型I/O系统分为 ORIG 型驱动结构和 NEW_1 型驱动结构,如图 1.1和图 1.2。图 1.1 ORI...

weixin_39710295的博客 218

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SylixOS 下的IO系统调用

SylixOS标准I/O基本介绍 简介 I/O 系统又称作输入输出系统,SylixOS 兼容POSIX标准输入输出系统,SylixOS的I/O概念继承了UNIX操作系统的I/O概念,认为一切皆为文件。与UNIX操作系统相同, SylixOS中的文件也分为不...

chicuangan8636的博客 147

国产化实时操作系统研究之旅8.2-操作系统使用体验之I/O

I/O 系统又称作输入输出系统,SylixOS 兼容 POSIX 标准输入输出系统,SylixOS 的 I/O概念继承了 UNIX 操作系统的 I/O 概念,认为一切皆为文件。与 UNIX 操作系统相同,SylixOS中的文件也分为不同的类型。 文件类型 SylixOS 系统最常见的是普通文件和目录文件,但也有另外一些特殊文件类型,这些文件类型包括以下几种: 普通文件,这是最常见的文件类型,这种文件包含了某种形式的数据。这种数据无论是普通文本还是二进制,对于 SylixOS 来说没什么区别。需要注意的

xian_gw的博客 339

SylixOS IO系统

概述 I/O 系统又称作输入输出系统, SylixOS兼容POSIX标准输入输出系统,SylixOS的I/O概念继承了UNIX操作系统的I/O概念,认为一切皆为文件。与UNIX操作系统相同, SylixOS中的文件也分为不同的类型。 SylixOS的I/O系统结构,分为ORIG驱动结构和NEW_1驱动结构。NEW_1驱动结构就是在ORIG驱动结构基础上增加了设备节点结构,其负责文件访问权限、文件...

qq_29476813的博客 404

SylixOS Shell使用

什么是Shell Shell是操作系统“外壳”程序,它向使用者提供一个基于命令行类型的使用界面,也可称作命令解析器,系统开发人员常使用此接口来操作计算机。几乎所有的操作系统都包含shell程序,例如Linux系统中较为常见的shell是bash程序,Windows系统中的shell程序是cmd.exe。SylixOS也不例外,SylixOS也包含自己的shell程序:ttinyShell

糊涂岁月的专栏 3143

SylixOS里的错误号【3】--- 系统错误号

SylixOS里的系统错误号定义位于libsylixos\SylixOS\system\include\s_error.h文件中。 /********************************************************************************************************* ** ** 中国软件开源组织 ** **

ScilogyHunter的博客 570

SylixOS 中 select 原理及使用分析

select 是操作系统多路 I/O 复用技术实现的方式之一。select 函数允许程序监视多个文件描述符,等待所监视的一个或者多个文件描述符变为“准备好”的状态。所谓的”准备好“状态是指:文件描述符不再是阻塞状态,可以用于某类 IO 操作了,包括可读,可写,发生异常三种。

日常学习记录 1134

SylixOS块设备驱动模型

块设备简介 块设备是I/O设备中的一类,是将信息存储在固定大小的块中,每个块有自己的地址,数据块大小通常在512字节到32768字节之间。块设备的基本特征是每个块都能独立于其他块而读写。磁盘是最常见的块设备。 技术实现 SylixOS实现了兼容POSIX标准的输入输出系统,SylixOS的I/O概念继承了UNIX操作系统的概念,认为一切皆为文件。本章介绍SylixOS在I/O层之下提供的块设

huikai309的博客 607
上一篇: SylixOS 热插拔系统
下一篇: SylixOS xinput 系统
flags_s
博客等级 码龄11年 15粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值