linux设备驱动归纳总结(六):1.中断的实现

从零到一:手把手教你构建自定义ReaxFF力场参数 本文手把手教你从零构建自定义ReaxFF力场参数,详解反应力场的动态键序机制与参数化逻辑。通过LAMMPS实战演示,涵盖训练数据准备、参数优化算法选择及性能优化技巧,助力研究人员精准模拟化学反应过程。适用于材料科学、催化研究等领域,特别适合已掌握分子动力学基础的进阶用户提升力场开发能力。 阅读详情
小白的博客——提升自已,分享别人

xiaobai.blog.chinaunix.net

好的女人可以不共享。好的技术绝对要共享!   
首页 |  博文目录 |  相册 |  博客圈 |  关于我 |  留言
个人资料
  • 博客访问:74424
  • 博文数量:42
  • 博客积分:687
  • 博客等级:中校
  • 关注人气: 4
  • 注册时间:2010-12-01 18:55:26
订阅我的博客
  • 订阅
  • 订阅到鲜果
  • 订阅到抓虾
  • 订阅到Google
最近来访
字体大小:  博文
标签:   linux   中断   ARM   设备驱动  分类:  6中断

linux设备驱动归纳总结(六):1.中断的实现


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


一、什么是中断


中断分两种:

1)中断,又叫外部中断或异步中断,它的产生是由于外设向处理器发出中断请求。其中外部中断也有两种,这是由配置寄存器设定的:普通中断请求(IRQ)和快速中断请求(FIQ)。一般地,linux下很少使用快速中断请求。

2)异常,又叫内部中断或同步中断,它的产生是由于处理器执行指令出错。

在以下的内容我是要介绍由于外部设备产生的中断。


这里我还有两个名词要说清楚

1)中断请求线:在后面也叫中断号,每个中断都会通过一个唯一的数值来标识,而这个值就称做中断请求线

2)在2440芯片中,有些中断是需要共享一个中断寄存器中的一位,如EINT4——EINT7,它们是共享寄存器SRCPEND的第4位。具体可以查看芯片手册。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


二、什么是中断处理函数


在相应一个中断是,内核会执行该信号对应的一个函数,该函数就叫做该中断对应的中断处理函数。一般来说,中断的优先级是最高的,一但接收到中断,内核就会调用对应的中断处理函数。

中断处理函数运行在中断上下文中。中断上下文与内核上下文有一点区别:

内核上下文是指应用层调用系统调用陷入内核执行,内核代表陷入的进程执行操作。函数中可以通过current查看当前进程(即应用层的进程)的信息,并且可以睡眠。

中断上下文中,不能通过current查看调用它的应用层进程的信息,同时,处于中断上下文时,不能睡眠。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


一、从硬件角度看中断


中断的产生到处理器获得中断这段过程中,还要通过中断处理器来筛选信号。


先温习一下S3C2440芯片手册的知识:中断是如何产生的,中断处理器本身如何处理中断。先看一下一幅经典的图,这是介绍中断控制器的工作流程:

从硬件上的分类,有两种不同的中断类型:

1)自己占有SORCPND寄存器的一位(without sub-register)。

2)几个中断共同享用SRCPND寄存器的一位(with sub-register)。


其实两种都差不多,只是多了两步的检测。我以自己占用一位的中断来举例,EINT1,在我的开发板,EINT1上接了一个按键

1)当我按下按键产生电平变化,传到S3C2440的中断控制器上(即将要进入上面图的流程图)。

2)首先,信号要经过寄存器SRCPNDSRCPND是用来配置当前的处理器要接收什么中断,如果该寄存器配置成接收EINT1中断(对应位置一),则允许继续下一步。

3)然后,信号经过寄存器MASK,这是用来设置当前系统需要屏蔽的中断。注意,这里的屏蔽跟上一个寄存器的不接收中断是不一样的。这里的屏蔽是指,中断是接受了,但是由于某种原因,先暂时不屏蔽产生的中断。

4)通过INTPND寄存器,查看当前是否有相同的中断已经被请求(如果是,INTPND对应位置一)。

5)如果没有相同的中断在请求,中断处理器才会把这个信号传给处理器,这时处理器才会知道有EINT0的中断真正来了,要对信号进行处理了。

注:如果设定了EINT0是快速中断模式(FIQ),中断通过SRCPND寄存器后就会通过MODE寄存器的判断,确定是FIQ后,中断控制器优先将该中断传给CPU处理。

6)对应传来的中断类型(IRQFIQ),通过CPSR寄存器切换到对应的工作模式ARM有七种工作模式)。

7)切换工作模式后,进入指定的中断处理入口执行中断处理函数。

注意:第67步在linux下的实现相对复杂,不像在裸板程序,只需要切换一下工作模式,执行相应的函数就可以了。迟点会介绍linux如何实现。


来个流程图比较只在,同时来个类比,处理器是老板,中断处理器是小秘:


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

四、注册和释放中断处理函数


上面的介绍只是讲解了一个设备产生中断后要经过怎么样的步骤才能让处理器接收到中断信号。传入处理器后,接下来的工作就是由内核来实现了,那是一个复杂的机制,我们这里先不说。但是,内核提供了相关的接口给我们,我们只要通过接口告诉内核,当来了指定中断时,内核你该执行哪个中断处理函数


注册中断处理函数:

/*include <linux/interrupt.h>*/

int request_irq(unsigned int irq, irq_handler_t handler,

unsigned long irqflags, const char *devname, void *dev_id)

使用:

将中断号irq与中断处理函数handler对应

参数:

irq:指定要分配的中断号,中断号的定义在“include/mach/irqs.h”中。注意,不管是单独占有中断请求线的中断,还是共享中断请求线的每个中断,都有一个对应的中断号。,所以,调用该函数不需要考虑是哪种中断(是否共享寄存器),你想哪种中断响应,你就填对应的中断号。

handler:中断处理函数指针。

irqflags:中断处理标记,待会介绍:

devname:该字符串将显示在/proc/irq/pro/interrupt中。

dev_idID 号,待会会介绍。

返回值:成功返回0,失败返回非0

注册函数需要注意两件事:

1)该函数会睡眠。

2)必须判断返回值。


中断处理标志irqflags,这里先介绍几个待会要用的:

/*linux-2.6.29/include/linux/interrupt.h*/

29 #define IRQF_TRIGGER_NONE 0x00000000

30 #define IRQF_TRIGGER_RISING 0x00000001 //上升沿触发中断

31 #define IRQF_TRIGGER_FALLING 0x00000002 //下降沿触发中断

32 #define IRQF_TRIGGER_HIGH 0x00000004 //高电平触发中断

33 #define IRQF_TRIGGER_LOW 0x00000008 //低电平触发中断

34 #define IRQF_TRIGGER_MASK (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \

35 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)

36 #define IRQF_TRIGGER_PROBE 0x00000010


释放中断处理函数:

void free_irq(unsigned int irq, void *dev_id)


编写中断处理函数:

中断处理函数声明如下:

static irqreturn_t intr_handler(int irq, void *dev_id)

先看第一个参数irq,这是调用中断处理函数时传给它的中断号,对于新版本的内核,这个参数已经用处不大,一般只用于打印。

第二个参数dev_id,这个参数与request_irq()的参数dev_id一致,由于待会的程序我并不需要用这个参数,所以先不介绍。

再看返回值,中断处理函数的返回值有三个:

/*linux-2.6.29/include/linux/interrupt..h*/

21 #define IRQ_NONE (0) //如果产生的中断并不会执行该中断处理函数时返回该值

22 #define IRQ_HANDLED (1) //中断处理函数正确调用会返回

23 #define IRQ_RETVAL(x) ((x) != 0) //指定返回的数值,如果非0,返回IRQ_HADLER,否则

26 #ifndef IRQ_NONE //返回IRQ_NONE


接下来就要写函数了,在我的开发板中,有一个按键是对应EINT1,我要实现的操作是,当我按下按键,终端打印”key down”。在这个程序中,我并没有使用dev_id。这将在会以后的章节介绍。

/*6th_irq_1/1st/test.c*/

1 #include <linux/module.h>

2 #include <linux/init.h>

3

4 #include <linux/interrupt.h>

5

。。。省略。。。

13 irqreturn_t irq_handler(int irqno, void *dev_id) //中断处理函数

14 {

15 printk("key down\n");

16 return IRQ_HANDLED;

17 }

18

19 static int __init test_init(void) //模块初始化函数

20 {

21 int ret;

22

23 /*注册中断处理函数,必须查看返回值

24 * IRQ_EINT1:中断号,定义在"include/mach/irqs.h"

25 * irq_handler:中断处理函数

26 * IRQ_TIRGGER_FALLING:中断类型标记,下降沿触发中断

27 * ker_INT_EINT1:中断的名字,显示在/proc/interrupts等文件中

28 * NULL;现在我不使用dev_id,所以这里不传参数

29 */

30 ret = request_irq(IRQ_EINT1, irq_handler, IRQF_TRIGGER_FALLING,

31 "key INT_EINT1", NULL);

32 if(ret){

33 P_DEBUG("request irq failed!\n");

34 return -1;

35 }

36 printk("hello irq\n");

37 return 0;

38 }

