中断优先级和中断线程优先级

Linux中断 -- 中断路由、优先级、数据和标识 承前文,本文从中断路由、优先级、数据结构和标识意义等方面对Linux内核中断进行一步的解析。 阅读详情

中断是一种当今很重要的硬件与cpu 通信的方式,主板上集成很多硬件,那么就可以认为会有很多中断,但是cpu 的数目往往要少得多,那么肯定会有多个硬件 中断竞争一个cpu 的情况,任何系统(包括自然界)都不能乱套,肯定会有一定的机制防止事情变得不可控制,这种机制的结果就是使一切变得有序化,出现多竞 争一的情况时,最常用的方法就是排队,而排队有很多策略,比如先来先服务,优先级队列,加权优先级队列,多级队列等等。这是硬件方面的情况,那么cpu 方 面呢,cpu 的中断引脚往往只有一个,这就是说,排队必须在中断到达cpu 前进行,所以中断控制器的作用就体现出来了,有了中断控制器,我们就可以把控制 器后面的硬件当成黑盒子了,只要管控制器里面会接受很多中断并且仲裁它们就可以了。
     
现在中断控制器和cpu 都讨论了,那么终极控制者-- 操作系统还没有登场呢,最终需要os 来控制着一切,就是说,控制器和cpu 提供机制,而os 提供策 略,中断优先级是中断控制器的机制,操作系统可以更改,而中断线程化是os 为了更好的控制中断而实现的一种策略,不同os 控制中断的方式不同,而中断线程 化只是其中的一种。
     
像unix 比如solaris 都是中断线程化的,线程拥有自己的优先级,优先级高的中断线程当然可以抢占优先级低的中断线程(如果内核可抢占的话),但是 由于中断是cpu 外界的事件报告,所以它的到来不受cpu 控制,那么中断发生的那一瞬间,中断并不是线程化的,而是也像linux 那样进入中断处理,然后 将其对应的中断线程唤醒,此线程就开始参与调度参与抢占了。
     
那么中断控制器处排队的中断优先级和中断线程的线程优先级有何关系呢?按照道理来说就是一个线性正比关系,事实上也是这样,每个中断控制器都实现了中断优 先级管理,大部分是通过寄存器实现的,比如,x86 芯片组的tpr 寄存器,sun sparc 也有类似的机制,比如通过pil 。
      ia
架构的tpr 寄存器可以将所有低优先级的中断屏蔽掉,并且可以限制嵌套次数。但是在linux 中并没有用到这里的tpr ,它将中断一视同仁,不区分由 县级,用最短的时间处理上半部,然后在下半部处理耗时任务,这一方面是效率需要(该来的就让它来,阻止并不是好事!),二来是为了移植性,windows 只在x86 ,soaris 只在sparc 和x86 ,这些平台都实现了硬件的中断优先级概念,而linux 基于多平台。引用 :
在上半部没有实现中断优先级正是因为linux 的中断处理是分上下部分的。如果把中断处理放在一起,恰恰需要实现中断优先级。
试想一下,一个高优先级中断还没处理完,就被低优先级中断打断了,而低优先级中断频繁发生,会导致高优先级中断得不到处理,不正需要屏蔽低优先级中断吗?
而linux 中断分两部分,所以高优先级中断不怕被打断,因为低优先级中断的上半部处理会马上完成。注意,在中断嵌套的时候linux 只处理中断的上半部哦,在进行下半部之前有个判断如下:

QUOTE:

if (!in_interrupt() && local_softirq_pending())
  invoke_softirq();
//
引用完了
      ipl 是solaris 里面的一个抽象概念,对应中断线程优先级,irql 是windows 里的一个同样意义的抽象概念,它们都实现了低优先中断屏蔽以的 作用,不同的是solaris 中断是线程化的,而windows 是在任意上下文的,后者可能在唤醒中断线程后马上就可以恢复ipl ,而前者必须执行完上半 部后才可;linux 并没有用这些繁琐的东西,它直接允许中断嵌套,不屏蔽任何中断,可谓大气~~
     
必须理解两个概念,中断响应和中断执行,前者影响到吞吐,后者受os 机制(调度,softirq... )影响,中断只要被响应,至于怎么执行就看我的 了,linux 正是这么做的,它百分百响应任何中断,所以效率高。在中断线程实现中,有两种方法,一个是预先为每个中断设置线程,二是设置线程池。中断线 程化有个很大的优势就是实时化,因为实时线程可以将优先级调到比中断线程还高(windows 似乎做不到,因为比硬件中断还高的irql 会受到很多限制, 比如,分页内存的访问,调度,睡眠等等)

 

UM982上位机调试【精简版】 分享一些关于UM982卫导模块上位机调试的简快捷单小功能。 阅读详情

相关推荐

【环境搭建】使用openSfM+MVSNet重建稠密点云

本帖详细介绍了如何使用openSfM+MVSNet对真实采集的数据进行稀疏重建与稠密重建,并针对一些真实场景下可能遇到的问题进行了整理。

YuhsiHu的博客 1971

【Linux 中断管理机制】

无

