MTK(6225)定时器源代分析

mtk 中断 MTK平台有个图层的概念。每个层的数据存放在不同的buffer中,这些buffer可以从LCD对应的寄存器中读出。具体的自己去查对应平台的规格书吧。MTK的平台是你在blockwrite中通过STARTLCDTRANSFER打开这个寄存器对应的位,然后硬件把每一层图像中对应的像素点取出,然后通过硬件合成,把合成后的数据通过你在LCD_DATA_ADDR中设置的端口地址找到LCD接口,送入L 阅读详情

转载的 MTK(6225)定时器源代分析 写的很好,思路很清楚,内容充实,小辈学习了!

转载注明出处,版权归作者所有

lyzaily@126.com

yanzhong.lee

http://blog.163.com/lyzaily@126/blog/static/424388372009290535834/

 

最近在网上看了一些MTK定时器的有关博文,但是没有结合源代分析所以一下子可能看的不是太明白,我现在结合MTK6225源代码进行简单的说明,以便于大家交流!

(一)首先我想给出几个有关定时器的重要全局变量:

1:

static TIMERTABLE g_timer_table = {0}; 
说明:

        g_timer_table 是系统维护的一个定时器链表,每一个TIMERTABLE变量可以储存12(或者24)个定时器;

TIMERTABLE的结构是:

typedef struct timertable
{
    mmi_frm_timer_type tm[SIMULTANEOUS_TIMER_NUM]; 
    struct timertable *next;   
} TIMERTABLE;
其中mmi_frm_timer_type结构是:

typedef struct {
    U16 timer_info;    
    eventid event_id;  
    oslTimerFuncPtr callback_func; 
    void* arg;
} mmi_frm_timer_type;

SIMULTANEOUS_TIMER_NUM==12 or 24,这两个值是系统推荐的值。

mmi_frm_timer_type中的成员timer_info最高BIT位表示了是队列定时器(0)还是非队列定时器(1);

event_id是个指针便利,由evshed_set_event()分配并返回的;

evshed_set_event()函数是源代码 MTK没有给出,只给出了简单的接口说明 如下英文所示:

 

这段话是什么意思:

                          就是说每个定时器(each timer item)中的成员变量event_id所指向的内存空间都是由函数evshed_set_event()分配的,并且将指向给内存的指针返回给调用者(也就是将event_id保存到全局变量
TIMERTABLE.tm[xxxx].event_id中);如果上层应用将该event id保存到了TIMERTABLE.tm[xxxx].event_id,则当事件取消函数执行后(
evshed_cancel_event(event_scheduler *es, eventid *eid))或者定时事件结束后,上层应用(caller)必须将TIMERTABLE.tm[xxxx].event_id置城NULL。

2:

static U16 g_timer_table_size = 0;

表示全局变量g_timer_table中最多能储存多少个定时器;系统刚启动时对多能存储12个或24个,究竟多少个要取决于你系统中 SIMULTANEOUS_TIMER_NUM宏的值;当系统运行一段时间以后定时器个数已经超过了SIMULTANEOUS_TIMER_NUM宏所能表示范围;则需要系统分配一个TIMERTABLE大小的变量空间并将该空间的指针赋给全局变量g_timer_table 中的成员next指针;

请参阅L4StartTimer中的部分代码:

 .....

.....

  pTable = &g_timer_table;
    if (g_timer_table_used >= g_timer_table_size)
//表示当前已经使用的定时器数超过了一个TIMERTABLE变量所

                                                                            //能存储的定时器个数
    {
       
        do
        {
            if (pTable->next == NULL)
            {
                pTable->next = OslMalloc(sizeof(TIMERTABLE));
                memset(pTable->next, 0, sizeof(TIMERTABLE));
                g_timer_table_size += SIMULTANEOUS_TIMER_NUM;
                pTable = pTable->next;
                i = 0;
                break;
            }
            pTable = pTable->next;
        } while (pTable != NULL);
    }
    else

....

....

