首页 / 专利库 / 人工智能 / 嵌入式计算 / 一种嵌入式系统定时器的管理方法

一种嵌入式系统定时器的管理方法

阅读:580发布:2024-02-28

专利汇可以提供一种嵌入式系统定时器的管理方法专利检索,专利查询,专利分析的服务。并且本 发明 公开了 嵌入式系统 定时器 管理技术领域中的一种嵌入式系统定时器的管理方法。其技术方案是,创建一个管理定时器的双向链表;定时器的最小粒度为1个TICK;在链表中注册定时器;在每一个TICK到时的时候,从链表的头部开始检查定时器的超时情况,直到第一个未超时的定时器;将所有超时的定时器从双向链表中注销;对于注销的定时器,根据其注册状态,分别向注册模 块 发送消息或进行函数回调;对于周期性定时器,超时后自动再注册到链表中,否则释放定时器。由于采用双向链表进行管理,定时器在注册时 申请 内存,注销时释放内存,内存开销由当前的定时器数目来决定,有效节约了系统内存。,下面是一种嵌入式系统定时器的管理方法专利的具体信息内容。

1、一种嵌入式系统定时器的管理方法,其特征是所述方法包括下列步骤:
步骤1:创建一个管理定时器的双向链表;在双向链表中,定时器的管理方 式包括在链表中注册定时器、在链表中注销定时器和在链表中修改定时器;定时 器的最小粒度为1个TICK;
步骤2:当使用模需要定时器时,在链表中注册一个定时器;
步骤3:在一个TICK到时的时候,从链表的头部开始检查定时器的超时情况, 直到第一个未超时的定时器;
步骤4:将所有超时的定时器从双向链表中注销,加入到超时队列中;
步骤5:对超时队列中的定时器进行处理,根据定时器的注册状态,分别向 注册模块发送消息或进行函数回调;
步骤6:对于周期性定时器,超时后自动再注册到链表中,否则释放定时器; 然后回到步骤3,在下一个Tick重复步骤3至步骤6。
2、根据权利要求1所述的一种嵌入式系统定时器的管理方法,其特征是所 述在链表中注册定时器的方法,是按照定时器超时的先后顺序,向链表中插入定 时器;其具体步骤包括:
步骤11:调用注册定时器模块;
步骤12:申请一个新的定时器结构节点空间;
步骤13:查看定时器链表;
步骤14:判断链表是否为空,如果为空,则执行步骤15;否则,执行步骤 16;
步骤15:把当前定时器插入链表,并修改相应的前后向指针、定时器个数和 定时器间隔值,然后返回调用模块;
步骤16:从定时器链表中查找第一个比要注册的定时器更晚超时的定时器;
步骤17:如果查到,则执行步骤18;否则,执行步骤19;
步骤18:把要注册的定时器插入到查到的定时器前面,并修改相应的前后向 指针、定时器个数和定时器间隔值,然后返回调用模块;
步骤19:把要注册的定时器插入到链表尾部,并修改相应的前后向指针、定 时器个数和定时器间隔值,然后返回调用模块。
3、根据权利要求1所述的一种嵌入式系统定时器的管理方法,其特征是所 述在链表中注销定时器的方法,包括下列步骤:
步骤21:调用注销定时器模块;
步骤22:在链表中查找要注销的定时器;
步骤23:判断是否查到要注销的定时器,如果查到,则执行步骤24;否则, 返回调用模块;
步骤24:将要注销的定时器从链表中删除,并修改要注销的定时器的前向节 点的后向指针,以及后向节点的前向指针,重新计算后一个定时器的间隔值和定 时器的数目;而后返回调用模块。
4、根据权利要求1所述的一种嵌入式系统定时器的管理方法,其特征是所 述在链表中修改定时器的方法,包括下列步骤:
步骤31:调用修改定时器模块;
步骤32:在链表中查找要修改的定时器;
步骤33:判断是否查到要修改的定时器,如果查到,则执行步骤34;否则, 返回调用模块;
步骤34:先将查到的要修改的定时器注销;方法是将要修改的定时器从链表 中删除,并修改该定时器的前向节点的后向指针,以及后向节点的前向指针,重 新计算后一个定时器的间隔值和定时器的数目;
步骤35:再将查到的要修改的定时器注册到链表中,方法是在定时器链表中 查找第一个比要修改的定时器更晚超时的定时器;
步骤36:判断是否查到符合要求的定时器,如果查到,则执行步骤37;否 则执行步骤38;
步骤37:把要修改的定时器插入到查到的定时器前面,并修改相应的前后向 指针、定时器个数和定时器间隔值,然后返回调用模块;
步骤38:把要修改的定时器插入到链表尾部,并修改相应的前后向指针、定 时器个数和定时器间隔值,然后返回调用模块。
5、根据权利要求1所述的一种嵌入式系统定时器的管理方法,其特征是所 述从链表的头部开始检查定时器的超时情况,直到第一个未超时的定时器,其方 法是,将链表中的第一个定时器的时间差值减1,如果结果不等于0说明无超时 定时器;如果结果等于0,则继续查找下一个时间差值为0的定时器,直到最后 一个不为0的定时器。

