计数器(Counter)、时钟(Clock)、告警器(Alarm)、定时器(Timer)

PIC单片机学习第三天--TMR0 TMR1为16位宽,附带一个可编程的预分频器和一个可选的低频时基振荡器,适合与CCP (捕捉/比较脉宽调制)模块配合使用来实现输入捕捉或输出比 较功能,也可用于定时和计数.。1、定时功能:所谓定时功能就是通过来自单片机内部的时钟脉冲作计数脉冲,使计数器计数,即每个机器周期计数器加1,计数值达到予置值后,定时/计数模块产生溢出。(3) TMR0也是一个在文件寄存器区域内统一编址的寄存器,地址为01H或101H,用户用软件方式可直接读/写计数器的内容。(2) 有一个专用的外部触发信号输入端(T0CKI)。 阅读详情

 http://bbs.21ic.com/club/bbs/ShowAnnounce.asp?v=&ID=2458545

gdtyy 发表于 2007-3-6 15:51 ZLG-ARM ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

*******************
* 第十讲 时间管理 *
*******************
    2007/03/06  asdjf@163.com  www.armecos.com
    
    时间管理是操作系统的一项重要功能,硬件必须提供一个周期性的时钟或者定时器,以支持系统中与时间相关的功能部件。一般,大多数CPU都有一个或多个内置定时器,提供周期性的中断,即使没有内置定时器,也必须使用外部定时器或时钟。
    
    ecos抽象了时间相关硬件的本质,提供了通用的时间管理机制。这些定时机制包括:计数器(Counter)、时钟(Clock)、告警器(Alarm)和定时器(Timer)。有了这些抽象概念,我们就不必做一些搭架子的重复性工作了,也不必在硬件细节上浪费时间,而是集中精力在功能实现上。针对抽象平台接口编程的好处是移植性好,以不变应万变。
    
    计数器---对指定事件进行单调递增计数。
    时钟-----对具有一定周期性的时间滴答(tick)进行计数的计数器(对时间进行计数)。
    告警器---在计数器的基础上增加一个提示功能的机制,或者基于计数器的值产生具有周期性的事件。
    定时器---简单地附加在时钟上的告警器。
    
    这些时间相关API函数的定义都在<cyg/kernel/kapi.h>内,使用时必须包含该头文件。
    
    ==========
    * 计数器 *
    ==========
    创建
    void cyg_counter_create(cyg_handle_t *handle, cyg_handle_t *counter)
    该函数创建一个性的计数器,新计数器的句柄通过handle返回。
    cyg_handle_t---cyg表示cygnus公司定义,handle是句柄,t是type的缩写(类型),合起来的意思是cygnus公司定义的句柄类型,很好理解吧。所有计数器函数都是cyg_counter开头的,只要看到有counter,就知道和计数器有关。
    counter是应用程序提供给该计数器所需的内存,从而减少了在内核中进行动态内存分配的需求。ecos里很多函数都是由应用程序提供目标对象所需内存,使用静态内存分配而不是动态分配符合嵌入式系统的特点。
    
    删除
    void cyg_counter_delete(cyg_handle_t counter)
    
    读指定计数器当前值
    cyg_tick_count_t cyg_counter_current_value(cyg_handle_t counter)
    
    设置指定计数器值
    void cyg_counter_set_value(cyg_handle_t counter, cyg_tick_count_t new_value)
    
    计数器加1
    void cyg_counter_tick(cyg_handle_t counter)
    创建一个新的计数器不会自动将事件源连接到该计数器上,无论相对应的时间何时发生,都需要调用cyg_counter_tick函数使计数器加1计数。一般在事件中断的DSR里调用此函数。
    
    计数器值增加指定tick数
    void cyg_counter_multi_tick(cyg_handle_t counter, cyg_tick_count_t ticks)
    
    ========
    * 时钟 *
    ========
    内核级的所有与时钟相关的操作包括延时、超时和告警等都是以时钟滴答为单位进行工作的,而不是以秒或微秒为单位。如果应用程序或其他软件需要使用秒或微秒这样的时间单位,则需要将这些时间单位转换为时钟滴答。这是因为只有时钟滴答才能精确地反映出硬件的支持条件。而且如果使用传统意义上的时间单位如纳秒(ns),则硬件有可能不能提供支持。另一个原因是在时钟滴答和传统意义上的时间单位之间的转换需要浪费很多代码和数据,采用时钟滴答为单位可以节省代码量和CPU时间。
    时钟单位间的转换需要一个分辨率,如100Hz运行的时钟,1秒内产生100次tick,则分辨率为1000000000(ns) : 100(tick)。同样,60Hz的分辨率为1000000000 : 60。
    将一个以纳秒为单位的延时除以分辨率就可以转换为对应的时钟滴答。如一个50ms的延时(50000000ns),时钟频率为100Hz(即分辨率1000000000 : 100),那么可以通过下面的计算转换为时钟滴答:
    50000000 ÷ (1000000000/100) = 5
    即:50ms的延时在100Hz时钟分辨率下对应5个tick。
    
    创建
    void cyg_clock_create(cyg_resolution_t resolution, cyg_handle_t *handle, cyg_clock *clock)
    使用给定分辨率创建一个新的时钟,新时钟的句柄由handle带回。
    
    删除
    void cyg_clock_delete(cyg_handle_t clock)
    调用此函数前应确保系统中已经没有使用该时钟的组件。
    
    将时钟转换为计数器
    void cyg_clock_to_counter(cyg_handle_t clock, cyg_handle_t *counter)
    
    设置时钟分辨率
    void cyg_clock_set_resolution(cyg_handle_t clock, cyg_resolution_t resolution)
    
    获取时钟分辨率
    cyg_resolution_t cyg_clock_get_resolution(cyg_handle_t clock)
    
    获取系统的实时时钟(RTC,不是外部RTC,是内核抽象的clock)
    cyg_handle_t cyg_real_time_clock(void)
    
    获取当前的系统时间,单位为时钟滴答。系统时间用64位的数字表示。
    cyg_tick_count_t cyg_current_time(void)
    
    ==========
    * 告警器 *
    ==========
    内核告警器与计数器一起使用,使得当某种时间发生了一定的次数时采取响应的动作。如果与计数器一起使用的是时钟,那么当时间滴答的个数达到适当的值也就是在一定的时间周期后将发生告警行为。
    
    创建
    void cyg_alarm_create
    (
        cyg_handle_t counter,  //和告警器一起使用的计数器
        cyg_alarm_t *alarmfn,  //告警时的回调函数
        cyg_addrword_t data,   //传给回调函数的参数
        cyg_handle_t *handle,  //返回的告警器句柄
        cyg_alarm *alarm       //告警器对象
    )
    其中alarmfn对应的回调函数格式如下:
    void alarm_fun(cyg_handle_t alarm, cyg_addrword_t data)
    {
        ......
    }
    
    删除
    void cyg_alarm_delete(cyg_handle_t alarm)
    
    初始化并启动一个告警器
    void cyg_alarm_initialize
    (
        cyg_handle_t alarm,         //告警器句柄
        cyg_tick_count_t trigger,   //绝对触发时间
        cyg_tick_count_t interval   //触发间隔
    )
    
    返回告警器的下一次触发的绝对时间和它的触发间隔
    void cyg_alarm_get_times
    (
        cyg_handle_t alarm,         //待查询的告警器的句柄
        cyg_tick_count_t trigger,   //下一次触发时的绝对时间
        cyg_tick_count_t interval   //当前触发间隔
    )
    
    使能告警器
    void cyg_alarm_enable(cyg_handle_t alarm)
    
    禁止告警器
    void cyg_alarm_disable(cyg_handle_t alarm)

