wince中断处理过程

直流无刷减速电机选型指南:从KV值到霍尔传感器,新手必看的5个关键参数 本文详细解析直流无刷减速电机选型的5个关键参数,包括KV值、转矩、电流与功率、减速比选择以及霍尔传感器配置。通过实战案例和避坑策略,帮助工程师精准匹配电机性能与负载需求,提升工业自动化设备的可靠性和效率。特别强调霍尔传感器在精准控制中的关键作用。 阅读详情
中断在系统设计中的应用非常广泛,可以说,硬件中断、软件中断无处不在,在WINCE下驱动开发更是如此,比如:按键中断、触摸屏中断、AUDIO中断、DMA中断.....等等,几乎含概每个模块。因此,了解中断的处理过程对驱动开发极其重要,下面对WINCE下的中断处理过程做一个简单介绍。
     中断处理可以分为两部分:中断服务例程-ISR、中断服务线程-IST。系统在处理中断异常的时候,应该要尽可能快的完成,因此,我们应该在ISR中做简短的处理,把中断标识返回给中断处理器,越快越好。那么就要把大部分的处理留给IST来处理。我们可以简单的认为,ISR的任务就是完成把硬件中断也就是物理中断转为系统中断并返回。
    下面再来了解一下IST,IST就是一个线程,在驱动初始化的时候创建并等待一个事件,当然,在这之前要先创建一个事件,并与中断相关联起来,当中断产生以后该事件触发IST,IST里通常是用户的处理程序。IST的实现必须先实现两个过程:IST的中断必须和一个事件相关联,IST必须通过WaitForSingleObject来等待这个事件的唤醒,IST的最后要调用INTERRUPTDONE来对注销中断,否则该中断只能用一次,一般我们在驱动的XXX_INIT函数中实现。
    IST在BSP/COMMON/INTR/intr.c中,这里面的内容包括init、enable、disable、oeminterrupthandler等函数,主要是对中断的初始化、使能、处理等,其中最关键的是oeminterrupthandler。

而IST的具体实现过程可以参照下面的步骤:
1、创建一个事件。用createEvent 来实现
2、定义一个中断DWORD key_intr=SYSINTR_NOP;
3、得到ISR返回的中断号,并通过KernelIoControl将其与上面定义的中断相关联。
4、将创建的事件与中断相关联即通知系统注册中断,可以通过InterruptInitialize函数来实现。
5、创建一个中断处理IST,通过CreateThread来实现。
6、IST通过WaitForSingleObject来等待事件的唤醒,并处理中断。
7、IST调用InterruptDone来注销中断,循环等待下一次唤醒。


如果是一个按键对应一个IO,且作为外部中断的话,只需要对IO积存器、中断积存器进行设置就可以实现,下面贴出一个我自己的测试代码供大家参考:
#include  
#include  
#include 
#include 
#include "s3c2440a_base_regs.h"
#include "s3c2440a_intr.h"
#include "s3c2440a_ioport.h"

#define FUSQ_DEBUG 1
volatile S3C2440A_IOPORT_REG *p2440a_ioport_reg = NULL;
volatile S3C2440A_INTR_REG   *p2440a_intr_reg = NULL;
DWORD Key_Interrupt = SYSINTR_NOP;
DWORD Key_Interrupt1 = SYSINTR_NOP;

HANDLE abc_KeyIntr_Event;
HANDLE abc_KeyIntr_Event1;
HANDLE abc_Key_Thread;
HANDLE abc_Key_Thread1;
void abc_KeyThread_Fun();
void abc_KeyThread_Fun1();
int i1=0;
int i2=0;