说明书全文

技术领域

发明属于嵌入式系统定时器管理技术领域,尤其涉及一种嵌入式系统 定时器的管理方法。

背景技术

实时操作系统由于对时限的要求非常严格,而实时操作系统对时序的偏差 依赖性很强,因此作为实时嵌入式系统软件时间管理的核心模一定时器模块 的设计实现就显得非常重要。
目前,嵌入式系统软件的通用定时器的通常设计主要有以下几种:
(1)简单计时轮询法
当每个计时周期到达时,先将所有定时器的计时数减1,然后判断结果是 否为0,如果为0,则表示计时时间已到并进行到时处理,否则继续进行计时 操作,这种方法称为简单计时轮询法。
(2)多队列计时法
多队列计时法首先根据系统定时应用特点,将定时器划分成不同时长的队 列,目的在于减少每次参与计数的定时器个数(设定定时器时就将计时时长分 解为毫秒位、个位、十位、百位、千位等几个部分);再把定时器插入到最大 不为0的位所在的队列,计时就从该队列开始,完成后逐一计以下位,直至计 时到毫秒位队列;在该队列计时完成后定时器总计时完毕。由于各队列除头定 时器外计算的均是相对于上个定时器的时间相对值,计时的时候只需对队列头 部时间做减运算便可确定是否有定时器在本次计时到期。
(3)单循环队列定时器算法
单循环队列计时原理:假定所需的最大定时器数目为M个,则设置M个定 时器描述数组。再构造一个循环计时队列缓冲(长度为L),其元素指示定时器 链表队列头标识ID和尾ID,通过该ID与定时器缓冲中的相应元素构成虚拟双 向链表。每个时钟Tick(Tick的时长由BSP决定,BSP:Board Support Package, 它是板级支持包,介于主板硬件和操作系统之间的一层,主要目的是为了支持 操作系统,使之能够更好的运行于硬件主板)到来时,循环计时队列头向后走 一位,查找该位所指示的队列中是否存在时间已到定时器,如存在,则取出做 相应报时操作和定时器时长与L取余的余数位队列插入操作。对于超过L长度 的定时器,因已计算出定时器时长与L相除所得的倍数,每次循环计时队列头 经过时,该倍数值得减去1,直至倍数值被减为0,之后的检查就可报时并进 行插入操作。新定时器的插入位置等于当前循环计时队列头位置加新定时器时 长与循环队列长度相除的余数再与循环计时队列长度相除取余,并在循环队列 所在节点对定时器进行排序操作。
简单计时轮询法固然方法简单,实现容易,但当定时器数目很多(10000 个)时,每次计数需所有定时器做减法,每秒需做10万次减法(每个Tick为 10ms)。而嵌入式系统的CPU资源相当有限,定时器本身的任务不能占用太多 的资源,所以如果采用这种方法,就会占用较多的CPU资源。
多队列计时法相对简单,计时法更高效,在每次计时周期到来时,只需做 与队列次数相同的判断和减法以及可能的报时操作就能基本满足嵌入式系统 的定时需求。但该方法也存在很多冗余操作,如空负载时检查所有队列,满负 载时要对所有队列做2倍于空负载检查时的加减法操作,真正有效操作只占少 部分,而且在队列处理中存在耗费计算资源的排序操作。
单循环队列定时器算法相对前两种效率要高很多,但也存在自己的弱点, 循环队列由长度为L的数组和循环指针变量组成,循环队列的长度为L,如 果L太小容易造成倍数值的减操作过多,效率得不到提高;L太大则浪费存 储空间。

