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的功能与使用方法。这也将为您后续产品选型提供一个优秀产品的选择。

普冉PY32F002B ADC内部参考电压VREFINT的误差补偿与低功耗优化实践

本文详细介绍了普冉PY32F002B单片机在锂电池供电场景下ADC内部参考电压VREFINT的误差补偿与低功耗优化实践。通过分析GPIO配置、分压电阻匹配、采样时间设置等硬件设计要点,结合实时测量VREFINT电压值和软件补偿算法,有效提升了ADC测量精度至5mV以内,并实现了分压电路功耗控制与采样频率优化,为低成本消费电子项目提供了完整的解决方案。

847

SylixOS到底是不是真国产?

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

ScilogyHunter的博客 7710

现代 AI Agent 编排技术全景(1)—— 分类体系与四大技术维度

本文介绍基于 LLM 的现代 Agent 分类体系与四大技术维度,形成能够刻画不同 Agent 产品架构特征的分类法

佚失的诗篇 237

别再只用固定线了!聊聊Android车机‘快速倒车’与‘正常倒车’的UI与数据流核心差异(附动态轨迹线实现原理)

本文深度解析Android车机中快速倒车与正常倒车的核心差异,探讨从内核级视频流水线到动态轨迹线的技术实现。快速倒车通过内核直接操作FrameBuffer实现2秒内响应,而正常倒车则支持多传感器数据融合与动态UI元素。文章还分享了动态轨迹线的算法实现与性能优化技巧,帮助开发者打造极致的倒车体验。

weixin_42550597的博客 255

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

手把手教你用VS Code + Codex在WSL中高效编程(避坑指南)

本文提供了一份详细的避坑指南,教你如何在WSL环境中高效配置和使用VS Code与OpenAI Codex。文章核心在于解决WSL内Codex扩展的OAuth登录失败问题,推荐将扩展安装在Windows本地,并通过UNC路径直接访问WSL文件系统,从而实现AI辅助编程与Linux开发环境的无缝结合,提升编码效率。

weixin_28677451的博客 1067

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

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

低速无人驾驶自动技术 2702

Code Ocean 上传代码 手把手教程

对于一些学术期刊,录用前会让把代码上传到Code Ocean上,但上传过程可能会遇到一些问题,小编分享一下自己的上传经验。他们会进行验证,验证通过,将自动发布。点此运行即可,但是运行比较慢。

u014071947的博客 1万+

SAP ABAP 四种传统的数据库视图类型介绍之二:Projection View

一是该 projection view 只暴露了底层 TADIR 表的四个字段,因此通过该 view 维护数据,在维护界面我们只能维护一条记录的四个字段,如下图所示。使用 Projection view 的优点在于其设计灵活性:如果系统中原始的数据库表字段较多,通过投影仅保留关键信息可有效降低从数据库层到应用层之间的数据传输负担,且保持数据的一致性。其二是笔者之前的文章提到,TADIR 是 ABAP 系统重要的对象注册表,如同 window 操作系统的注册表一样,一般的应用开发人员不应该去修改其内容。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1441

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

《QGIS快速入门与应用基础》010:下载过程中常见问题(如网速慢、文件损坏)

针对QGIS下载过程中的常见问题提供了系统解决方案。主要解决下载速度慢(≤100KB/s)和文件损坏两大核心问题:通过切换国内镜像源(如清华大学、阿里云)、使用专业下载工具提升速度;采用MD5/SHA256校验确保文件完整性,并排查存储介质和杀毒软件干扰。文章还包含macOS权限问题、Linux依赖缺失等高频问题的速解方案,并附详细的排查流程图和预防技巧,帮助用户顺利完成QGIS下载。后续将详细介绍安装流程,适合零基础用户参考。

LuckyHanMo的博客 482

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

基于STM32L4XX 、HAL库的SGM452B数字温度传感器驱动应用C语言程序设计

SGM452B_RESOLUTION_12BIT = SGM452B_CONFIG_R1 | SGM452B_CONFIG_R0 /* 12位分辨率,精度0.0625°C,转换时间200ms */SGM452B_RESOLUTION_11BIT = SGM452B_CONFIG_R1, /* 11位分辨率,精度0.125°C,转换时间100ms */SGM452B_RESOLUTION_10BIT = SGM452B_CONFIG_R0, /* 10位分辨率,精度0.25°C,转换时间50ms */

PP_Cottage的博客 328

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SyliOS I/O 系统

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

动感超人_Crush 901

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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、付费专栏及课程。

余额充值