[粉红色英文是什么意思?]

    如果TIMERTABLE列表没有足够的空间存储定时器时,说明MMI在某个时刻需要更多的定时器同时运行,我们可以给系统分配更多的内存空间;但是我们不需要去释放刚才分配给TIMERTABEL列表的空间。那么这个空间在哪里释放呢?是在系统启动时释放;系统刚启动时在TIMERTABLE列表中只维护一个节点,只有当系统运行之后所需的定时器超过了12或24个时才为下一个列表节点分配空间;当系统重新启动后多余的节点空间就被释放。如下代码所示, 在L4InitTimer()中 。

mmi_create()->MMI_Init()->L4InitTimer()

...

...

 
   
   
    TIMERTABLE *p;
    TIMERTABLE *pp;

   
   
   
   
    p = g_timer_table.next;
    pp = NULL;
    do
    {
        if (p != NULL)
        {
            pp = p->next;
            OslMfree(p);
        }
        p = pp;
    } while (p != NULL);

...

...

3:

static U16 g_timer_table_used = 0;

表示当前系统中已经使用了多少个定时器。

(二)定时器代码执行流程分析

要认识MTK定时器的工作机制,必须要分析如下几个函数的执行过程:

1:L4InitTimer()

2:StartTimer()

3:StopTimer()

4:L4CallBackTimer()

 

(一)L4InitTimer()已经在上面分析过,主要的工作就是释放TIMERTABLE列表中除了g_timer_table全局变量占有的所有内存空间  ;初始化全局变量;初始化系统默认的队列定时器、非队列定时器(使用函数static_init_timer() 和new_evshen())  .

(二)StartTimer()

           首先在全局变量g_timer_table寻找是否有空间,如果有则找到存储定时器信息空间;否则分配一个TIMERTABLE类型变量的空间,并添加到g_timer_table中供系统使用。

           有了存储定时器的空间后,主要做了以下工作:

            判断是队列定时器还是非队列定时器,并添加到对应的定时器调度队列中。

          
    if (alignment == TIMER_IS_NO_ALIGNMENT)
    {
       
        pTable->tm[i].timer_info = nTimerId | NO_ALIGNMENT_TIMER_MASK;
        pTable->tm[i].event_id = evshed_set_event(
                                    event_scheduler1_ptr, //非队列定时器调度队列
                                    (kal_timer_func_ptr) L4CallBackTimer,
                                    (void*)&(pTable->tm[i]),
                                    temp);
        pTable->tm[i].arg = funcArg;
        pTable->tm[i].callback_func = TimerExpiry;
        g_timer_table_used++;
    }
    else if (alignment == TIMER_IS_ALIGNMENT)
    {
       
        pTable->tm[i].timer_info = nTimerId | ALIGNMENT_TIMER_MASK;
        pTable->tm[i].event_id = evshed_set_event(
                                    event_scheduler2_ptr,  //队列定时器 调度队列
                                    (kal_timer_func_ptr) L4CallBackTimer,
                                    (void*)&(pTable->tm[i]),
                                    temp);
        pTable->tm[i].arg = funcArg;
        pTable->tm[i].callback_func = TimerExpiry;
        g_timer_table_used++;
    }

 

(三)L4CallBackTimer()

             分析如下代码,当定时时间到时,会执行该函数;执行用户为定时器制订的定时器到期时要执行的任务;并且将外部消息队列中的消息取出并存储到MMI的循环消息队列中。


static void L4CallBackTimer(void *p)
{
   
   
   
    mmi_frm_timer_type *pTimer = (mmi_frm_timer_type *)p;
    U32 nTimerId = pTimer->timer_info & (~NO_ALIGNMENT_TIMER_MASK);
    oslTimerFuncPtr pTimerExpiry = pTimer->callback_func;
    void * arg = pTimer->arg;

   
   
   
    MMI_ASSERT(nTimerId < MAX_TIMERS);

    MMI_TRACE(MMI_FW_TRC_G1_FRM, MMI_FRM_INFO_L4DRV_CBTIMER_HDLR, nTimerId, pTimerExpiry);
    g_timer_table_used--;
    memset( pTimer, 0, sizeof(mmi_frm_timer_type));
   
   

    if (pTimerExpiry) //用户在L4StartTimer()函数中设置的定时器结束时的回调函数
    {
        pTimerExpiry((void *)arg);
    }

    mmi_frm_fetch_msg_from_extQ_to_circularQ();

   
}

 (四)L4stopTimer 就不用介绍了,很简单。

 