发明内容

本发明的目的在于,提供一种嵌入式系统定时器的管理方法,通过此方法, 可以解决目前使用的定时器管理方法中,占用系统资源过多的问题。
本发明的技术方案是:一种嵌入式系统定时器的管理方法,其特征是所述 方法包括下列步骤:
步骤1:创建一个管理定时器的双向链表;在双向链表中,定时器的管理 方式包括在链表中注册定时器、在链表中注销定时器和在链表中修改定时器; 定时器的最小粒度为1个TICK;
步骤2:当使用模块需要定时器时,在链表中注册一个定时器;
步骤3:在一个TICK到时的时候,从链表的头部开始检查定时器的超时情 况,直到第一个未超时的定时器;
步骤4:将所有超时的定时器从双向链表中注销,加入到超时队列中;
步骤5:对超时队列中的定时器进行处理,根据定时器的注册状态,分别 向注册模块发送消息或进行函数回调;
步骤6:对于周期性定时器,超时后自动再注册到链表中,否则释放定时 器;然后回到步骤3,在下一个Tick重复步骤3至步骤6。
所述在链表中注册定时器的方法,是按照定时器超时的先后顺序,向链表 中插入定时器;其具体步骤包括:
步骤11:调用注册定时器模块;
步骤12:申请一个新的定时器结构节点空间;
步骤13:查看定时器链表;
步骤14:判断链表是否为空,如果为空,则执行步骤15;否则,执行步 骤16;
步骤15:把当前定时器插入链表,并修改相应的前后向指针、定时器个数 和定时器间隔值,然后返回调用模块;
步骤16:从定时器链表中查找第一个比要注册的定时器更晚超时的定时 器;
步骤17:如果查到,则执行步骤18;否则,执行步骤19;
步骤18:把要注册的定时器插入到查到的定时器前面,并修改相应的前后 向指针、定时器个数和定时器间隔值,然后返回调用模块;
步骤19:把要注册的定时器插入到链表尾部,并修改相应的前后向指针、 定时器个数和定时器间隔值,然后返回调用模块。
所述在链表中注销定时器的方法,包括下列步骤:
步骤21:调用注销定时器模块;
步骤22:在链表中查找要注销的定时器;
步骤23:判断是否查到要注销的定时器,如果查到,则执行步骤24;否 则,返回调用模块;
步骤24:将要注销的定时器从链表中删除,并修改要注销的定时器的前向 节点的后向指针,以及后向节点的前向指针,重新计算后一个定时器的间隔值 和定时器的数目;而后返回调用模块。
所述在链表中修改定时器的方法,包括下列步骤:
步骤31:调用修改定时器模块;
步骤32:在链表中查找要修改的定时器;
步骤33:判断是否查到要修改的定时器,如果查到,则执行步骤34;否 则,返回调用模块;
步骤34:先将查到的要修改的定时器注销;方法是将要修改的定时器从链 表中删除,并修改该定时器的前向节点的后向指针,以及后向节点的前向指针, 重新计算后一个定时器的间隔值和定时器的数目;
步骤35:再将查到的要修改的定时器注册到链表中,方法是在定时器链表 中查找第一个比要修改的定时器更晚超时的定时器;
步骤36:判断是否查到符合要求的定时器,如果查到,则执行步骤37; 否则执行步骤38;
步骤37:把要修改的定时器插入到查到的定时器前面,并修改相应的前后 向指针、定时器个数和定时器间隔值,然后返回调用模块;
步骤38:把要修改的定时器插入到链表尾部,并修改相应的前后向指针、 定时器个数和定时器间隔值,然后返回调用模块。
所述从链表的头部开始检查定时器的超时情况,直到第一个未超时的定时 器,其方法是,将链表中的第一个定时器的时间差值减1,如果结果不等于0 说明无超时定时器;如果结果等于0,则继续查找下一个时间差值为0的定时 器,直到最后一个不为0的定时器。
本发明通过双向链表实现对定时器的管理,当定时器数目非常多的时候, 此种设计只需要进行少量的计算,就可以实现对所有定时器的控制。由于采用 双向链表进行管理,定时器在注册时申请内存,删除时释放内存,内存开销由 当前的定时器数目来决定,因此有效节约了系统资源。
附图说明
图1是本发明实现的定时器管理流程示意图。
图2是本发明实现的定时器注册流程示意图。
图3是本发明实现的定时器注销流程示意图。
图4是本发明实现的定时器修改流程示意图。

具体实施方式

下面是C语言实现的本发明的数据结构,主要包括:
1)管理定时器的双向链表结构:
typedef struct tagTimer
{
    struct tagTimer  *pstNext;         //后向指针
    struct tagTimer  *pstPrev;         //前向指针
    ULONG             msgQId;          //定时器消息队列ID
    VOID             (*pfFu nc)(VOID*);//超时回调函数
    VOID             *pAr g;           //回调函数的参数
    TIMER_TYPE_EN enType;             //定时器类型(一次性定时器或
                                         周期性定时器)
    LONG             lTick;            //定时器时间长度
    LONG             lTickGap;          //和前一个定时器的时间差
    ULONG            ulModuleId;       //注册定时器的模块号
}Timer_S;
2)链表头结构:
typedef struct
{
      Timer_S    *hea d;     //第一个定时器结构指针
      ULONG      ulCount;    //定时器结构数量
}TimerListHeader_S;
用C语言实现本发明的主要接口函数包括:
1)TimerModuleInit(),定时器模块初始化,创建定时器任务。
调用方式:LONG TimerModuleInit();
返回值:成功或失败。
2)TimerCreate(),创建定时器
LONG TimerCreate(ULONG ulModuleId,
                  ULONG msgQId,
                  LONG lMillSec,
                  VOID(*pfTimerFunc)(VOID*),
                  VOID  *pArg,
                  TIMER_TYPE_EN enType)
输入参数:
ULONG ulModuleId  //创建定时器的模块ID
ULONG msgQId      //发送定时器超时消息的队列ID
LONG lMil lSec    //时间值
VOID(*pfTimerFunc)(VOID*)//回调函数
VOID  *pArg              //回调函数参数
返回值:成功时,定时器的ID(控制块指针),否则返回失败
3)TimerChange(),改变定时器时间
LONG TimerChange(ULONG ulModuleId,
                 ULONG ulTimerId,
                 LONG lMillSec)
输入参数:
           ulModuleId  //模块Id,
           ulTimerId   //定时器Id
           lMillSec    //定时器的时间
返回值:成功或失败。
4)TimerDelete(),注销定时器
LONG TimerDelete(ULONG ulModuleId,
                  ULONG ulTimerId)
输入参数:
         ulTimerID  //定时器Id