BOOL APIENTRY DllMain(HANDLE hModule,
                      DWORD dwReason,
                      LPVOID lpvReserved)
{   
  
  RETAILMSG(FUSQ_DEBUG, (TEXT("--------------abc_DllMain /r/n") ) );   
    return TRUE;         
}
DWORD abc_Init(LPCTSTR pContext,LPVOID lpvBusContext)
{
  UINT32 Irq;
  
  RETAILMSG(FUSQ_DEBUG, (TEXT("-----------------abc_Init /r/n") ) );
  
  
  //initialize io port
  p2440a_ioport_reg = (volatile S3C2440A_IOPORT_REG*)VirtualAlloc(0, sizeof(S3C2440A_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
  if (!p2440a_ioport_reg)
   {
    RETAILMSG(FUSQ_DEBUG, (TEXT("p2440a_ioport_reg: VirtualAlloc failed!/r/n")));
    return(FALSE);
   }
   else
    RETAILMSG(FUSQ_DEBUG, (TEXT("p2440a_ioport_reg: VirtualAlloc ok----------!/r/n")));
    
  if (!VirtualCopy((PVOID)p2440a_ioport_reg, (PVOID)(S3C2440A_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2440A_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
   {
    RETAILMSG(FUSQ_DEBUG, (TEXT("p2440a_ioport_reg: VirtualCopy failed!/r/n")));
    return(FALSE);
   } 
   else
    RETAILMSG(FUSQ_DEBUG, (TEXT("p2440a_ioport_reg: VirtualCopy ok-----------!/r/n")));
   /*
   p2440a_ioport_reg->GPFCON &=0xFFFFEBFF;//GPF5 、GPF6 For External interrupt
   p2440a_ioport_reg->GPFCON |=(1<<11)|(1<<13);
  */
  // p2440a_ioport_reg->EXTINT0 &=0xFF8FFFFF;// EINT5 Low Level Triggered
   
   //p2440a_ioport_reg->GPFCON=0xAAAAAAAA;    //all initialize int intr.c of OALIntrInit()
   
   p2440a_ioport_reg->EXTINT0=0xf33fffff;
   
   //initialize interrupt 
   p2440a_intr_reg = (volatile S3C2440A_INTR_REG*)VirtualAlloc(0, sizeof(S3C2440A_INTR_REG), MEM_RESERVE, PAGE_NOACCESS);
  if (!p2440a_intr_reg)
   {
    RETAILMSG(FUSQ_DEBUG, (TEXT("p2440a_intr_reg: VirtualAlloc failed!/r/n")));
    return(FALSE);
   }
   else
    RETAILMSG(FUSQ_DEBUG, (TEXT("p2440a_intr_reg: VirtualAlloc ok------------!/r/n")));
  if (!VirtualCopy((PVOID)p2440a_intr_reg, (PVOID)(S3C2440A_BASE_REG_PA_INTR >> 8), sizeof(S3C2440A_INTR_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
   {
    RETAILMSG(FUSQ_DEBUG, (TEXT("p2440a_intr_reg: VirtualCopy failed!/r/n")));
    return(FALSE);
   } 
   else
    RETAILMSG(FUSQ_DEBUG, (TEXT("p2440a_intr_reg: VirtualCopy ok-----!/r/n")));
   
   //relating the INTR to SystemIntr
   Irq=IRQ_EINT5;
   if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(Irq), &Key_Interrupt, sizeof(UINT32), NULL))
    {
      RETAILMSG(FUSQ_DEBUG, (TEXT("ERROR: KernelIoControl For Key_Interrupt failed./r/n")));
      Key_Interrupt = SYSINTR_UNDEFINED;
      return(FALSE);
    }
    else
     RETAILMSG(FUSQ_DEBUG, (TEXT("KernelIoControl For Key_Interrupt ok---./r/n"))); 
      
   Irq=IRQ_EINT6;
   if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(Irq), &Key_Interrupt1, sizeof(UINT32), NULL))
    {
      RETAILMSG(FUSQ_DEBUG, (TEXT("ERROR: KernelIoControl For Key_Interrupt1 failed./r/n")));
      Key_Interrupt1 = SYSINTR_UNDEFINED;
      return(FALSE);
    }
   
   
   //create Intr Event and relating Intr to Event        
  abc_KeyIntr_Event=CreateEvent(NULL,false,false,NULL);
  if(!abc_KeyIntr_Event)
  {
   RETAILMSG(FUSQ_DEBUG,(TEXT("CreateEvent--faile---/r/n")));
   return false;
  }
  else
   RETAILMSG(FUSQ_DEBUG,(TEXT("CreateEvent---OK--/r/n"))); 
   
  abc_KeyIntr_Event1=CreateEvent(NULL,false,false,NULL); 
  if(!abc_KeyIntr_Event1)
  {
   RETAILMSG(FUSQ_DEBUG,(TEXT("CreateEvent1--faile---/r/n")));
   return false;
  } 
  
  if(! InterruptInitialize(Key_Interrupt, abc_KeyIntr_Event, NULL, 0)) 
  {
      RETAILMSG(FUSQ_DEBUG,(TEXT("InterruptInitialize--Key_Interrupt to abc_KeyIntr_Event failed ./r/n")));
      return FALSE;
    }
    else
     RETAILMSG(FUSQ_DEBUG,(TEXT("InterruptInitialize--Key_Interrupt to abc_KeyIntr_Event ok----- ./r/n")));
  
  if(! InterruptInitialize(Key_Interrupt1, abc_KeyIntr_Event1, NULL, 0)) 
  {
      RETAILMSG(FUSQ_DEBUG,(TEXT("InterruptInitialize--Key_Interrupt to abc_KeyIntr_Event failed ./r/n")));
      return FALSE;
    }
  
  
  
  abc_Key_Thread=CreateThread((LPSECURITY_ATTRIBUTES)NULL,
                0,
                (LPTHREAD_START_ROUTINE)abc_KeyThread_Fun,
                0,
                0,
                NULL
                );

  if(!abc_Key_Thread)
   {
   RETAILMSG(FUSQ_DEBUG,(TEXT("CreateThread----faile--/r/n")));
   return false;
   }
  else
   RETAILMSG(FUSQ_DEBUG,(TEXT("CreateThread----OK--/r/n"))); 
  
  abc_Key_Thread1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,
                0,
                (LPTHREAD_START_ROUTINE)abc_KeyThread_Fun1,
                0,
                0,
                NULL
                );

  if(!abc_Key_Thread1)
   {
   RETAILMSG(FUSQ_DEBUG,(TEXT("CreateThread1----faile--/r/n")));
   return false;
   }
   
  return true;
}
BOOL  abc_Deinit(DWORD hDeviceContext)
{
  RETAILMSG(FUSQ_DEBUG,(TEXT("--------abc_Deinit--/r/n")));      
  return true;
}
DWORD abc_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode)
{
  RETAILMSG(FUSQ_DEBUG,(TEXT("--------abc_Open--/r/n")));   
  return true;
} 
BOOL   abc_Close(DWORD hOpenContext)
{
  
    RETAILMSG(FUSQ_DEBUG,(TEXT("--------abc_Close--/r/n")));
    return true;
}       
   
bool abc_IOControl(DWORD hOpenContext,DWORD dwCode,char pBufIn[],DWORD dwLenIn,char pBufOut[],DWORD dwLenOut,PDWORD pdwActualOut)
{            
  //PBYTE pBufOut  PBYTE pBufIn
    RETAILMSG(FUSQ_DEBUG,(TEXT("--------abc_IOControl----------------/r/n")));
    return true;            
}

void abc_KeyThread_Fun()
{
while(1)
{
  WaitForSingleObject(abc_KeyIntr_Event,INFINITE);
  RETAILMSG(FUSQ_DEBUG,(TEXT("Thread is running:times==%d/r/n"),i1));
  i1++;
  InterruptDone(Key_Interrupt);
  //OEMInterruptDone(Key_Interrupt);
}
} 
void abc_KeyThread_Fun1()
{
while(1)
{
  WaitForSingleObject(abc_KeyIntr_Event1,INFINITE);
  RETAILMSG(FUSQ_DEBUG,(TEXT("Thread is running:times1==%d/r/n"),i2));
  i2++;
  InterruptDone(Key_Interrupt1);
  //OEMInterruptDone(Key_Interrupt);
}
}
光电二极管探测器电流信号处理与指令输出系统 本文提出了一种基于Python的光电二极管电流信号处理系统设计方案。该系统能够实时采集、处理光电二极管输出的电流信号,并根据预设阈值输出控制指令。系统采用模块化架构,包含数据采集、信号处理、阈值检测、指令生成等核心模块。其中数据采集模块提供了模拟器实现和硬件接口框架,支持噪声模拟和脉冲信号生成。系统设计考虑了实时性、可靠性和可扩展性,适用于光强测量、光电检测等多种应用场景。 阅读详情

相关推荐

微带线,带状线和接地共面波导的区别

微带线,带状线和接地共面波导的区别

sky_ying的博客 3万+

WinCE下的中断处理过程15814101899

中断在系统设计中的应用非常广泛,可以说,硬件中断、软件中断无处不在,在WINCE下驱动开发更是如此,比如:按键中断、触摸屏中断、AUDIO中断、DMA中断.....等等,几乎含概每个模块。因此,了解中断的处理过程对驱动开发极其重要,下面对WINCE下的中断处理过程做一个简单介绍。    中断处理可以分为两部分:中断服务例程-ISR、中断服务线程-IST。系统在处理中断异常的时候,应该要尽可能快的完成,因此,我们应该ISR中做简短的处理,把中断标识返回给中断处理器,越快越好。那么就要把大部分的处理留给IST来

zmq5411的专栏 1926

C# 进程间 双内存共享 高帧率图像传输

演示了两个进程之间通过 双内存共享 的方式, 来实时处理图像,并以高帧率(40~60FPS)传输的基本示例。 进程间内存共享的优点:高性能、低延迟、资源效率高、简单可靠。 适用场景:实时图像处理、大数据传输、多进程协作、实时监控系统,等等。

qianqiansd 1996

WinCE中断处理程序ISR 详解

首先来解释一下, OAL实际上就是一个硬件的抽象层,WinCE的内核通过OAL来和硬件进行通信,应该说它并不包含硬件外设的驱动,而只是对基于处理器本身的硬件模块的控制。  ISR (Interrupt service routine),  中断处理程序。 WinCE实际上使用 ISR来处理中断,即默认的中断入口函数     ISR是OEM实现的一段这段处理代码,它属于OAL层的一部

shejiannan的专栏 2457

Ansys Lumerical FDTD仿真加速策略与高性能硬件选型指南

本文深入探讨了Ansys Lumerical FDTD仿真的核心加速策略,涵盖算法优化与硬件选型两大维度。通过合理运用非均匀网格、对称边界条件等算法技巧,并精准匹配CPU/GPU计算资源与高性能硬件配置,可显著提升仿真效率,将计算时间从数天缩短至数小时。

a0b1c2d3的专栏 607

Ubuntu下NVIDIA驱动安装全攻略:从报错到完美运行nvidia-smi的完整流程

本文提供了在Ubuntu系统中安装NVIDIA驱动的完整解决方案,重点解决因驱动版本冲突、内核模块未加载或Secure Boot安全启动导致的`nvidia-smi`报错问题。通过彻底清理旧驱动、处理Secure Boot、选择兼容版本并正确安装,最终确保驱动完美运行。

weixin_29196891的博客 364

wince中断的处理过程

中断是硬件与软件打交道的重要方法,因此,大多数驱动程序都涉及到对中断的处理,本文就驱动程序的开发人员以及BSP的开发人员的角度,来谈谈Windows CE中中断的处理过程。    如果一个驱动程序要处理一个中断,那么驱动程序需要首先建立一个事件,可以使用CreateEvent函数,然后调用InterruptInitialize将该事件与中断号绑定,这一步就会使能该中断,OAL中的OEMInerru

gooogleman#foxmail.com 1416

【ROS2】Arduino系列之机器人底盘实现

介绍ros中提供的一个已经封装了的模块: ros_arduino_bridge,该模块由下位机驱动和上位机控制两部分组成,通过该模块可以更为快捷、方便的实现自己的机器人平台

guilin 1484

WinCE中断处理过程

 l         当一个中断发生后,发送到内核异常处理器(Exception Handler)l         内核的中断支持处理器调用OAL函数OEMInterruptDisable屏蔽这个中断(../hal/Cfw.c)l         内核调用ISR,OEMInterruptHandler(../hal/arm/Armint.c),ISR按如下方式查询中断号:else

长豆角 2605

车联网ECU、TSP与TBOX通信流程

对比维度ECU(电子控制单元)BMS(电池管理系统)应用场景传统燃油车 + 新能源汽车仅限新能源汽车核心作用控制整车各系统运行管理动力电池安全与寿命车联网角色数据采集与传输的核心载体提供电池相关的核心数据。

tecoes的博客 1232

基于深度学习的水质预测:多参数监测与预测

首先,我们需要收集水质监测的多参数数据。收集到的数据应包括不同时间点的水质参数值以及相应的水质等级标签,用于训练和评估深度学习模型。同时,数据的质量和数量对于模型的性能也有重要影响,因此在实际应用中需要充分考虑数据的采集和处理过程。总之,基于深度学习的水质预测可以通过收集水质监测的多参数数据并使用适当的深度学习模型进行训练和预测来实现。通过以上的深度学习模型,我们可以利用水质监测的多参数数据进行水质预测。这种基于深度学习的方法可以提高水质预测的准确性和稳定性,为水质监测和环境保护提供有力支持。

web_bug407的博客 1103

深入理解wince7中断处理过程

在wince中断处理过程一文中我们知道在驱动中如何申请系统中断号、如何将中断和事件关联起来等,但是并不知道这些操作更底层的实现方式。在这里我们来对wince中断机制做一个更深入的理解,以zc702运行的wince7为例。 1、wince是如何通过物理中断号来申请系统中断号? 物理中断号irq是处理器为设备模块分配的具有唯一性的id,如zynq中uart0和gpio的物理中断号分别为59和52。

EmSoftEn的专栏 1217

基于业务目标的Agent自动化评测体系设计:超越准确率的有效性衡量

我们还是以电商全链路服务Agent我们还是以电商全链路服务Agent。

AI架构全栈开发实战笔记 318

wince6.0 +S3C6410 中断处理例子(按键控制LED灯)

首先:介绍一下wince中断处理过程, 1、当一个中断发生后,发送到内核异常处理器(ExceptionHandler) 2、内核的中断支持处理器调用OAL层函数OEMInterruptDisable 屏蔽中断(..\hal\Cfw.c)      屏蔽掉所有优先级等于或是小于当前优先级的中断 3、内核调用ISR,ISR  返回中断号(逻辑中断标识符)给内核。       内核的处

maoxiaosan的专栏 3517

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ARM中断分析之四:WinCE的OAL层的中断分析

作者:SUKHOI27SMK 转自:http://blog.youkuaiyun.com/sukhoi27smk/article/details/8570213 从前面的介绍,我们知道了裸机中断处理的流程、WINCE驱动的中断处理,但是,WINCE底层是怎么处理中断的呢?这里就是介绍WinCE系统的OAL层的中断处理。它和裸机的处理总体一样,只是实现细节方面有点区别,具体流程如下: 一、在O

老瓦的笔记本 515

Camera2Demo

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

S3C2410 && WinCE6.0的中断处理分析

转自:http://www.cnblogs.com/we-hjb/archive/2008/11/08/1329830.html      S3C2410的内核是ARM920T,所以,这里先介绍一下ARM920T的异常。ARM920T中有一个当前程序状态寄存器(CPSR),其中BIT6和BIT7分别控制FIQ和IRQ的使能与否。大家经常说的开中断和关中断,就是指的设置这两个BIT。

WHJ的嵌入式生活 965

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

wince6.0 +S3C6410 中断处理例子(按键控制LED灯)+应用程序控制LED流水灯

首先:介绍一下wince中断处理过程, 1、当一个中断发生后,发送到内核异常处理器(ExceptionHandler) 2、内核的中断支持处理器调用OAL层函数OEMInterruptDisable 屏蔽中断(..\hal\Cfw.c)      屏蔽掉所有优先级等于或是小于当前优先级的中断 3、内核调用ISR,ISR  返回中断号(逻辑中断标识符)给内核。       内核的处理程序打

电力行业解决方案 电力系统砖家 电动汽车砖家 3067

WINCE5.0的中断深入了解(转)

WINCE5.0的中断深入了解1.总体了解流程首先描述wince5.0 (2440BSP)的中断流程:流程1.创建事件aà创建线程ISTà用InterruptInitialize〈系统中断号绑定线程IST〉à线程IST进入等待事件a状态(挂起状态)。流程2.外部引发中断à OEMInterruptHandler屏蔽中断à把物理中断转换成系统中断,其他à重新使能中断。(ISR过程)>à操作系统根据系

josh915的专栏 1379

S3C2410 && WinCE6.0的中断处理分析 (转载自博客园牛人we-hjb)

转自:http://blog.youkuaiyun.com/gooogleman/archive/2009/02/05/3864269.aspx S3C2410的内核是ARM920T,所以,这里先介绍一下ARM920T的异常。ARM920T中有一个当前程序状态寄存器(CPSR),其中BIT6和BIT7分别控制FIQ和IRQ的使能与否。大家经常说的开中断和关中断,就是指的设置这两个BIT。     

Carlward 的专栏 470

wince5.0中断分析--精辟

 原帖地址http://topic.youkuaiyun.com/u/20071008/11/D54DF4A6-09EF-4D7F-AADB-2F60FF3824FC.html1 WinCE中第一次对中断的处理是在OAL的OEMInit()中,该函数调用OALIntrInit()完成对中断的初始化. 2 OALIntrInit()对中断的初始化做了如下工作: 2.1 通过配置IPR0-IPR33设

ymzhou117的专栏 585

wince5.0 中断 详解

原帖地址http://topic.youkuaiyun.com/u/20071008/11/D54DF4A6-09EF-4D7F-AADB-2F60FF3824FC.html1 WinCE中第一次对中断的处理是在OAL的OEMInit()中,该函数调用OALIntrInit()完成对中断的初始化.2 OALIntrInit()对中断的初始化做了如下工作:2.1 通过配置IPR0-I

wolfcmd1231的专栏 693

WinCE 5.0下鼠标键盘驱动分析

 本文通过对WinCE 5.0下的鼠标键盘驱动分析,对WinCE驱动程序设计进行了分析。欢迎大家对不对的地方指出。硬件写一个驱动程序的第一件事就是读硬件的规范文档。所以首先必须了解硬件才能写好驱动。鼠标和键盘现在已经成为现代PC机上不可缺少的组成部分了。有兴趣可以看下他们的发展历史:鼠标历史推荐链接:http:/www.blogchina.com/new/source/200.ht

luixing67的专栏 992

wince 5.0 .2440 5.0BSP的中断过程

作者:wuan584974722 转自:http://blog.youkuaiyun.com/wuan584974722/article/details/7953206 以前在优快云写过一些wince5.0中断的文章,现在重新看看,发现以前的有些理解是错误的,想翻开来改改,可是郁闷的优快云在前台没有返回后台的编辑功能,所以现在重新写一篇纠正一下。       首先描述wince5

老瓦的笔记本 745

【转】学习wince中断时将资料整理成一篇文章(一)

WINCE5.0的中断深入了解1.总体了解流程首先描述wince5.0 (2440BSP)的中断流程:流程1.创建事件aà创建线程ISTà用InterruptInitialize〈系统中断号绑定线程IST〉à线程IST进入等待事件a状态(挂起状态)。流程2.外部引发中断à OEMInterruptHandler<屏蔽中断à把物理中断转换成系统中断,其他à重新使能中断。(ISR过程)...

weixin_30321449的博客 80
上一篇: wince7中实现对中文的支持
下一篇: 深入理解wince7中断处理过程
EmSoftEn
博客等级 码龄12年 40粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值