CN107239276B - 一种基于c语言的异步延时执行方法及执行装置 - Google Patents
一种基于c语言的异步延时执行方法及执行装置 Download PDFInfo
- Publication number
- CN107239276B CN107239276B CN201710363591.2A CN201710363591A CN107239276B CN 107239276 B CN107239276 B CN 107239276B CN 201710363591 A CN201710363591 A CN 201710363591A CN 107239276 B CN107239276 B CN 107239276B
- Authority
- CN
- China
- Prior art keywords
- event
- module
- asynchronous
- delay
- asynchronous delay
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本发明公开一种基于C语言的异步延时执行装置,其包括结构体定义模块、计数驱动模块和异步延时(重)调用模块;异步延时(重)调用模块设有计数值模块、注入事件模块和事件标签模块,结构体定义模块用于对事件结构体及需要发生的事件进行定义;计数驱动模块用于采用时间单位对调用模块中发生的注入事件进行计数,且在计数过程中,对触发的事件进行队列清除,对未触发的事件进行计数累加;异步延时(重)调用模块用于对指定的发生事件、事件异步发生的延时计数值和事件指针指向获取指定存储位置,并对同一事件标签代表的事件重新计数注入。本发明采用异步延时调用,不阻塞主线程,且对CPU资源的消耗比实时操作系统小。
Description
技术领域
本发明涉及一种延时执行方法,尤其涉及一种基于C语言的异步延时执行方法及执行装置。
背景技术
异步延时执行,是一种对期望事件发生时间的延时和对期望事件延时发生不阻塞主线程的处理方法。
在面向对象的语言(例如C++、C#、Java等)中,可以采用多线程或异步函数实现;现有技术中,在C语言中采用实时操作系统(RealTimeOS)或采用多线程使用,但对小容量RAM和主频较低的MCU来说,存在较大的堆栈消耗,且多线程间维护成本高,反而得不偿失。
综上,有必要设计一种基于C语言的异步延时执行方法及执行装置来弥补上述缺陷。
发明内容
本发明提出一种基于C语言的异步延时执行方法及执行装置,其解决了现有技术中在C语言中采用实时操作系统使用多线程导致堆栈消耗大和多线程间维护成本高的缺陷。本发明采用异步延时调用,不阻塞主线程,且对CPU资源的消耗比实时操作系统小。
本发明的技术方案是这样实现的:
本发明公开一种基于C语言的异步延时执行装置,其包括结构体定义模块、计数驱动模块和调用模块;调用模块设有计数值模块、注入事件模块和事件标签模块,且调用模块包括异步延时调用模块和异步延时重调用模块;结构体定义模块用于对事件结构体及需要发生的事件进行定义;计数驱动模块用于采用时间单位对调用模块中发生的注入事件进行计数,且在计数过程中,对触发的事件进行队列清除,对未触发的事件进行计数累加;异步延时调用模块用于对指定的发生事件、事件异步发生的延时计数值和事件指针指向获取指定存储位置;异步延时重调用模块用于对指定的发生事件、事件异步发生的延时计数值和事件指针指向获取指定存储位置,并对同一事件标签代表的事件重新计数注入。
其中,事件结构体包括事件启动标志、事件启动计数值、事件计数值和事件指针。
其中,事件启动标志用于标记该事件是否在启动延时异步调用中。
其中,事件启动计数值用于记录事件注入时设置的延时值。
其中,事件计数值用于在计数驱动模块在每次计数时,采用自减方式进行事件异步延时触发的倒数值。
其中,事件指针用于存储异步延时触发发生的事件的方法指针。
其中,在调用一次保证执行的情况下,采用异步延时调用模块;其中异步延时调用模块的工作流程为:在对指定事件调用后,该事件开始计数,中间重复调用同事件的异步延时调用模块,该事件并不会重新计数,直到该事件达到指定计数值、触发事件发生后,才可以调用异步延时调用模块再次对事件进行调用。
其中,在调用完毕后,需根据实际情况,对将要发生的事件的执行时间进行随时修改的情况下,采用异步延时重调用模块;其中异步延时重调用模块的工作流程为:在对指定事件调用后,该事件开始计数,中间重复调用同事件的异步延时重调用模块,该事件重新计数;如果一直在该事件计数未到达前重复调用异步延时重调用模块,则该事件会一直重置计数,事件将永远不会发生。
本发明还公开一种基于C语言的异步延时执行装置的执行方法,其包括如下步骤:(S01)通过结构体定义模块定义多组需要发生的事件;(S02)异步延时调用模块、异步延时重调用模块分别针对步骤(S01)中定义的事件进行编号,且设定每组事件异步发生的延时计数值和事件指针指向,并获取指定存储位置;(S03)计数驱动模块每一间隔周期执行一次,每次执行均遍历步骤(S01)中定义的多个事件,如果事件启动标志为启动状态,则计数驱动模块将自减该事件的计数值,当该事件的计数值自减为0时,表示该事件已达到步骤(S02)中延时计数值的设定值,计数驱动模块通过该事件的事件指针,触发执行该事件;如果事件启动标志为未启动状态,则计数驱动模块将跳过此事件的驱动,执行步骤(S04);(S04)异步延时重调用模块对同一事件标签代表的事件重新计数注入。
与现有技术相比,本发明具有如下优点:
本发明采用C语言实现,作为最通用的编程语言,可以跨平台实现,避免了移植不同平台所耗费的开发成本,提高了兼容性,同时可便利地嵌入到各种对RAM和主频使用要求苛刻的嵌入式MCU中;本发明只需少量存储空间,在嵌入式MCU上实现具有对系统资源要求低,代码量小等优点。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明基于C语言的异步延时执行装置的结构框图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为了有助于和澄清随后的实施例的描述,在对本发明的具体实施方式进行详细说明之前,对部分术语进行解释,下列的解释应用于本说明书以及权利要求书。
本发明中出现的RAM是Random Access Memory的缩写,其中文意思为随机存取存储器,称作“随机存储器”,是与CPU直接交换数据的内部存储器,也叫主存,其可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。本发明中出现的MCU是Microcontroller Unit的缩写,其中文意思为微控制单元,其本质为一单片机,指将计算机的CPU、RAM、ROM、定时计数器和多种I/O接口集成在一片芯片上,形成的芯片级的计算机。本发明中出现的其它英文词语均为代码,不代表其它任何意义。
参照图1,作为优选的实施方式,本发明公开一种基于C语言的异步延时执行装置,其包括结构体定义模块、计数驱动模块和调用模块;调用模块设有计数值模块、注入事件模块和事件标签模块,且调用模块包括异步延时调用模块和异步延时重调用模块;结构体定义模块用于对事件结构体及需要发生的事件进行定义;计数驱动模块用于采用时间单位对调用模块中发生的注入事件进行计数,且在计数过程中,对触发的事件进行队列清除,对未触发的事件进行计数累加;异步延时调用模块用于对指定的发生事件、事件异步发生的延时计数值和事件指针指向获取指定存储位置;异步延时重调用模块用于对指定的发生事件、事件异步发生的延时计数值和事件指针指向获取指定存储位置,并对同一事件标签代表的事件重新计数注入。
本发明事件结构体包括事件启动标志、事件启动计数值、事件计数值和事件指针;事件启动标志用于标记该事件是否在启动延时异步调用中;事件启动计数值用于记录事件注入时设置的延时值;事件计数值用于在计数驱动模块在每次计数时,采用自减方式进行事件异步延时触发的倒数值;事件指针用于存储异步延时触发发生的事件的方法指针。
本发明在调用一次保证执行的情况下,采用异步延时调用模块;而在在调用完毕后,需根据实际情况,对将要发生的事件的执行时间进行随时修改的情况下,采用异步延时重调用模块。其中异步延时调用模块的工作流程为:在对指定事件调用后,该事件开始计数,中间重复调用同事件的异步延时调用模块,该事件并不会重新计数,直到该事件达到指定计数值、触发事件发生后,才可以调用异步延时调用模块再次对事件进行调用。异步延时重调用模块的工作流程为:在对指定事件调用后,该事件开始计数,中间重复调用同事件的异步延时重调用模块,该事件重新计数;如果一直在该事件计数未到达前重复调用异步延时重调用模块,则该事件会一直重置计数,事件将永远不会发生。
本发明还公开一种基于C语言的异步延时执行装置的执行方法,其包括如下步骤:(S01)通过结构体定义模块定义多组需要发生的事件;(S02)异步延时调用模块、异步延时重调用模块分别针对步骤(S01)中定义的事件进行编号,且设定每组事件异步发生的延时计数值和事件指针指向,并获取指定存储位置;(S03)计数驱动模块每一间隔周期执行一次,每次执行均遍历步骤(S01)中定义的多个事件,如果事件启动标志为启动状态,则计数驱动模块将自减该事件的计数值,当该事件的计数值自减为0时,表示该事件已达到步骤(S02)中延时计数值的设定值,计数驱动模块通过该事件的事件指针,触发执行该事件;如果事件启动标志为未启动状态,则计数驱动模块将跳过此事件的驱动,执行步骤(S04);(S04)异步延时重调用模块对同一事件标签代表的事件重新计数注入。本发明计数驱动模块为一个周期性的执行装置,其周期可以为1ms,本领域技术人员根据实际需求,可以将该周期设定为其它的时间。
本发明异步延时调用模块需指定发生事件为N个事件中的哪一个、设置事件异步发生的延时计数值和事件指针指向;例如在程序的某处,需要5秒后,获取指定存储位置存储的数值,而不阻塞主线程,那么可以使用异步延时调用模块,指定发生事件为N个事件中的第一个、设置事件异步发生的延时值为5000、设置事件指针指向的执行方法为获取指定存储位置存储的数值的方法;使用完异步延时调用模块后,程序继续运行,计数驱动模块则会自动计时,5秒后触发该事件。而异步延时重调用模块与异步延时调用模块使用方式相同,但异步延时重调用模块每次使用时,设置的事件将会重新延时计数,而异步延时调用模块则不会。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (8)
1.一种基于C语言的异步延时执行装置,其特征在于,其包括结构体定义模块、计数驱动模块和调用模块;调用模块设有计数值模块、注入事件模块和事件标签模块,且调用模块包括异步延时调用模块和异步延时重调用模块;
结构体定义模块用于对事件结构体及需要发生的事件进行定义;
计数驱动模块用于采用时间单位对调用模块中发生的注入事件进行计数,且在计数过程中,对触发的事件进行队列清除,对未触发的事件进行计数累加;
异步延时调用模块用于对指定的发生事件、事件异步发生的延时计数值和事件指针指向获取指定存储位置;
异步延时重调用模块用于对指定的发生事件、事件异步发生的延时计数值和事件指针指向获取指定存储位置,并对同一事件标签代表的事件重新计数注入;
其中,在调用一次保证执行的情况下,采用异步延时调用模块;其中异步延时调用模块的工作流程为:在对指定事件调用后,该事件开始计数,中间重复调用同事件的异步延时调用模块,该事件并不会重新计数,直到该事件达到指定计数值、触发事件发生后,才可以调用异步延时调用模块再次对事件进行调用;
在调用完毕后,需根据实际情况,对将要发生的事件的执行时间进行随时修改的情况下,采用异步延时重调用模块;其中异步延时重调用模块的工作流程为:在对指定事件调用后,该事件开始计数,中间重复调用同事件的异步延时重调用模块,该事件重新计数;如果一直在该事件计数未到达前重复调用异步延时重调用模块,则该事件会一直重置计数,事件将永远不会发生。
2.如权利要求1所述的基于C语言的异步延时执行装置,其特征在于,事件结构体包括事件启动标志、事件启动计数值、事件计数值和事件指针。
3.如权利要求2所述的基于C语言的异步延时执行装置,其特征在于,事件启动标志用于标记该事件是否在启动延时异步调用中。
4.如权利要求3所述的基于C语言的异步延时执行装置,其特征在于,事件启动计数值用于记录事件注入时设置的延时值。
5.如权利要求4所述的基于C语言的异步延时执行装置,其特征在于,事件计数值用于在计数驱动模块在每次计数时,采用自减方式进行事件异步延时触发的倒数值。
6.如权利要求5所述的基于C语言的异步延时执行装置,其特征在于,事件指针用于存储异步延时触发发生的事件的方法指针。
7.一种如权利要求1-6中任一项所述的基于C语言的异步延时执行装置的执行方法,其特征在于,其包括如下步骤:
(S01)通过结构体定义模块定义多组需要发生的事件;
(S02)异步延时调用模块、异步延时重调用模块分别针对步骤(S01)中定义的事件进行编号,且设定每组事件异步发生的延时计数值和事件指针指向,并获取指定存储位置;
(S03)计数驱动模块每一间隔周期执行一次,每次执行均遍历步骤(S01)中定义的多个事件,如果事件启动标志为启动状态,则计数驱动模块将自减该事件的计数值,当该事件的计数值自减为0时,表示该事件已达到步骤(S02)中延时计数值的设定值,计数驱动模块通过该事件的事件指针,触发执行该事件;如果事件启动标志为未启动状态,则计数驱动模块将跳过此事件的驱动,执行步骤(S04);
(S04)异步延时重调用模块对同一事件标签代表的事件重新计数注入。
8.如权利要求7所述的基于C语言的异步延时执行装置的执行方法,其特征在于,步骤(S03)中,间隔周期为1ms。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710363591.2A CN107239276B (zh) | 2017-05-22 | 2017-05-22 | 一种基于c语言的异步延时执行方法及执行装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710363591.2A CN107239276B (zh) | 2017-05-22 | 2017-05-22 | 一种基于c语言的异步延时执行方法及执行装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107239276A CN107239276A (zh) | 2017-10-10 |
CN107239276B true CN107239276B (zh) | 2021-01-12 |
Family
ID=59985560
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710363591.2A Active CN107239276B (zh) | 2017-05-22 | 2017-05-22 | 一种基于c语言的异步延时执行方法及执行装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107239276B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109873863B (zh) * | 2019-01-18 | 2021-10-15 | 北京百度网讯科技有限公司 | 服务的异步调用方法和装置 |
CN115061799B (zh) * | 2022-06-30 | 2024-06-28 | 天津津航计算技术研究所 | 一种无操作系统的任务调度方法 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1556758A4 (en) * | 2002-10-31 | 2008-04-16 | Src Computers Inc | PROCESS FOR CONVERSING PROGRAMS IN HIGH-PROGRAMMING LANGUAGES IN A UNITED RETRIEVABLE FILE FOR HYBRID DATA PROCESSING PLATFORMS |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
FR2774784B1 (fr) * | 1998-02-12 | 2004-09-24 | Inside Technologies | Microprocesseur comportant un systeme de synchronisation avec un evenement asynchrone attendu |
CN101770394B (zh) * | 2008-12-29 | 2012-10-03 | 上海科泰世纪科技有限公司 | 基于构件接口的异步调用方法 |
US9606801B2 (en) * | 2013-09-06 | 2017-03-28 | Huawei Technologies Co., Ltd. | Method and apparatus for asynchronous processor based on clock delay adjustment |
CN103559045B (zh) * | 2013-11-21 | 2017-05-10 | 青岛大学 | 一种硬件实时操作系统 |
-
2017
- 2017-05-22 CN CN201710363591.2A patent/CN107239276B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1556758A4 (en) * | 2002-10-31 | 2008-04-16 | Src Computers Inc | PROCESS FOR CONVERSING PROGRAMS IN HIGH-PROGRAMMING LANGUAGES IN A UNITED RETRIEVABLE FILE FOR HYBRID DATA PROCESSING PLATFORMS |
Also Published As
Publication number | Publication date |
---|---|
CN107239276A (zh) | 2017-10-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7174554B2 (en) | Tools and methods for discovering race condition errors | |
JP3863917B2 (ja) | リアルタイム非同期ソフトウェア・アプリケーションにおいて階層呼び出し構造を実施する方法 | |
CN110018914B (zh) | 基于共享内存的消息采集方法及装置 | |
EP1012715B1 (en) | Hardware assisted method of context switching | |
CN106569891B (zh) | 一种存储系统中任务调度执行的方法和装置 | |
CN108710531B (zh) | 循环队列的数据写入方法、装置、终端设备和存储介质 | |
CN107239276B (zh) | 一种基于c语言的异步延时执行方法及执行装置 | |
US20070288931A1 (en) | Multi processor and multi thread safe message queue with hardware assistance | |
US20140208083A1 (en) | Multi-threaded logging | |
Barrington et al. | A scalable multi-producer multi-consumer wait-free ring buffer | |
CN112559210B (zh) | 一种基于rtx实时系统的共享资源读写互斥方法 | |
CN106802689B (zh) | Windows操作系统环境下可调速高精度定时器的实现方法 | |
US7266650B2 (en) | Method, apparatus, and computer program product for implementing enhanced circular queue using loop counts | |
US10102037B2 (en) | Averting lock contention associated with core-based hardware threading in a split core environment | |
CN113176934B (zh) | 嵌入式超高时钟精度定时任务执行方法和嵌入式操作系统 | |
CN114595084A (zh) | 一种Linux操作系统上系统级进程间视频共享方法 | |
CN114003365A (zh) | 用于risc-v架构的快速中断系统 | |
EP1125199B1 (en) | Method of debugging a program thread | |
CN108958903B (zh) | 嵌入式多核中央处理器任务调度方法与装置 | |
CN113419832A (zh) | 一种延迟任务的处理方法、装置及终端 | |
CN110222016B (zh) | 一种文件处理方法及装置 | |
GB2541400A (en) | Tracing of exception handling events | |
CN112840309B (zh) | 命令调度方法、装置及存储介质 | |
US20180004571A1 (en) | Averting Lock Contention Associated with Core-Based Hardware Threading in a Split Core Environment | |
US11360702B2 (en) | Controller event queues |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |