CN1936765A - 一种定时器链表的调度方法 - Google Patents
一种定时器链表的调度方法 Download PDFInfo
- Publication number
- CN1936765A CN1936765A CN 200510100188 CN200510100188A CN1936765A CN 1936765 A CN1936765 A CN 1936765A CN 200510100188 CN200510100188 CN 200510100188 CN 200510100188 A CN200510100188 A CN 200510100188A CN 1936765 A CN1936765 A CN 1936765A
- Authority
- CN
- China
- Prior art keywords
- timer
- node
- chain meter
- time difference
- current
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 36
- 238000012217 deletion Methods 0.000 claims description 9
- 230000037430 deletion Effects 0.000 claims description 9
- 230000008859 change Effects 0.000 claims description 6
- 230000002457 bidirectional effect Effects 0.000 abstract 1
- 239000007943 implant Substances 0.000 abstract 1
- 230000008569 process Effects 0.000 description 10
- 238000010586 diagram Methods 0.000 description 8
- 230000015572 biosynthetic process Effects 0.000 description 5
- 230000004913 activation Effects 0.000 description 3
- 230000009471 action Effects 0.000 description 2
- 239000011800 void material Substances 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000001684 chronic effect Effects 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
Images
Landscapes
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明涉及一种定时器链表的调度方法,包括:(a)建立一个双向定时器链表,该定时器链表包括一个以上的定时器节点,所述定时器节点存储有预设定的时间间隔,及表示该定时器节点的时间间隔与上一个定时器节点时间间隔的差值的时间差值;(b)设置定时器的步骤,向定时器链表中插入一个待插入定时器节点;(c)中止定时器的步骤,从定时器链表中删除一个待删除定时器节点。本发明操作简单,仅仅通过插入和删除链表节点就可以实现对定时器的管理和调度,而无需长时间的扫描链表,可节省CPU的开销,提高工作效率,对嵌入式系统性能有较大的提高。
Description
技术领域
本发明涉及嵌入式操作系统定时器领域,具体来说,涉及一种定时器链表的调度方法。
背景技术
嵌入式操作系统早已经融入我们的生活,除了日常生活中可以看到的家电产品、工业于军事应用的独立产品之外,许多大电脑系统,事实上也是有许许多多小的嵌入式系统组成。
嵌入式操作系统利用定时器处理多种事务,例如进程的调度、网络协议的超时和系统统计数据的定时器更新等。因为操作系统对在处理多种事务时对计时偏差的依赖性很强,因此定时器作为操作系统时间管理的核心就显得很重要。
定时器又称为计时器,计时器记录了时间经过的轨迹,最简单的定时器度量经过的时间且在需要时给出经过时间的信息,也叫间隔计时器,它将在一个特定的时间间隔之后产生中断。
目前嵌入式操作系统应用非常广泛,定时器的数量需求越来越多,多定时器的计时方法有:使用数组和队列的方法,根据定时器的数目建立数组和队列,把定时器分成激活和挂起状态,当定时器激活时,把定时器放入到队列中,当超时或者中止该定时器时可以通过删除动作进入挂起状态,挂起状态的定时器是不会超时的,当启动时可以通过插入动作使其进入激活状态。每个计时周期到时,对进入激活状态的定时器队列不断扫描,每次扫描都对队列中的所有定时器的计时数减1,然后判断结果是否为0,如果为0,则表示计时时间已到并进行到时处理,否则继续进行计时操作。
按照以上的方法,当定时器的数量到达一定的数量级别时,显然存在明显的缺点,扫描队列的时间很长,占用系统资源较多,而嵌入式系统的CPU资源相当有限,定时器本身的任务不能占太多的资源,所以如果采用这种方法,就会占用较多的CPU资源。
发明内容
本发明所要解决的技术问题在于,克服现有技术中需对数组和队列不断扫描和排序操作而引起系统开销大的不足,而提供一种定时器链表调度方法,可提高定时器的效率,减少系统的开销。
本发明所采用的技术方案在于:提供一种定时器链表的调度方法,其包括:(a)建立一个双向定时器链表,该定时器链表包括一个以上的定时器节点,所述定时器节点存储有预设定的时间间隔,及表示该定时器节点的时间间隔与上一个定时器节点时间间隔的差值的时间差值;(b)设置定时器的步骤,向定时器链表中插入一个待插入定时器节点;(c)中止定时器的步骤,从定时器链表中删除一个待删除定时器节点。
其中,步骤(b)进一步包括:(b1)停止当前定时器节点;(b2)将待插入定时器节点插入到定时器链表中;(b3)启动定时器链表头节点为当前定时器。
其中,步骤(b2)进一步包括:(b20)取出待插入定时器节点的时间间隔T;(b21)判断定时器链表的头节点是否为空节点,如果头节点不为空节点,则取出当前节点的时间差值Nt;(b22)比较所述待插入定时器节点的时间间隔T是否大于或等于当前节点的时间差值Nt;(b23)如果步骤(b22)中所述待插入定时器节点的时间间隔T大于或等于当前节点的时间差值Nt,则T减去Nt然后赋值给T,转入步骤(b25);(b24)如果步骤(b22)中所述待插入定时器节点的时间间隔T小于当前节点的时间差值Nt,则将Nt减去T然后赋值给Nt,并把该待插入定时器节点加入到当前定时器节点之前,并将其时间间隔设为T,然后转至步骤(b3);(b25)判断当前定时器节点的下一个定时器节点是否为空节点,如果该下一个定时器节点不为空节点,则将该下一定时器节点的时间差值赋值给当前节点的时间差值Nt,并转至步骤(b22)。
其中,当步骤(b11)中定时器链表的头节点为空节点,或者步骤(b15)中当前定时器节点的下一个定时器节点为空节点时,进行下述步骤:(b16)将待插入定时器节点添加到该定时器链表尾部,并转入步骤(b3)。
其中,步骤(c)进一步包括:(c1)停止当前定时器节点;(c2)从定时器链表中删除该待删除定时器节点;(c3)启动定时器链表头节点为当前定时器。
其中,步骤(c2)进一步包括:(c20)计算当前定时器的剩余时间,其可通过下述公式计算得出:Ns=当前时间-runTime和Nh=Nh-Ns,其中:Ns为当前定时器剩余的时间值;Runtime为记录当前定时器设置时的时间值;Nh为头节点的时间差值;(c21)取出待删除定时器节点的时间差值Nf;(c22)将待删除定时器节点的下一节点的时间差值赋值给Nn,并删除该待删除定时器节点;(c23)判断待删除定时器节点的时间差值Nf是否等于零,如果该Nf等于零,则转至步骤(c34),否则,将该Nn加上该Nf并将结果赋值Nn;(c24)将当前时间值赋值给runtime,并转至步骤(c3)。
实施本发明所提供的定时器链表的调度方法具有如下有益效果:其操作简单,仅仅只是通过插入和删除链表节点就可以实现对定时器的管理和调度,而无需长时间的扫描链表,大大节省了CPU的开销,提高了效率,对嵌入式系统性能有较大的提高。
附图说明
下面将结合附图及实施例对本发明作进一步说明,附图中:
图1是本发明一种定时器链表的调度方法中定时器链表的示意图;
图2是本发明一种定时器链表的调度方法中定时器节点的示意图;
图3是本发明一种定时器链表的调度方法中设置定时器的流程图;
图4图3中将定时器节点插入定时器链表的流程图;
图5是本发明一种定时器链表的调度方法中中止定时器的流程图;
图6是图5中从定时器链表删除定时器节点的流程图。
具体实施方式
请参见图1,示出了本发明一种定时器链表的调度方法中的定时器链表的示意图。本发明是采用一种双向链表的形式对定时器进行管理,其包括有至少一个节点,在图1中示出了头节点、节点1、节点2、节点3及尾节点,本发明不限于此。其中,每个节点可以包含有一个定时器的信息,相当于一个定时器,可称为定时器节点。其中虚线部分表示对该定时器链表进行的操作,如将链表头节点设置为当前定时器、插入一个定时器节点、删除一个定时器节点等。
请参见图2,示出了本发明一种定时器链表的调度方法中定时器节点的示意图;在该图2中,仅画出三个定时器节点的结构及连接关系。其中节点的设置可参见下面的程序段:
typedef struct tagTIMER_NODE
{
API_TIMER_DATA timerData; 定时器的私有数据
DWORD eventNum; 定时器到时发生次数;
DWORD activeInterval; 定时器时间差值
struct tagTIMER_NODE*pPrev; 指向上一节点
struct tagTIMER_NODE*pNext; 指向下一节点
}TIMER_NODE;
而其中定时器的私有数据(timerData)结构如下所设置:
typedef struct tagAPI_TIMER_DATA
{
void*hWnd; /*设置定时器窗口的句柄*/
DWORD nIDEvent; /*定时器ID号*/
DWORD uElapse; /*定时器的时间间隔*/
void(*lpTimerFunc)(); /*定时器到达时需要处理的事务*/
DWORD nThreadID; /*线程ID号*/
}API_TIMER_DATA;
从上面可以看出,每个定时器节点中均包括有timerData、eventNum、activeInterval、pPrev及pNex。其中timerData记录有定时器的私有数据;eventNum记录有定时器到时发生次数;activeInterval记录有定时器时间差值;pPrev记录有指向上一节点的指针;pNex记录有下一节点的指针。而在私有数据中又设有定时器的时间间隔、定时器窗口的句柄、定时器ID、定时器到时需要处理的事务和线程ID号等。
其中,每个定时器节点中保存的时间间隔是指用户为定时器实际设置的时间值;而时间差值为当前节点与上一个节点的时间间隔之间的差值;举例来说:用户设置了时间间隔为30毫秒的定时器节点1和时间间隔为50毫秒的定时器节点2;假设节点1之前没有其他节点。则节点1和节点2的时间间隔分别为30毫秒和50毫秒;节点1和节点2的时间差值分别为30毫秒(30-0)和20毫秒(50-30)。本发明主要是通过定时器中的时间差值对定时器节点进行管理的。定时器的响应是依据定时器时间差值来设置的,那么当一个定时器到时只需要移动定时器在链表中的位置,设置定时器只要插入节点即可,删除定时器只要删除节点即可。
本发明对定时器链表进行调度的方法中至少包括有设置定时器的步骤和中止定时器步骤。下面结合图3到图4进行具体说明。
一并参照图3与图4,本发明中,设置定时器的流程包括:停止当前定时器(步骤31);把定时器插入定时器链表中(步骤32),把链表头节点设置为当前触发的定时器(步骤33)。其中步骤32的具体流程为:取出待插入定时器节点的时间间隔T(步骤40);然后判断定时器链表的头节点是否为空节点(步骤41)?如果步骤41中定时器链表的头节点为空节点,则流程转至步骤48,将待插入定时器节点添加到定时器链表尾部;否则,取出当前节点的时间差值Nt(步骤42);比较T是否大于或等于Nt(步骤43);如果步骤43中T大于或等于Nt,则T减去Nt然后赋值给T(步骤45),流程进入步骤46;如果步骤43中T小于Nt,则将Nt减去T然后赋值给Nt,并把该待插入定时器节点加入到当前定时器节点之前,并将其时间间隔设为T,然后转入步骤33;在步骤46中,需判断当前节点的下一个节点是否为空节点;如果在步骤46中的判断结果为下一节点不是空节点,则在步骤47中,将下一节点的时间差值Nt->next赋值给当前节点的Nt,并转至步骤43;如果在步骤46中的判断结果为下一节点是空节点,则在步骤48中,将待插入定时器节点添加到该定时器链表的尾部。当将该待插入定时器节点添加到该定时器链表中(在链表尾部或当前定时器节点之前)之后,接下来在步骤33,启动定时器链表的头节点为当前定时器。
其中,上述所提到的T为待插入定时器节点时间间隔;Nt为定时器链表当前节点的时间差值;Nt->next为定时器链表当前节点的下一个节点的时间差值。
一并参照图5与图6,本发明中,中止定时器的流程包括:停止当前定时器(步骤51);从定时器链表中删除某定时器节点(下面将该将被删除的定时器节点称为待删除定时器节点)(步骤52);把定时器链表的头节点设置为当前触发的定时器(步骤53)。其中步骤52的具体流程为:计算当前定时器的剩余时间,将当前时间减去runTime并将结果赋值给Ns,将Nh减去该Ns并赋值给Nh,即执行公式Ns=当前时间-runTime和Nh=Nh-(当前时间-runTime)(步骤60);从定时器链表中找到对应的待删除定时器节点并取出其时间差值Nf(步骤61);将待删除定时器节点的下一节点的时间差值赋值给Nn,并删除该待删除定时器节点(步骤62);并判断该时间差值Nf是否等于零(步骤63);如果在步骤63中,该Nf等于零,则转至步骤65,将当前时间值赋值给runtime;如果在步骤63中,该Nf不等于零,则在步骤64中,将Nn加上Nf再将结果赋值给Nn;并转步骤65,当前时间值赋值给runtime;当上述步骤完成后,则流程转至步骤53,把定时器链表的头节点设置为当前触发的定时器并启动。
其中,上述所提到的Ns为当前定时器剩余的时间值;Runtime为记录当前定时器设置时的时间值;Nf为待删除定时器节点的时间差值;Nh为头节点的时间差值;Nn为待删除定时器节点的下一定时器节点的时间差值。
由于双向链表结构具有比较优良的特性,这种数据结构在每次插入和删除节点操作时能迅速地进行调整,保证操作之后数据仍然保持完整的有序链表,而每个节点的保存时间值是相对前面节点的时间差值。
由以上方法可以看出,本发明操作简单,没有由于长时间的扫描链表所产生的开销,仅仅只是通过插入和删除链表节点就可以实现对定时器的管理和调度,大大节省了CPU的开销,提高效率,对嵌入式系统性能有较大的提高。
Claims (6)
1、一种定时器链表的调度方法,其特征在于,包括:
(a)建立一个双向定时器链表,该定时器链表包括一个以上的定时器节点,所述定时器节点存储有预设定的时间间隔,及表示该定时器节点的时间间隔与上一个定时器节点时间间隔的差值的时间差值;
(b)设置定时器的步骤,向定时器链表中插入一个待插入定时器节点;
(c)中止定时器的步骤,从定时器链表中删除一个待删除定时器节点。
2、根据权利要求1所述的定时器链表的调度方法,其特征在于,步骤(b)进一步包括:
(b1)停止当前定时器节点;
(b2)将待插入定时器节点插入到定时器链表中;
(b3)启动定时器链表头节点为当前定时器。
3、根据权利要求2所述的定时器链表的调度方法,其特征在于,步骤(b2)进一步包括:
((b20)取出待插入定时器节点的时间间隔T;
(b21)判断定时器链表的头节点是否为空节点,如果头节点不为空节点,则取出当前节点的时间差值Nt;
(b22)比较所述待插入定时器节点的时间间隔T是否大于或等于当前节点的时间差值Nt;
(b23)如果步骤(b22)中所述待插入定时器节点的时间间隔T大于或等于当前节点的时间差值Nt,则T减去Nt然后赋值给T,转入步骤(b25);
(b24)如果步骤(b22)中所述待插入定时器节点的时间间隔T小于当前节点的时间差值Nt,则将Nt减去T然后赋值给Nt,并把该待插入定时器节点插入到当前定时器节点之前,并将其时间间隔设为T,然后转至步骤(b3);
(b25)判断当前定时器节点的下一个定时器节点是否为空节点,如果该下一个定时器节点不为空节点,则将该下一定时器节点的时间差值赋值给当前节点的时间差值Nt,并转至步骤(b22)。
4、根据权利要求3所述的定时器链表的调度方法,其特征在于,当步骤(b11)中定时器链表的头节点为空节点,或者步骤(b15)中当前定时器节点的下一个定时器节点为空节点时,进行下述步骤:
(b16)将待插入定时器节点添加到该定时器链表尾部,并转入步骤(b3)。
5、根据权利要求1至4任一项所述的定时器链表的调度方法,其特征在于,步骤(c)进一步包括:
(c1)停止当前定时器节点;
(c2)从定时器链表中删除该待删除定时器节点;
(c3)启动定时器链表头节点为当前定时器。
6、根据权利要求5所述的定时器链表的调度方法,其特征在于,步骤(c2)进一步包括:
(c20)计算当前定时器的剩余时间,其可通过下述公式计算得出:Ns=当前时间-runTime和Nh=Nh-Ns,其中:Ns为当前定时器剩余的时间值;Runtime为记录当前定时器设置时的时间值;Nh为头节点的时间差值;
(c21)取出待删除定时器节点的时间差值Nf;
(c22)将待删除定时器节点的下一节点的时间差值赋值给Nn,并删除该待删除定时器节点;
(c23)判断待删除定时器节点的时间差值Nf是否等于零,如果该Nf等于零,则转至步骤(c34),否则,将该Nn加上该Nf并将结果赋值Nn;
(c24)将当前时间值赋值给runtime,并转至步骤(c3)。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200510100188 CN1936765A (zh) | 2005-09-30 | 2005-09-30 | 一种定时器链表的调度方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200510100188 CN1936765A (zh) | 2005-09-30 | 2005-09-30 | 一种定时器链表的调度方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1936765A true CN1936765A (zh) | 2007-03-28 |
Family
ID=37954309
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200510100188 Pending CN1936765A (zh) | 2005-09-30 | 2005-09-30 | 一种定时器链表的调度方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1936765A (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2008148271A1 (fr) * | 2007-06-06 | 2008-12-11 | Zte Corporation | Procédé d'insertion d'événement |
CN101859260A (zh) * | 2010-05-14 | 2010-10-13 | 中国科学院计算技术研究所 | 用于操作系统中的定时器管理装置和管理方法 |
CN102354257A (zh) * | 2011-07-13 | 2012-02-15 | 南京中兴软创科技股份有限公司 | 一种通讯平台的精确时钟管理方法 |
CN103034493A (zh) * | 2012-12-10 | 2013-04-10 | 上海斐讯数据通信技术有限公司 | 一种定时器节点的管理方法和系统 |
CN103901941A (zh) * | 2012-12-28 | 2014-07-02 | 北京大唐高鸿软件技术有限公司 | 利用内存开销提高计时器执行效率的方法 |
CN106528286A (zh) * | 2016-11-22 | 2017-03-22 | 北京智芯微电子科技有限公司 | 一种实现定时器的方法和装置 |
CN106597049A (zh) * | 2016-12-15 | 2017-04-26 | 电子科技大学 | 基于链表数组的多幅波形包络提取方法 |
CN110928652A (zh) * | 2019-10-18 | 2020-03-27 | 蓝箭航天空间科技股份有限公司 | 操作系统任务延时实时管理方法、存储介质和服务器 |
CN115469991A (zh) * | 2022-11-14 | 2022-12-13 | 苏州浪潮智能科技有限公司 | 一种定时器队列设置方法、装置、设备及可读存储介质 |
-
2005
- 2005-09-30 CN CN 200510100188 patent/CN1936765A/zh active Pending
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2008148271A1 (fr) * | 2007-06-06 | 2008-12-11 | Zte Corporation | Procédé d'insertion d'événement |
CN101859260A (zh) * | 2010-05-14 | 2010-10-13 | 中国科学院计算技术研究所 | 用于操作系统中的定时器管理装置和管理方法 |
CN101859260B (zh) * | 2010-05-14 | 2012-12-12 | 中国科学院计算技术研究所 | 用于操作系统中的定时器管理装置和管理方法 |
CN102354257A (zh) * | 2011-07-13 | 2012-02-15 | 南京中兴软创科技股份有限公司 | 一种通讯平台的精确时钟管理方法 |
CN103034493A (zh) * | 2012-12-10 | 2013-04-10 | 上海斐讯数据通信技术有限公司 | 一种定时器节点的管理方法和系统 |
CN103034493B (zh) * | 2012-12-10 | 2015-11-18 | 上海斐讯数据通信技术有限公司 | 一种定时器节点的管理方法和系统 |
CN103901941A (zh) * | 2012-12-28 | 2014-07-02 | 北京大唐高鸿软件技术有限公司 | 利用内存开销提高计时器执行效率的方法 |
CN106528286A (zh) * | 2016-11-22 | 2017-03-22 | 北京智芯微电子科技有限公司 | 一种实现定时器的方法和装置 |
CN106597049A (zh) * | 2016-12-15 | 2017-04-26 | 电子科技大学 | 基于链表数组的多幅波形包络提取方法 |
CN106597049B (zh) * | 2016-12-15 | 2019-01-25 | 电子科技大学 | 基于链表数组的多幅波形包络提取方法 |
CN110928652A (zh) * | 2019-10-18 | 2020-03-27 | 蓝箭航天空间科技股份有限公司 | 操作系统任务延时实时管理方法、存储介质和服务器 |
CN115469991A (zh) * | 2022-11-14 | 2022-12-13 | 苏州浪潮智能科技有限公司 | 一种定时器队列设置方法、装置、设备及可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1936765A (zh) | 一种定时器链表的调度方法 | |
CN101859260B (zh) | 用于操作系统中的定时器管理装置和管理方法 | |
KR101450910B1 (ko) | 무선 센서 네트워크에서 에너지 소모를 줄이기 위한 타임 슬롯 할당 방법 | |
CN107992367B (zh) | 一种Modbus串口数据处理方法 | |
CN102270156A (zh) | 一种实时嵌入式系统定时器管理方法 | |
CN103346902B (zh) | 数据采集调度的方法及系统 | |
CN102467412A (zh) | 一种处理操作请求的方法、装置及业务系统 | |
CN101183316A (zh) | 实时操作系统中的任务延时处理方法及系统 | |
CN101281480B (zh) | 一种嵌入式系统中实现睡眠功能的方法 | |
WO2012094862A1 (zh) | 操作系统的任务调度方法、装置及计算机 | |
CN111026768A (zh) | 一种可实现数据快速装载的数据同步方法和装置 | |
CN100358295C (zh) | 一种定时器调度方法 | |
CN104035786A (zh) | 一种软件定时器的优化方法及系统 | |
CN108257375B (zh) | 一种电网抄表方法和系统 | |
CN112698961A (zh) | 一种redis分布式锁在kafka分布式程序中的使用方法 | |
CN104184687A (zh) | 一种通信基带处理的流程控制方法和硬件加速器电路 | |
CN102402416B (zh) | 一种元素出队序列设置方法及装置 | |
CN116566434A (zh) | 一种基于hplc的集中器多任务并行高效采集方法和系统 | |
CN101692737B (zh) | 一种面向移动rfid的轻量级数据同步系统及同步方法 | |
CN101673222B (zh) | VxWorks系统多路选择模式下任务定时器的实现方法 | |
CN115695330B (zh) | 嵌入式系统中微程的调度系统、方法、终端及存储介质 | |
CN106559861B (zh) | 蓝牙设备数据传输方法及装置 | |
CN116456216A (zh) | 一种基于hplc和双模通信的多路低压集抄系统及方法 | |
CN113051200B (zh) | 一种基于双路的数据采集并行数据传输及存储的装置及方法 | |
CN115221116A (zh) | 一种数据写入方法、装置、设备及可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |
Open date: 20070328 |