===========================================================================================
    下面用一个具体实验来说明时间相关API函数的用法。
    使用时钟函数统计程序执行时间,在程序开始执行前和执行完毕后分别调用cyg_current_time获得开始时间和结束时间,将tick单位转换为毫秒单位,计算单位时间内执行循环次数和单个循环执行时间。
    使用告警器,以2秒为周期,让蜂鸣器交替发声和静音。
    注意:cyg_current_time得到的时间是64位的,printf显示64位整数时使用“%lld”格式(MSVC中使用“I64d”);另外不要在告警器回调函数里使用printf函数。
    测试SmartARM2200的结果为(循环0x80000次):每秒执行195527.8次循环,每循环执行时间为5us。蜂鸣器响2秒,停2秒,周而复始。
    测试EasyARM2200的结果为(循环0x80000次):每秒执行344926.3次循环,每循环执行时间为3us。
    由此可见EasyARM2200比SmartARM2200速度快,具体原因是前者用的SRAM比后者用的PSRAM快。
    有了时间相关函数后,我们就可以定时执行某些任务、统计bit速率。例如:在图象处理中能够比较方便地定时插入I帧,码源速率控制......
    
//测试程序

#include <cyg/kernel/kapi.h>
#include <cyg/hal/hal_io.h>
#include <cyg/hal/plf_io.h>