(五) 我们在(三)中已经知道,当定时器到期时会通过 L4CallBackTimer()函数调用我们APP层所制订的定时器到期回调函数;那么究竟 L4CallBackTimer()是如何被系统调用的呢????由于MTK对系统中的定时器作了封装无法看到源代码,所以我这里只是猜测,如果有错请各位看官指正,在此先谢谢各位!

             在MMI_task()中有如下代码:

        

                     switch (Message.msg_id)
                        {

                            ...

                            ...
                            case MSG_ID_TIMER_EXPIRY:
                            {
                                kal_uint16 msg_len;

                                EvshedMMITimerHandler(get_local_para_ptr(Message.oslDataPtr, &msg_len));
                            }
                                break;

 

                          ...

                          ...

                  }

 

而函数EvshedMMITimerHandler()代码如下:



void EvshedMMITimerHandler(void *dataPtr)
{
   
   
   
    stack_timer_struct *stack_timer_ptr;

    stack_timer_ptr = (stack_timer_struct*) dataPtr;

   
   
   
    if (stack_timer_ptr == &base_timer1)
    {
        if (stack_is_time_out_valid(&base_timer1))
        {
            evshed_timer_handler(event_scheduler1_ptr);
        }
        stack_process_time_out(&base_timer1);
    }
    else if (stack_timer_ptr == &base_timer2)
    {
        if (stack_is_time_out_valid(&base_timer2))
        {
            evshed_timer_handler(event_scheduler2_ptr);
        }
        stack_process_time_out(&base_timer2);
    }
}

并且在L4CallBackTimer中调用了一个函数mmi_frm_fetch_msg_from_extQ_to_circularQ();而该函数的功能是将外部消息队列中的消息取出来,放入MMI的循环消息队列中。我们来看看 mmi_frm_fetch_msg_from_extQ_to_circularQ()中的一个代码片断;就会发现该函数放入MMI循环消息队列中的消息就是MMI_task()接下来就要处理的消息。

mmi_frm_fetch_msg_from_extQ_to_circularQ()代码片断如下:

            if (mmi_frm_check_is_valid_msg(&checkBaseNode, &Message) == 1)
            {
               
               
ilm_ptr.src_mod_id = Message.src_mod_id;
                ilm_ptr.dest_mod_id = Message.dest_mod_id;
                ilm_ptr.msg_id = Message.msg_id;
                ilm_ptr.sap_id = Message.sap_id;
                ilm_ptr.local_para_ptr = Message.local_para_ptr;
                ilm_ptr.peer_buff_ptr = Message.peer_buff_ptr;

                flag = OslWriteCircularQ(&ilm_ptr);
                MMI_ASSERT(flag == 1);
               
                if (Message.src_mod_id != MOD_TIMER)
                {
                    hold_local_para(ilm_ptr.local_para_ptr);
                    hold_peer_buff(ilm_ptr.peer_buff_ptr);
                }
            }
 而在MMI_task()中变量Message的类型是MYQUEUE,而MYQUEUE就是一个宏,定义如下:

                   #define MYQUEUE         ilm_struct

由此可以看出,MMI_task()中处理的消息,就是由函数mmi_frm_fetch_msg_from_extQ_to_circularQ()从外部队列出去并封装成MMI循环队列的消息放入循环队列,并由MMI_task()来处理。

 

[总结]

         app 通过StartTimer启动一个定时器;定时器到期时会发一个消息给MMI_task(),MMI_task()调用EvshedMMITimerHandler()通过该函数会去调用定时器到期时L4层的回调函数L4CallBackTimer();L4CallBackTimer()去回调由app定制的定时器到期回调函数;同时L4CallBackTimer()会将外部消息队列中的下一个消息取出并封装成MMI循环队列中的消息结构传入MMI循环队列,等候MMI_task()处理。

联发科MT6225 USB驱动程序安装与使用指南 MT6225或许早已退出消费市场,但它所承载的技术理念——高度集成、低成本、易部署——仍在IoT、嵌入式等领域延续生命力。🌟而围绕它的USB驱动生态,既是早期开放精神的缩影,也映射出安全与便利之间的永恒博弈。当我们抱怨“为什么老设备越来越难修”的时候,不妨换个角度思考:也许推动我们升级系统的,不只是性能,更是对秩序与信任的追求。🔐而对于那些仍在坚守的老设备、老平台,我们能做的不仅是怀旧,更是用新的技术手段赋予它们第二次生命。🌱毕竟,每一行古老的代码背后,都曾有人为之倾注心血。 阅读详情