39

40 static void __exit test_exit(void) //模块卸载函数

41 {

42 free_irq(IRQ_EINT1, NULL);

43 printk("good bye irq\n");

44 }

45

46 module_init(test_init);

47 module_exit(test_exit);

48

49 MODULE_LICENSE("GPL");

50 MODULE_AUTHOR("xoao bai");

51 MODULE_VERSION("v0.1");

接下来验证一下:

[root: 1st]# insmod test.ko

hello irq

[root: 1st]# key down //按下按键显示

key down

key down

key down

[root: 1st]# cat /proc/interrupts

CPU0

17: 11 s3c-ext0 key INT_EINT1 显示我注册和中断名字

30: 423482 s3c S3C2410 Timer Tick

32: 0 s3c s3c2410-lcd

51: 2782 s3c-ext eth0

70: 49 s3c-uart0 s3c2440-uart

71: 69 s3c-uart0 s3c2440-uart

79: 0 s3c-adc s3c2410_action

80: 0 s3c-adc adc, s3c2410_action

83: 0 - s3c2410-wdt

Err: 0

[root: key INT_EINT1]# rmmod test //卸载

good bye irq

[root: key INT_EINT1]# cat /proc/interrupts //卸载后,我的中断名字消失了

CPU0

30: 828977 s3c S3C2410 Timer Tick

32: 0 s3c s3c2410-lcd

51: 3202 s3c-ext eth0

70: 192 s3c-uart0 s3c2440-uart

71: 277 s3c-uart0 s3c2440-uart

79: 0 s3c-adc s3c2410_action

80: 0 s3c-adc adc, s3c2410_action

83: 0 - s3c2410-wdt

Err: 0



xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


五、proc/interrupt


接下来,稍稍介绍一下proc/interrupt

[root: 1st]# cat /proc/interrupts

CPU0

17: 11 s3c-ext0 key INT_EINT1 显示我注册和中断名字

首先,第一列是中断号,之前的程序应该有人会有疑问:

中断号在哪里找的?

S3C2440中,这些中断号定义在文件"include/mach/irqs.h"中,在这里,可以找到对应的中断:

25 /* main cpu interrupts */

26 #define IRQ_EINT0 S3C2410_IRQ(0) /* 16 */

27 #define IRQ_EINT1 S3C2410_IRQ(1)

28 #define IRQ_EINT2 S3C2410_IRQ(2)

29 #define IRQ_EINT3 S3C2410_IRQ(3)

30 #define IRQ_EINT4t7 S3C2410_IRQ(4) /* 20 */

在这里我标了两处红笔:

第一处:可以看到,S3C2440所有的中断号在原来的基值上加了16构成中断号,但不同的芯片或许有不同的定义方法。

第二处:有些中断号是共享的。在S3C2440中,EINT4---EINT7是共享寄存器SRCPND中的一位,所以,linux系统给这样的中断分配了一个共享的中断号。那就是说,如果你使用IRQ_EINT4t7当收到这些中断时,都会调用对应的中断处理函数。这就需要在中断处理函数中通过第一个传参irq来辨别中断并执行相应的操作。如:

13 irqreturn_t irq_handler(int irqno, void *dev_id) //中断处理函数

14 {

15 switch(irqno){

16 。。。。}

17 }


那肯定有人会说,这太麻烦了吧,有没有更好的办法处理共享中断号

那当然是有,继续看文件"include/mach/irqs.h"

61 /* interrupts generated from the external interrupts sources */

62 #define IRQ_EINT4 S3C2410_IRQ(32) /* 48 */

63 #define IRQ_EINT5 S3C2410_IRQ(33)

64 #define IRQ_EINT6 S3C2410_IRQ(34)

65 #define IRQ_EINT7 S3C2410_IRQ(35)

66 #define IRQ_EINT8 S3C2410_IRQ(36)

看到了吧?内核把共享的中断分离出来,只要使用这些标记就可以了。

其实上面我只是想说明:无论在硬件上ARM是怎么实现中断的(是否共享),在内核看来所有的中断都是一样的,都可以独自获得一个中断号。


第二列“11”是对应处理器响应该中断的次数。

第三列“s3c-ext0是处理这个中断的中断控制器

第四列一看就知道调用irq_request()时定义的中断名字。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


六、总结


其实要实现中断,大部分的工作已经给内核包了,我们只需要做的就是告诉内核,当来了什么中断要执行怎么样的函数,这也是今天介绍的重点,其实步骤很简单:

1)调用两个函数:requesr_irqfree_irq

2)实现中断处理函数:irq_handler()