#define STACK_SIZE 4096
#define ALARM_INTERVAL 200  //2秒

#define BEEPCON 0x0000080

#define LOOPNUM 0x80000

char stack[STACK_SIZE];
static cyg_thread thread_data;
static cyg_handle_t thread_handle;

cyg_handle_t counter_handle;
cyg_handle_t alarm_handle;
cyg_alarm    alarm_object;

void alarm_func(cyg_handle_t alarm_handle, cyg_addrword_t data)
{
    int i;
        
    HAL_READ_UINT32(LPC2XXX_GPIO_IO0SET,i);
    
    if((i&BEEPCON) == 0 )
        {
        HAL_WRITE_UINT32(LPC2XXX_GPIO_IO0SET,BEEPCON);
        }
    else
        {
        HAL_WRITE_UINT32(LPC2XXX_GPIO_IO0CLR,BEEPCON);
        }
}

void
alarm(cyg_addrword_t data)
{
    cyg_tick_count_t t1, t2, t;
    int i, sum;
    
    printf("/n/n/n");
    printf("/t    *******************************/n");
    printf("/t    *     Hello! Alarm test.      */n");
    printf("/t    *******************************/n/n/n");
    
    printf("Test speed:/n");
    sum = 0;
    t1 = cyg_current_time();
    for(i = 0; i < LOOPNUM; i++)
        {
        sum = sum + i;
        }
    t2 = cyg_current_time();
    t = abs(t2-t1) * 10;
    printf("start=%lld/nend=%lld/n", t1, t2);
    printf("Total time = %lldms/n",t);
    printf("Total loop = %lld/n", LOOPNUM);
    if(t == 0)
        {
        t = 1;
        }
    printf("%lf(loop/sec) , %lf(sec/loop)/n", LOOPNUM * 1000.0 / t, t / 1000.0 / LOOPNUM);
        
    //设置输出到BEEP
    HAL_WRITE_UINT32(LPC2XXX_GPIO_IO0DIR,BEEPCON);
    
    //禁止刚一开始就BEEP,上电缺省输出是低电平,导致一开始就鸣叫。
    HAL_WRITE_UINT32(LPC2XXX_GPIO_IO0SET,BEEPCON);
    
    //将时钟转换为计数器。cyg_real_time_clock()函数获取系统实时时钟(RTC)。实时时钟用于系统的延时、阻塞等待等操作。
    cyg_clock_to_counter(cyg_real_time_clock(), &counter_handle);
    
    //创建警告器
    cyg_alarm_create(counter_handle, alarm_func, 0, &alarm_handle, &alarm_object);
    
    //初始化警告器
    cyg_alarm_initialize(alarm_handle, cyg_current_time() + ALARM_INTERVAL, ALARM_INTERVAL);
    
    //使能警告器
    cyg_alarm_enable(alarm_handle);
    
    while(1)
        {
        cyg_thread_delay(2000);
        }
}

void
cyg_start(void)
{
    // Create a main thread, so we can run the scheduler and have time 'pass'
    cyg_thread_create(10,                // Priority - just a number
                      alarm,              // entry
                      0,                 // entry parameter
                      "alarm",            // Name
                      &stack,         // Stack
                      STACK_SIZE,        // Size
                      &thread_handle, // Handle
                      &thread_data    // Thread data structure
            );
    cyg_thread_resume(thread_handle); // Start it
    cyg_scheduler_start();
}