返回值:成功或失败。
下面结合附图,对本发明的实施方式进行详细介绍。
图1是本发明实现的定时器管理流程示意图。图中,步骤101首先通过 TimerModuleInit()创建的定时器任务,创建一个管理定时器的双向链表,定时 器的最小粒度为1个TICK。
步骤102向链表中注册定时器。定时器分两种类型:一次性定时器和周期 性定时器。定时器使用模块调用TimerCreate()函数创建一个定时器,定时器注 册的原则是所有定时器按超时的先后顺序插入到链表中。图2是本发明实现的 定时器注册流程示意图。图2中,步骤201在注册定时器时,调用注册定时器模 块。步骤202,申请一个新的定时器结构节点空间。步骤203,查看定时器链表。 步骤204,判断链表是否为空?如果为空,则执行步骤205;如果不为空,则执 行步骤206。步骤205,把当前定时器插入链表,并修改相应的前后向指针、定 时器个数和定时器间隔值,然后返回调用模块。步骤206,从定时器链表中查 找第一个比要注册的定时器更晚超时的定时器。步骤207,判断是否查到符合 要求的定时器,如果查到,则执行步骤208;否则,执行步骤209。步骤208, 把要注册的定时器插入到查到的定时器前面,并修改相应的前后向指针、定时 器个数和定时器间隔值,然后返回调用模块。步骤209,把要注册的定时器插 入到链表尾部,并修改相应的前后向指针、定时器个数和定时器间隔值,然后 返回调用模块。
步骤103在每一个TICK到时的时候,从链表的头部开始检查定时器的到时 情况,直到第一个未到时的定时器。查找的方法是,将链表中的第一个定时器 的时间差值减1,如果结果不等于0说明无超时定时器;如果结果等于0,则继 续查找下一个时间差值为0的定时器,直到最后一个不为0的定时器。
步骤104将所有超时的定时器从双向链表中注销,加入到超时队列中。注 销定时器通过TimerDelete()函数实现。图3是本发明实现的定时器注销流程示 意图。图3中,步骤301首先调用注销定时器模块。步骤302在链表中查找要 注销的定时器。步骤303判断是否查到要注销的定时器,如果查到,则执行步 骤304;否则,返回调用函数。步骤304将要注销的定时器从链表中删除,并 修改要注销的定时器的前向节点的后向指针,以及后向节点的前向指针,重新 计算后一个定时器的间隔值和定时器的数目;而后返回调用模块。
步骤105对超时队列中的定时器进行处理,根据定时器的注册状态,分别 向注册模块发送消息或进行函数回调。
步骤106对于周期性定时器,超时后自动再注册到链表中,否则释放定时 器;然后回到步骤103,在下一个Tick重复步骤103至步骤106。
在定时器管理过程中,还会涉及定时器的修改操作。图4是本发明实现的 定时器修改流程示意图。图4中,步骤401首先调用修改定时器模块。步骤402 在链表中查找要修改的定时器。步骤403判断是否查到要修改的定时器,如果 查到,则执行步骤404;否则,返回调用模块。步骤404先将查到的要修改的 定时器注销;注销的方法如图3所示的定时器注销流程,即将要修改的定时器 从链表中删除,并修改该定时器的前向节点的后向指针,以及后向节点的前向 指针,重新计算后一个定时器的间隔值和定时器的数目。步骤405再将查到的 要修改的定时器注册到链表中,注册的方法如图2所示的定时器注册流程,即 在定时器链表中查找第一个比要修改的定时器更晚超时的定时器。然后执行步 骤406判断是否查到符合要求的定时器,如果查到,则执行步骤407;否则执 行步骤408。步骤407把要修改的定时器插入到查到的定时器前面,并修改相 应的前后向指针、定时器个数和定时器间隔值,然后返回调用模块。步骤408 在没查到符合要求的定时器时,把要修改的定时器插入到链表尾部,并修改相 应的前后向指针、定时器个数和定时器间隔值,然后返回调用模块。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不 局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可 轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明 的保护范围应该以权利要求的保护范围为准。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