还有没讲的知识:

1)还有几个irqflag没介绍。

2)没有介绍dev_id

可能有人会加载上面的模块失败,这也是我今天没介绍的只是,共享中断号。这里说的共享和硬件的共享不一样性质,下节会介绍。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

源代码: 6th_irq_1.rar   

[发评论]  评论 重要提示:警惕虚假中奖信息!
  • diytvgy  2011-07-19 23:24
    sunomoon: 学习了,很感谢。还有一处不太明白,硬件的初始化,比如说把GPIO配置成中断输入, 中断相关寄存器( EINTMASK、 EINTPEND)的配置等等,这些都是从什么地方进行.....
    你说的大部分工作都在函数 request_irq里面完成。
    具体的我就不清楚啦,需要看看内核那边的代码。
  • sunomoon  2011-07-02 09:57
    学习了,很感谢。还有一处不太明白,硬件的初始化,比如说把GPIO配置成中断输入, 中断相关寄存器( EINTMASK、 EINTPEND)的配置等等,这些都是从什么地方进行的?
发评论
验证码:     更换一张
SD--根据订单创建出库单(相关的函数列表的介绍系列篇(2)) 创建订单样例代码参见:http://blog.csdn.net/CompassButton/archive/2007/05/09/1601712.aspx 可以根据一个订单或者部分订单项来创建出库单,代码如下:* Populating the item data lx_sales_item-ref_doc = l_vbeln. lx_sales_item-ref_item = c_000010 阅读详情

相关推荐

Linux 中断学习之前言篇

中断学习之原理篇 前言: 中断是计算机发展中一个重要的技术,它的出现很大程度上解放了CPU,提高了CPU的执行效率。 在中断出现之前,CPU对IO采用的是轮询的方式进行服务,这使的CPU纠结在某一个IO上,一直在等待它的响应,如果它不响应,CPU就在原地一直的等下去。这样就导致了,其他IO口也再等待着CPU的服务,如果某个IO出现了很重要很紧急的事情,CPU也不能去响应。 为了解决这个纠结的问题就------>出现了中断 中断控制的主要优点是只有在IO接口需要服务时才去响应它,

冀博 8322

关于linux驱动(应用)程序头文件使用

<br />驱动程序:<br /> <br />#include <linux/***.h> 是在linux-2.6.29/include/linux下面寻找源文件。<br />#include <asm/***.h> 是在linux-2.6.29/arch/arm/include/asm下面寻找源文件。<br />#include <mach/***.h> 是在linux-2.6.29/arch/arm/mach-s3c2410/include/mach下面寻找源文件。<br />#include <pl

newtonnl的专栏 3363

输电线路无人机巡检典型缺陷检测图像数据集(2003幅图像,voc,异物、防鸟刺等8类目标)

内含2003幅输电线路无人机巡检典型缺陷检测图像,由于平台上传文件大小有限吗,此为网盘下载链接,如链接失效请私,备注订单号,各类目标类别(VOC)及数量如下:{'bird_nest(鸟巢)': 478, 'insulator(绝缘子)': 4350, 'FNC(防鸟刺)': 326, 'hammer(防振锤)': 3258, 'hammer_defect(防震锤缺陷)': 326, 'discharge(闪络)': 857, 'insulator_defect(绝缘子缺陷)': 900, 'foreign_body(异物)': 190}

LDD学习------硬件中断问题

依然是为了复习之用,都是自己遇到的问题,肯定不全。 我用的OK6410 Linux2.6.36.2内核 1、首先要说的是几个必须要加的头文件。 #include #include #include #include map.h里面是各个端口的物理地址与虚拟地址之间的映射,使用端口地址的时候用的是虚拟地址。可以自己通过物理地址手动映射。但更好的是用内核提供的端口,方便一些。我因为要

405

浅入浅出linux中断子系统

linux中断是怎么回事,看看?

chengwei_peng 1944

Linux驱动进阶()——中断与时钟机制

中断和时钟机制是Linux驱动中重要的两项技术。使用这些技术,可以帮助驱动程序更高效地完成任务。在写设备驱动程序的过程中,为了使系统知道硬件在做什么,必须使用中断。如果没有中断,设备几乎什么都不能做。本章将详细讲解中断与时钟机制。

m0_56145255的博客 2353

linux设备驱动归纳总结():1.中断实现 csdn,linux设备驱动归纳总结():1.中断实现...

linux设备驱动归纳总结()1.中断实现xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx一、什么是中断中断分两种:1)中断,又叫外部中断或异步中断,它的产生是由于外设向处理器发出中断请求。其中外部中断也有两种,这是由配置寄存器设定的:普通中断请求(IRQ)和快速中断...