相关推荐

【AI方案集】个人记忆库型AI智能体终身伴侣方案.docx

这套AI技术方案不走“先堆概念再硬套场景”的老路,而是以业务痛点为锚点,把机器视觉识别、预测性分析、大模型知识赋能等能力拆解成轻量化可落地的功能模块,直接嵌入生产运营的关键环节,既能快速落地见效,又能通过持续的数据迭代逐步放大价值,帮企业在不盲目新增硬件投入的前提下,稳步完成智能化升级,实实在在把AI变成能降本、提效、控风险的生产工具。

MTK timer

MTK timer有很多种,从最低层的KAL(kernel adpat layer)到MMI,都有timer的身影。 第一种timer即KAL timer,KAL timer是非常底层的timer,它的实现是直接封装MTK的RTOS(nuleus)的timer,实现方式是由HISR,从而这种timer具有很高的优先级,也就是说,当这个timer超时时,就会触发一个HISR(高级中断 High L

折翼飞翔 2327

【能源系统优化】基于MATLAB的光储充一体化多目标调度:光伏自用率与充电成本权衡及储能联合调控 MATLAB 光储充一体化运行优化|光伏自用率与充电成本权衡

内容概要:本文围绕MATLAB实现的光储充一体化系统运行优化展开,旨在通过建立统一的能量调度模型,量化光伏自用率与充电成本之间的权衡关系,提升设备利用效率与运行安全性,并形成可复现的工程分析能力。项目采用多目标混合整数线性规划方法,综合考虑分时电价、储能损耗、光伏消纳与车辆充电需求,在满足功率平衡、储能状态递推、充放电互斥等约束条件下,实现经济性与环保性的协同优化。通过归一化加权目标函数,支持灵活调整运营策略偏好,并利用MATLAB R2025b完成从数据生成、建模求解到结果可视化的完整流程。配套GUI界面支持参数配置、模型训练、结果预测与运行监控,增强了系统的实用性与交互性。 适合人群:具备一定MATLAB编程基础,从事新能源系统规划、电动汽车充电站运营、微电网控制或综合能源管理的技术人员与研究人员,尤其适合工作年限1-3年、希望深入掌握能源系统优化建模与工程实现的研发人员。 使用场景及目标:①优化城市公共充电站、工业园区、高速服务区等场景的光储充协同运行,降低运营成本并提高光伏利用率;②支持日前调度与滚动优化,实现从静态分析到动态调控的升级;③为储能配置、容量规划、需求响应申报及投资回报评估提供量化决策工具;④通过GUI界面实现数据驱动的模型训练与预测,辅助制定最优充放电策略。 阅读建议:此资源以MATLAB为开发平台,强调从理论建模到工程落地的全过程实践。建议读者结合代码示例与GUI操作,理解数据预处理、多目标优化、混合整数求解与结果评价的关键步骤,并通过修改权重参数、运行场景与设备配置进行灵敏度分析,从而全面掌握光储充系统优化的核心逻辑与应用潜力。

MTK timer 小结 2

在 MTK timer 小结 1 提到了两种timer,KAL timer 和 stack timer, 这两种timer 在平时用的比较少,在驱动开发,或者时间要求特别精确的情况下,使用 KAL timer, 一般在task要管理一组timer,用 stack timer 加上 event scheduler,后者就是今天要介绍的第三种timer。 event scheduler 处理的timer 时间精确性上来说,相对不是那么精确,对于上层app应用来说,是必不可少的。MMI 层的tim

懒人 5858

农业AI避坑指南:用YOLO11做叶片病害检测时遇到的5个典型问题

本文分享了使用YOLO11模型进行农业叶片病害检测时常见的五个典型问题及解决方案。针对田间多变光照、病害样本不均衡、标注歧义、背景干扰和边缘部署等挑战,提供了包括场景自适应数据增强、解耦训练、软标签与鲁棒损失函数、困难负样本构建以及模型轻量化部署在内的实战经验,旨在帮助开发者提升农业AI项目的落地效果。

ujm56789012的博客 206

从药企研发视角:如何用GNN提升分子水溶性预测准确率?PyTorch+ESOL全案例

本文从药企研发的实际需求出发,详细介绍了如何利用图神经网络(GNN)技术,结合PyTorch框架和ESOL数据集,构建并优化分子水溶性预测模型。通过完整的代码案例,深入探讨了分子图数据处理、GNN架构设计、超参数调优以及模型评估与解释等关键环节,旨在帮助研发团队提升预测准确率,从而更高效地筛选和优化候选药物分子。

weixin_29054399的博客 292

MTK定时器消息机制分析

<br />MTK中有两种timer,KAL timer 和 stack timer. 一般在task要管理一组timer,用 stack timer 加上 event scheduler.现在主要介绍这种<br />KAL timer 是非常底层的timer,它的实现是直接封装MTK的RTOS(nuleus)的timer,实现方式是由HISR,从而这种timer具有很高的优先级,当这个timer 超时时,就会触发一个HISR(高级中断 High Level ISR (Interrupt Service R

攻城狮 1939

Win11笔记本BIOS设置避坑大全:Secure Boot、RST、UEFI引导,一次讲清

本文详细解析了Win11笔记本BIOS设置中的关键问题,包括Secure Boot、Intel RST和UEFI引导的配置方法,帮助用户避开双系统安装中的常见陷阱。特别针对不同品牌笔记本的BIOS界面差异,提供了实用的操作指南和优化建议,确保系统兼容性和启动效率。

weixin_29251131的博客 689

MTK timer 小结 4

昨天说到回调函数 L4CallBackTimer。 static void L4CallBackTimer(void *p) { // 在evshed_set_event 第三个参数中传得 timer noder // 这里转换这个指针 mmi_frm_timer_type *pTimer = (mmi_frm_timer_type *)p; // 得到timer id U32 nTimerId = pTimer->timer_info & (~N

懒人 3636

【STM32】STM32 CANFD外设的几种消息接收过滤模式

在控制器区域网络(CAN)系统中,正确配置消息过滤器对于有效管理网络通信至关重要。特别是在使用Flexible Data-rate Controller Area Network(FDCAN)时,选择合适的过滤器类型可以大大提高网络效率和消息处理速度。

林愿留的博客 6230

Innovus实战:5分钟搞定postRoute阶段冗余hold buffer的自动清理(附PHC识别技巧)

本文分享了在数字IC后端设计中使用Innovus工具,于postRoute阶段自动清理冗余hold buffer的实战技巧。通过配置时序感知的面积回收模式,可在5分钟内安全移除非关键路径上的PHC缓冲器,有效优化芯片面积与功耗,并附有PHC识别与验证方法。

moon9的博客 400

MTK定时器使用

<br />  本帖来自一篇博客,部分内容被修改!<br />   定时器事件是在指定的时间或时间间隔内反复触发指定的事件,这个指定的事件是通过一个注册的功能函数来实现的。在MTK平台中,操作定时器的具体流程如下:<br />   ① 在定义定时器ID的头文件TimerEvents.h中的MMI_TIMER_IDS枚举类型中定义一个自己的TimerID,实验中定义的ID为MY_TIMER_ID。当然,要在MAX_TIMERS之前定义。<br />② 使用函数StartTimer(U16 TimerID,U1

liuqg的专栏 4082

Ollama教程——模型:如何将模型高效导入到ollama框架

本教程详细介绍了如何将GGUF、PyTorch和Safetensors格式的模型导入到ollama框架中。通过一系列步骤,从环境准备、模型转换和量化,到最终的模型创建和运行,我们为开发者提供了一个清晰的指南。此外,我们还探讨了如何发布模型到ollama平台,使得模型可以被更广泛地分享和应用。ollama框架提供了一个灵活、高效的解决方案,帮助开发者在各种环境中部署和运行机器学习模型。无论您是想将现有模型快速部署到生产环境,还是希望探索新的模型架构,ollama都能为您提供所需的工具和资源。

walkskyer的博客 1万+

在MTK平台上部署CDMA

<br />在MTK平台上部署CDMA<br /><br />[注] 我们用的MTK版本是6225 ,CDMA 模组是威盛via的。此项目没有量产,代码放在那也是加密冷藏没有价值,写思路出来与大家讨论关于程序设计。本人不是MTK专家,有分析不对之处,请指出,谢谢。<br /><br />[硬件篇]<br />加一个cdma模组,具体操作本人不知道,就不讲述了。<br /><br />[软件篇]<br />让我们来分析一下。既然在MTK平台,上层应用最好不要改动,就只能在底层修改。在L4层我们发现,MTK提供

bruce0532的专栏 1396

信号处理仿真:自适应信号处理_(8).自适应信道均衡

在无线通信系统中,信道的多径效应和时变特性会导致信号的失真,从而影响通信质量。自适应信道均衡技术通过实时调整均衡器的参数,以补偿信道失真,提高信号的质量和可靠性。本节将详细介绍自适应信道均衡的原理、算法和实现方法,并通过具体的仿真例子来说明其应用。

2401_87715305的博客 1040

NR PUCCH(二)PUCCH format 2/3/4

继续看PUCCH2/3/4:PUCCH format 0和1所携带的信息bits少,UCI bits2bits,信息bit需要经过编码等过程下面分别来看。

ModemProtocol的博客 539

MTK6225 Idle Screen Digit Handler

EntryIdleScreen()        g_idle_context.IsOnIdleScreen = 1;      g_idle_context.IsOnDialerScreen = 0;        g_pwr_context.PowerOnMMIStatus = MMI_POWER_ON_IDLE        自动键盘锁定时器:IDLE_APP_AUTO_LOCK_TIMER

IOT物联网小镇 1361

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MTK6225电话管理1

1.在IDLE界面输入电话号码 IdleApp.c        在函数mmi_idle_entry_idle_screen()中,设置了用户按下按键时的处理函数: SetGroupKeyHandler(    HandleIdleScreenDigitEntry,                                    IdleScreenDigits,            

IOT物联网小镇 1390

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

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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

MTK6225-IDLE SCREEN键盘锁与解锁

开机函数执行过程(倒过来看): EntryIdleScreen() line 3082 BeforeEntryIdleScr() line 5254 mmi_bootup_entry_network_searching() line 1464 mmi_bootup_exit_welcome_screen() line 1390 ShowWelcomeScr() line 5076 exit_cus

IOT物联网小镇 1425

IDEA的使用指南

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

MTK6225--fixed list快捷输入

一、快捷方式:接收数字        在show一个fixed list的时候,例如:ShowCategory53Screen(),其调用顺序是: ShowCategory53Screen()   ShowCategory353Screen()   ShowListCategoryScreen()在这个函数中,会执行:register_fixed_list_shortcut_handler()即是

IOT物联网小镇 1293

MTK6225开机过程-系统启动2(hardware)

以下是在手机上抓LOG得出的结果 在MMI_Task()中,进入: switch (p->poweron_mode)        case POWER_ON_KEYPAD:               mmi_bootup_entry_disk_check();                      这个函数中,进入:                      if (result == F

IOT物联网小镇 1489

XY_GPS_TERM V1.0 移植文档

XY_GPS_TERM V1.0 移植文档 一.项目编译选项及目录添加 1. NEOTEL52_6432_10A_GPRS.mak 文件中加入 MACHINE_MODEL = 项目名 #以区分不同项目 ...

weixin_30955341的博客 137

MTK timer 小结 3

在 MTK timer 小结 2 说道最常用的MMI timer 实现机制的初始化过程。今天继续忘下说,下面要说的是创建一个timer。MMI 层,启动一个timer,最终都会调用到 L4StartTimer 这个函数。具体来分析一下这个函数 // 参数 nTimerId 是要自己定义一个timer id,在 timerEvents.h 里的 MMI_TIMER_IDS 定义,用来区分timer // TimerExpiry 超时的回调函数 // funcArg 回调函数回传的参数 // nTim

懒人 5269

MTK Timer

1. GPTI_StartItem 要精准很多,但是只能提供总数不超过32个GPTI,所以使用时需要注意成对申请和释放GPTI,否则可能会出现ASSERT.GPTI用的是GPT timer。这个是用HISR的方式去响应. 2. StartTime S

Sheldon4090's Blog 779
上一篇: MTK定时器使用
下一篇: Linux wait 用法
刘启刚
博客等级 码龄18年 11粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值