weixin_43300893的博客 1545

解决RK3566 USB OTG模式识别问题:从原理图分析到otg_mode文件操作全解析

本文深入解析RK3566 USB OTG模式识别问题,从硬件原理图设计到Linux内核的otg_mode文件操作,提供全面的调试方案。针对USB_OTG0_ID引脚电路设计、电源管理关联及内核驱动交互等关键点,给出实战调试技巧和常见问题解决方案,帮助开发者高效解决USB OTG模式切换难题。

eee77的博客 866

Linux进程调度-应用内核设置调度策略和优先级

SCHED_FIFO只能在静态优先级高于0的情况下使用,这意味着当SCHED_FIFO线程变为可运行时,它将始终立即抢占任何当前正在运行的 SCHED_OTHER,SCHED_BATCH 或 SCHED_IDLE 线程。启用 SCHED_RESET_ON_FORK 标志后,仅当线程具有 CAP_SYS_NICE 功能时才能将其重置。对于根据常规调度策略(SCHED_OTHER,SCHED_IDLE,SCHED_BATCH)之一调度的线程,sched_priority 不在调度决策中使用(必须指定为0)。

m0_74282605的博客 3067

Linux下开机异常(fsck exited with status code 4)

Linux下开机异常事情是这样的,本来我呢跑着程序听着歌,结果忽然就死机了,我只能强制关机,再次打开系统的时候,就提示这样fsck from util-linux 2.26.2 /dev/sda10 contains a file system with errors, check forced. /dev/sda10: Inodes that were part of a corrupted pr

芳草碧连天 2万+

《LabVIEW ZYNQ实战指南》第6章>>案例解析:基于USB WiFi模块的ZYNQ无线通信部署与Linux RT开发

本文详细解析了如何为ZYNQ开发板部署USB WiFi模块,实现无线通信。通过LabVIEW Linux RT环境,利用封装好的驱动VI,开发者可轻松配置ZYNQ连接无线网络,摆脱网线束缚,实现程序无线部署与远程调试,为工业物联网应用奠定基础。

app77的博客 754

Linux 系统中断

Linux 系统中断简述、中断、异常、硬中断软中断、硬件中断、软件中断、上半部、下半部

chenyfan_blog 4838

OpenFeign, Zuul, Gateway相互不兼容的问题总结

版本 Lib Vresion spring-cloud-starter-gateway 3.1.0 spring-cloud-dependencies 2021.0.0 spring-cloud-starter-netflix-zuul 2.2.6.RELEASE spring-cloud-starter-openfeign 3.1.0 1. Zuul 与OpenFeign 一起使用的问题 错误信息 jav.

Harry的博客 4131

Linux内核中断机制

操作系统中断机制随笔

weixin_43466027的博客 1635

谈谈SAP顾问的几个发展趋势

大家新年好,今天想聊一下对SAP顾问发展趋势的一些个人见解。过去10多年得益于我国的经济发展,外资不断加大在中国的投资和中国企业的发展,SAP顾问行业得到了很大的发展和壮大。那么未来几年SAP顾问的职业发展到底怎么样呢?

syounger的专栏 2512

51单片机AHT20-21源代码

传感器输出经过 标定的数字信号,标准 I 2 C 格式。AHT20 配有一个全新设计的 ASIC专用芯片、一 个经过改进的MEMS半导体电容式湿度传感元件和一个标准的片上温度传感元件,其 性能已经大大提升甚至超出了前一代传感器的可靠性水平,新一代温湿度传感器, 经过改进使其在恶劣环境下的性能更稳定。但是现在网上的大多数原码都是针对stm32等的这种多位单片机,而我们都知道51单片机是8位单片机,无法对浮点数进行运算,对32位的整数计算有时候也不是很准确,所以我对网上stm32的例程进行了修改。...

wd0710的博客 4547

PREEMPT-RT中断线程化原理与中断线程优先级设置

本文介绍实时linux方案PREEMPT-RT提升系统实时性的机制之一--中断线程化,以及中断线程优先级如何配置,希望能对你有所帮助。

wsg1100 2263

研制过程评审活动(三)工程研制阶段

工程研制阶段主要任务、及评审活动

Abel的博客 2387

【原创】PREEMPT-RT中断线程化原理与中断线程优先级设置

目录一、什么是中断线程化1. 普通Linux中断处理2. 实时性的不足3. 中断线程化二、中断线程优先级配置使用chrt修改中断线程优先级使用rtirq修改中断线程优先级安装rtirqrtirq使用说明rtirq配置三、总结 本文介绍实时linux方案PREEMPT-RT提升系统实时性的机制之一--中断线程化,以及中断线程优先级配置,希望能为感兴趣的读者提供些许参考。 什么是实时 实时的分类 为...

weixin_41184918的博客 531

VB摄像头监控

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

中断线程化

摘要:Linux传统中断处理存在实时性痛点,可能因中断禁用和串行处理导致关键任务延迟。PREEMPT-RT补丁引入中断线程化机制,将中断处理转为可调度的内核线程,赋予不同优先级并允许抢占。这种方法显著减少了中断禁用时间,提高了系统响应可预测性。通过chrt工具可灵活调整中断线程优先级,从而满足高实时性应用需求。