weixin_42398050的博客 184

linux设备驱动归纳总结():1.中断实现【转】

本文转载自:http://blog.chinaunix.net/uid-25014876-id-90740.html linux设备驱动归纳总结():1.中断实现 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 一、什么是中断 中断...

102

linux设备驱动中断程序,linux设备驱动归纳总结():1.中断实现

linux设备驱动归纳总结()1.中断实现xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx一、什么是中断中断分两种:1)中断,又叫外部中断或异步中断,它的产生是由于外设向处理器发出中断请求。其中外部中断也有两种,这是由配置寄存器设定的:普通中断请求(IRQ)和快速中断...

weixin_29476357的博客 329

Linux开发】linux设备驱动归纳总结():1.中断实现

linux设备驱动归纳总结():1.中断实现 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 一、什么是中断 中断分两种: 1中断,又叫外部中断...

weixin_30256505的博客 87

中断系统的相关知识(一)(初步理解中断

当中央处理器CPU正在处理某件事情时,外界发生了紧急事件,请求CPU停止当前工作,转而对发生的紧急事件做出应急处理,处理完以后,再回到原来的事件继续工作,这个过程叫做中断,而实现这种功能的部件称为中断系统,请示CPU中断的请求源叫做中断源(中断请求源)。 左图为本次学习板(STC15F2K60S2)的14个中断请求源 除了外部中断2(INT2)、外部中断3(INT3)、定时器2中断和外部中断4(INT4)最低优先级中断以外,其他的中断都具有两个中断优先级,可以实现中断嵌套。 之所以...

weixin_52470573的博客 776

linux驱动头文件

#include 是在linux-2.6.29/include/linux下面寻找源文件。 #include 是在linux-2.6.29/arch/arm/include/asm下面寻找源文件。 #include 是在linux-2.6.29/arch/arm/mach-s3c2410/include/mach下面寻找源文件。 Linux驱动程序常用头文件列举 #inclu

luckywang1103的专栏 1567

linux实现fiq模式(关于arm中断,唤醒中断

因为sep4020的唤醒需要用到fiq模式,上网搜索了一下linux暂时不支持fiq,但是仔细查看了entry-armv.S的文件,其实linux不是不支持linux,只是不能支持太复杂的操作(这个说法待考证,可能通过修改部分源代码也能实现,因为我在arch/arm/kernel下发现fiq.c文件,有时间再确认下),但是最基本的入口低级操作还是存在的,只需要改动相应的地方就能实现简单的功能。

4411

找不到linux init.h,linux找不到mach/regs-gpio.h文件,郁闷啊

[root@vm-dev LED]# makemake -C /opt/EmbedSky/linux-2.6.30.4/ M=/lifuxing/led modulesmake[1]: Entering directory `/opt/EmbedSky/linux-2.6.30.4'CC [M]/lifuxing/led/EmbedSky_gpio.o/led/EmbedSky_gpio.c:...

weixin_39989190的博客 474

操作系统真象还原实验记录之实验十:实现中断处理

操作系统真象还原实验记录之实验八:实现中断处理 书P319 1.相关基础知识 1.1 中断处理过程 忽视细节,整体过程如下 1.外设发出中断信号给8259A芯片 2.8259A芯片处理信号,并向CPU发送中断向量号 3.CPU根据中断向量号,在IDT表中找到对应的中断门描述符,从获取中断门描述符获取对应的中断处理程序所在代码段的选择子和偏移地址,开始执行中断处理程序 4.中断处理程序执行结束,CPU返回原程序 1.2 8259A芯片 对应上述第二步,在8259A芯片的某个引脚接收到外设的中断信号后,发生

mxy990811的博客 1827

中断工作流程

1. 中断请求 中断源是请求CPU中断的设备或事件,一台计算机允许有多个中断源。每个中断源向CPU发出中断请求的时间是随机的。 2. 中断响应判优 中断响应优先级是指CPU响应中断请求的先后顺序。当多个中断源同时提出请求时,需通过中断判优逻辑来确定响应哪个中断源的请求,中断响应的判优通常是通过硬件排队器实现的。 3. CPU响应中断的条件 CPU在满足一定的条件下响应中断源发出的中断请求,并经过一些特定的操作,转去执行中断服务程序。CPU响应中断必须满足以下三个条件:(1中断源有中断请求。(2.

qq_48186867的博客 1万+
上一篇: linux设备驱动归纳总结(五):4.写个简单的LED驱动
下一篇: linux设备驱动归纳总结(六):2.分享中断号
fh400
博客等级 码龄18年 58粉丝 18原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值