Vivado中的IP核——timer/counter详解 Vivado中的AXI Timer的使用 阅读详情

相关推荐

【信息科学与工程学】【控制科学】第十二篇 微型计算机控制技术01

更精确的经典模型:I1在第5周期WB结束,I2最早可在第6周期进入EX,但I2在ID阶段就需要R1,因此I2的ID需在第6周期,而I1的WB在第5周期,所以I2的ID可以紧接在第6周期,但中间仍有一个stall(因为I1的EX结果要等到MEM之后才能转发给ID?有优先级继承后,Task_L被提升优先级,不会被Task_M抢占,阻塞时间缩短为Task_L剩余执行时间(9ms),仍可能超过10ms,但可通过调整任务周期或使用中断处理缓解。电感L=10μH,输出电容C=100μF,ESR=5mΩ。

weixin_49199313的博客 8632

Timer/Counter

虽说是定时/计数器,其实还是计数器,计数*机器周期=定时

应尽便须尽,无复独多虑 2188

【信息科学与工程学】计算机科学与自动化 第二百三十三篇 凤凰架构01

编号类型领域系统软件/硬件或系统集成方案及系统架构模块子模块函数名称/算法名称算法的数学分析及计算机体系架构及数据结构与算法详细设计及参数列表及数值范围设计关联知识1共识算法分布式基石状态机复制架构:Proposer/Acceptor/Learner 多节点角色模型,基于操作转移(Operation Transfer)分布式共识PaxosPaxos 协议(Prepare/Promise/Accept/Accepted 两阶段)数学基础:多数派(Quorum)投票,基于鸽巢原理保证 W+R>N 时读写集合必有

weixin_49199313的博客 265

单片机小白学习之路(十五)---定时器和计数器的理解(一)

目标:定时器和计数器的理解(一) 1.定时器/计数器简介 定时器/计数器(Timer/Counter,简称T/C)是单片机中最基本的接口之一。即可以定时又可以计数。常用于计数、延时、测量周期/脉宽/频率、提供定时脉冲信号等。 8051系列单片机至少含有2个16位的T/C,STC89C51/52含有3个T/C。其中2个为基本定时器/计数器T/C0和T/C1,另一个是T/C2...

weixin_43554366的博客 2740

嵌入式工程师必学(20):Timer/Counter接口基础

Timer就是定时器,一般做周期性任务处理时使用。在芯片中,Timer是如何设计,寄存器又是如何控制的呢? 定时器模式通常用于测量事件发生的时间或测量两个事件之间的时间差。计时器功能增加/减少了一个在0和存储在周期寄存器中的值之间的计数器。当计数器运行时,将存储在计数器寄存器中的计数值与比较/捕获寄存器(CC0和CC1)进行比较。当计数器等于CC0时,就会生成cc0_match事件,甚至当计数器等于CC1时,也会生成cc1_match事件。 有四种Timermode: Clockpresc.

码农17年的博客 2856

从隐私保护到生命守护:CPD技术中的传感器选择与权衡

本文探讨了智能座舱中儿童存在检测(CPD)技术的传感器选择与隐私保护平衡策略。通过分析毫米波雷达、UWB等先进技术的性能与隐私风险,揭示了如何在确保儿童安全的同时保护用户隐私。文章还展望了CPD技术与座舱生态系统的未来融合趋势,为汽车安全领域提供了重要参考。

weixin_29159441的博客 301

Timer和counter

什么是Timer,什么是Counter 几乎每个嵌入式板都会有counter和timer,重要性比肩gpio.本质上来看timer和counter几乎是一样的东西,底层都是一个硬件counter,如果是按照规律的时间跳表,就是timer,如果是按照不规律的事件讯号跳表就是counter.一般timer/counter统一称作timer.   Timer. 一个典型的Timer包含以下元件:...

weixin_34253126的博客 1656

【硬件工程师职业细分】揭秘硬件基带工程师

你知道硬件工程师的细分领域硬件基带工程师吗? 它们和常见的硬件工程师又有哪些不同? 福利待遇怎么样?有哪些职业要求? 快来涨上一波知识吧~

woshizzai的博客 1万+

第八讲 内存管理zz

发信人: gdtyy (gdtyy), 信区: Embedded标  题: 第八讲 内存管理发信站: 水木社区 (Mon Jun 25 23:33:26 2007), 站内******************** 第八讲 内存管理 ********************    2007/02/03  asdjf@163.com  www.armecos.com    在嵌入式系统中,为了

autoca的专栏 1530

Python介绍与安装

Python介绍与安装

acegi13579的专栏 3221

在Jetson orin板卡上部署ocr模型遇到错误

摘要:安装ONNX Runtime GPU版本时遇到问题,直接pip install onnxruntime-gpu会报错。解决方案是从test.pypi.org下载对应的.whl文件(如ort_nightly-1.14.0...aarch64.whl),本地安装后还需降级NumPy版本(如pip install numpy==1.26),以解决NumPy版本兼容性问题。整个过程涉及三个关键步骤:下载正确架构的wheel文件、本地安装、调整NumPy版本。

xdxd3c的博客 1526

再谈 输入捕获与输出比较

输入捕获与输出比较   输入捕捉可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。 外部事件发生的触发信号由单片机中对应的引脚输入(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现。 时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志 输出比较:定时器中计数寄存器在初始化完后会自动的计数。

gtkknd的专栏 3946

LangChain与LangGraph核心区别解析

LangChain与LangGraph是当前大语言模型(LLM)应用开发中两个紧密相关且极具影响力的开源框架。它们源于LangChain AI公司,设计哲学互补,旨在解决不同维度的LLM工程化问题,共同构成了构建复杂智能应用的强大工具集。

weixin_35774598的博客 1919

Jmeter 实现mqtt协议压力测试

1. 下载jmeter,解压 https://jmeter.apache.org/download_jmeter.cgi 以 5.4.3 为例,下载地址: https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.zip linux下解压: unzip apache-jmeter-5.4.3.zip 2. 下载mqtt-jmeter插件 下载地址: https://github.com/emqx/mqtt-jmeter/releases h

Knowledge Archiving and Sharing 2万+

Matlab在线性代数中的应用(一):向量组的线性相关性

求列向量组A的一个最大线性无关组可用命令rref(A)将A化成行最简形,其中单位向量对应的列向量即为最大线性无关组所含向量,其它列向量的坐标即为其对应向量用最大线性无关组线性表示的系数。 01 — 例1 求下列矩阵列向量组的一个最大无关组。 解:编写脚本文件如下: >>format rat a=[1,-2,-1,0,2;-2,4,2,6,-6;2,-1,0,2,3;3,3,3,3,4]; b=rref(a) 求得: b...

wenyusuran的专栏 3237

【YOLOv8改进[Conv]】使用OREPA助力V8更优秀

使用OREPA助力V8更优秀,降低训练成本,在不引入任何推理时间成本的情况下提高深度模型的性能。

静谧、淡雅 1918

ARM如何利用PMU的Cycle Counter(时钟周期)来计算出CPU的时钟频率

本章将学习如何利用ARM PMU的Cycle Counter,来计算出CPU的时钟周期,从而计算出CPU的时钟频率。在介绍计算方法前,有必要先介绍下什么是时钟周期、机器周期以及指令周期。

DayDayUp 9016

Android性能分析——hprof文件分析(一)

hprof  文件是 Java 堆转储文件(Heap Dump File)的标准格式,用于保存 Java 虚拟机(JVM)在某个时间点的内存快照。这种文件对于分析内存泄漏、内存使用情况和对象分配模式非常有用。

小旭的专栏 1878

eCos嘀嗒定时器

mingdu.zheng <at> gmail <dot> comhttp://blog.youkuaiyun.com/zoomdy/article/details/8869843 1.概述 嘀嗒定时器(Tick)是操作系统的核心部件之一,操作系统使用嘀嗒定时器实现时间片轮、延时、超时判断等特性。 本文介绍eCos系统中的嘀嗒定时器的使用和实现,以及需要考虑的一些问题。 ...

zoomdy's blog 4809

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ecos内存管理

    在嵌入式系统中,为了对内存资源进行很好地控制,避免发生不可预测的后果,一般建议使用静态内存分配。ecos是专门为实时嵌入式系统量身定做的操作系统,它的大多数系统调用在被使用时都要求将预先指定的由系统调用所产生的目标对象的内存地址传递给该系统调用(即对其进行静态内存分配)。如第一讲cyg_thread_create系统调用函数就要求传入句柄指针和线程数据结构体指针及堆栈起址,而这三个指针对应

aaaaatiger--寻路 4152

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

STM32 eCos 启动代码分析(三)系统时钟滴答

时钟滴答好比人的心脏一样,是操作系统必不可少的一个部件,在线程的切换和软件延时等系统时间相关功能中起着无法替代的角色。 操作系统中的时钟滴答,需要一个周期性的可配置的信号源来实现,并且一般都是以中断的方式在后台通知系统下一个滴答的到来。 (本文原创,转载请注明出处http://blog.youkuaiyun.com/rickleaf) eCos中为了提供移植性,一般会用CYGNUM_HAL_INTERR

嵌入式虚拟系统实验室 5340

eCos中断模型

0 中断相关硬件描述 现代嵌入式设备中,设备通过中断控制器向CPU报告自身发生了某些事,如图0所示。   图0 图0所示的已经是一个功能比较齐全的SOC架构了。中断控制器中这两个寄存器不一定存在,但是其所代表的功能是存在的,同样,CPU中某寄存器中的两个比特位也不一定都存在,但是CPU中一定有别的东西来代替它(至少i-bit的概念一定是存在的)。 0.1 综述 下面以图0所

mrwangwang的专栏 2996

11.RTT-RTC设备及其Alarm用法

RTC (Real-Time Clock)实时时钟可以提供精确的实时时间,它可以用于产生年、月、日、时、分、秒等信息。目前实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。有些时钟芯片为了在主电源掉电时还可以工作,会外加电池供电,使时间信息一直保持有效。RT-Thread 的 RTC设备为操作系统的时间系统提供了基础服务。面对越来越多的 IoT 场景,RTC 已经成为产品的标配,甚至在诸如 SSL 的安全传输过程中,RTC 已经成为不可或缺的部分。保存设置,对工程进行编译和下载即可。输入 date 可查看

qq_45902737的博客 1768

【英飞凌学习笔记】STM-系统计时器

芯片中系统计时器的作用是为了同步 CPU 中各种门电路,产生时钟频率,或者对外设提供的脉冲信号计数³⁴⁵。系统计时器可以显示时间与记录时间,可以产生时间中断,也可以对年、月、日、周日、时、分、秒进行计时。英飞凌TC3系列芯片是一种32位TriCore™微控制器,可以用于汽车、工业和通信领域¹。系统计时器是TC3系列芯片中的一个重要模块,它可以提供多种定时功能,例如周期性中断、延时、PWM波形生成等²。

qq_44688936的博客 1876

6 计数器

一、计数器概念 计数是一种最简单基本的运算,计数器就是实现这种运算的逻辑电路,计数器在数字系统中主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能, 同时兼有分频功能。 计数器在数字系统中应用广泛,如电子计算机的控制器中对指令地址进行计数,以便顺序取出下一条指令,在运算器中作乘法、除法运算时记下加法、减法次数,又如在数字仪器中 对脉冲的计数等等。 二、计数器计时计算 计数器计时主要与时钟频率有比较大的关系 要实现1s的计数,用50Mhz的晶振来实现,其计算过程如下所示 f=50Mhz=510四次方KH

weixin_48564372的博客 1283

创建定时任务—Timer与Alarm

Android中的定时任务一般有两种实现方式,一种是使用Java API中提供的 Timer 类,一种是使用Android的 Alarm 机制。 这两种方式在多数情况下都能实现类似的效果,但是 Timer 有一个明显的短板,就是不太是用于那些需要长期在后台运行的定时任务。

郭丽鹏的博客 1249
上一篇: 同步原语
下一篇: ecos增值包应用举例---视频监控终端方案
aaaaatiger
博客等级 码龄20年 535粉丝 627原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值