m0_72426445的博客 998

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

lwip中线程优先级的分配原则

TCP/IP线程(TCP/IP Thread):TCP/IP线程负责处理TCP连接和IP数据包的线程,它的优先级应该比其他线程要高,以确保网络数据包能够及时处理,并保证TCP连接的可靠性和稳定性。TCP/IP线程(TCP/IP Thread):TCP/IP线程是用于处理TCP连接和IP数据包的线程,它处理接收到的数据包,并将数据包传递给应用层或其他网络协议进行处理。中断线程(Interrupt Thread):中断线程是响应网络接口的中断事件的线程,它的优先级应该比主线程高,以确保网络数据包能够及时处理。

最后一个bug的博客 1369

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java 线程实例二(终止线程、生产者/消费者问题、获取线程状态、获取所有线程、查看线程优先级、中断线程)

终止线程 Java中原来在Thread中提供了stop()方法来终止线程,但这个方法是不安全的,所以一般不建议使用。 本文向大家介绍使用interrupt方法中断线程。 使用interrupt方法来终端线程可分为两种情况: (1)线程处于阻塞状态,如使用了sleep方法。 (2)使用while(!isInterrupted()){……}来判断线程是否被中断。 在第一种情况下使用interrupt方法,sleep方法将抛出一个InterruptedException例外,而在第二种情况下线程将直接退

墨痕诉清风的博客 782

Java中线程优先级、线程的状态以及启动和终止线程

线程概念:现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程中可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换。 线程优先级 现代操作系统基本采用时分的形式调度运行的线程。线程分配到的时间片多少也就决定了使用处理器资源多少,而线程优先级就是决定线程需要多或少分配一些处理器资源的线程属性。 在Java线程中,通过一个整型成员变量priority来控制优先级,优先级范围从1~10,在线

... 382

linux中几种任务的优先级

任务优先级 任务 调度策略 优先级 软中断线程 CFS SCHED_NORMAL 120 高优先级工作队列 CFS SCHED_NORMAL 100 普通优先级工作队列 CFS SCHED_NORMAL 120 中断线程 RT SCHED_FIFO 49 示例 软中断线程 参考softirq_threads 工作队列 参考workqueue_init_early...

pengdonglin137的专栏 121

【JAVA】常见的几种线程运行机制 及 特殊线程 ——线程让步、线程加入(线程合并)、线程的优先级、中断线程、守护线程(精灵线程)

Thread.yeild() Thread.yeild()是线程让步,即让当前处于运行状态的线程回到就绪状态,将剩余的时间让出来。 但是,在线程运行机制里,没有哪一个方法能精确执行某项操作,只能是模糊执行。 package edu.xalead; class TH1 extends Thread { *这里我们要知道的是,线程本身是有名字的。 *是从Thread类里...

LED_of_Java的博客 328

线程的优先级、守护线程、礼让线程、插入线程、中断线程

一. 线程的优先级一. 线程的优先级在计算机当中,线程的调度有两种方式:抢占式调度模型多个线程它是在抢夺CPU的执行权,CPU在什么时候执行哪条线程是不确定的,执行多长时间也是不确定的,所以抢占式调度它体现了一个随机性优先级高的线程获取的 CPU 时间片相对多一些。非抢占式调度 / 分时调度模型所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片轮流的执行执行的时间也是差不多的在Java当中,它采取了第一种抢占式调度模型的方式。抢占式调度,重点掌握两个字随机性。

weixin_53622554的博客 1755

Java多线程的优先级,礼让,睡眠,中断,守护,加入

一.线程设置以及获取优先级 (1)线程的执行有两种调度模型 分时调度模型    所有线程轮流使用 cpu 的使用权,平均分配每个线程占用 cpu 的时间片。 抢占式调度模型    优先级高的线程先使用 cpu ,如果线程的优先级相同,那么会随机选取一个,另外优先级高的线程获取 cpu 的时间片会相对多一些,Java使用的是抢占式调度模型。 (2) 线程设置优先级和获取优先级 public ...

xupt_rl的博客 529

Linux 中断线程化:ISR 到内核线程的迁移与实时性提升

本文详细介绍了Linux内核中断线程化技术,针对传统硬中断处理机制在实时系统中的缺陷,提出将中断处理拆分为顶半部(极简硬件操作)和底半部(独立内核线程)的解决方案。文章包含技术原理分析、环境配置指南、完整GPIO驱动实例(含代码注释)、性能对比测试和常见问题解答。重点阐述了如何通过中断线程化搭配PREEMPT_RT补丁,将系统最大调度延迟从毫秒级降至微秒级,满足工业控制、自动驾驶等硬实时场景需求。文中提供了从内核编译、驱动开发到系统调优的全流程实践指导,并给出多个行业的典型应用场景和最佳实践建议。

望获实时Linux系统 384
上一篇: 关于软中断
下一篇: 操作系统关于中断的实现
linuxcode_turing
博客等级 码龄17年 0粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值