CN116048914A - 一种继电保护装置裸跑程序的异步日志处理方法 - Google Patents
一种继电保护装置裸跑程序的异步日志处理方法 Download PDFInfo
- Publication number
- CN116048914A CN116048914A CN202211674783.2A CN202211674783A CN116048914A CN 116048914 A CN116048914 A CN 116048914A CN 202211674783 A CN202211674783 A CN 202211674783A CN 116048914 A CN116048914 A CN 116048914A
- Authority
- CN
- China
- Prior art keywords
- log
- memory
- asynchronous
- processing method
- protection device
- 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
Images
Classifications
-
- H—ELECTRICITY
- H02—GENERATION; CONVERSION OR DISTRIBUTION OF ELECTRIC POWER
- H02H—EMERGENCY PROTECTIVE CIRCUIT ARRANGEMENTS
- H02H1/00—Details of emergency protective circuit arrangements
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3065—Monitoring arrangements determined by the means or processing involved in reporting the monitored data
-
- H—ELECTRICITY
- H02—GENERATION; CONVERSION OR DISTRIBUTION OF ELECTRIC POWER
- H02H—EMERGENCY PROTECTIVE CIRCUIT ARRANGEMENTS
- H02H1/00—Details of emergency protective circuit arrangements
- H02H1/0092—Details of emergency protective circuit arrangements concerning the data processing means, e.g. expert systems, neural networks
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Artificial Intelligence (AREA)
- Evolutionary Computation (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
一种继电保护装置裸跑程序的异步日志处理方法,应用在继电保护装置的裸跑的前后台程序中,包括:提供线程安全的日志接口,可在中断函数调用日志接口异步输出日志信息,日志输出接口从定长日志内存池申请日志存储空间,并按固定格式编码进行快速格式化,将格式化后的日志内存地址保存在日志缓存队列中,后台程序轮询处理缓存日志队列,对日志固定格式解码,格式化成标准的字符串输出,最后将日志内存释放回日志内存池。本发明实现了继电保护装置裸跑程序在支持中断嵌套的运行模式下,也能够保证日志输出接口调用的线程安全,多个中断并发输出日志时,输出的正确性,解决了高速并发输出日志的需求,大大提高了装置开发的调试效率和安全性。
Description
技术领域
本发明涉及嵌入式通信技术领域,具体涉及一种继电保护装置裸跑程序的异步日志处理方法。
背景技术
在继电保护装置中为了确保程序运行的安全可靠和高实时性,CPU程序通常采用裸跑的运行方式。在裸跑程序中一般通过中断嵌套实现实时抢占。在此环境下日志输出不能采用嵌入式开发环境提供的标准打印接口,一方面是标准打印接口格式化操作非常耗时不能在中断函数中调用,再者标准打印接口本身不是线程安全的,所以标准打印接口无法满足继电保护装置裸跑程序在中断函数中打印日志的需求。
基于消息驱动的异步日志实现一般都是基于操作系统多线程环境下实现,多个线程并发调用日志输出接口是通过操作系统提供的互斥锁实现线程安全,从而保证日志输出的正确性,利用类似消息队列的方式实现异步日志系统。如专利申请CN202210347868.3采用双缓存机制,能够实现多线程同时读写,有效避免读写线程互相阻塞,提升异步日志处理的效率。此种异步日志系统虽然提升了日志输出效率,但是实现起来需要依赖操作系统的支持,在裸跑的环境下无法实现。
专利申请CN202210149737.4中是在继电保护装置多核AMP架构芯片下通过将CPU核心分为裸核与系统核运行,日志系统通过采用不同的接口实现日志输出,利用裸核与系统核间存在共享内存实现日志存储,并最终通过系统核实现存储。对于非中断程序的日志记录,采用裸核printf接口将日志内容进行ASCII转码,再放入共享内存并进行串口打印输出;对于中断程序的日志记录,采用logmsg接口将日志内容放入队列保存,在专门的信息处理任务中对队列的数据进行ASCII转码,再放入共享内存并进行串口打印输出。此方法需要依赖系统核完成最终输出,在单核模式下或者AMP架构部署多个裸核程序时,无法实现日志的输出,并且中断程序中的日志输出接口也不支持可变参特性,日志接口的使用也有一定的局限性。
上述现有技术公开的日志管理主要是通过内存缓冲和日志异步处理实现日志的高速输出。但是在继电保护装置裸跑的程序中,以上方法都很难实现日志的高并发输出需求,尤其是在继电保护装置裸跑程序支持中断嵌套的场景下。
发明内容
为解决现有技术中存在的不足,本发明的目的在于提供一种继电保护装置裸跑程序异步日志处理方法,以解决继电保护装置裸跑程序中断环境下不能安全、高速输出日志的问题。
为了实现上述目标,本发明采用如下技术方案:
一种继电保护装置裸跑程序异步日志处理方法,主要用于继电保护装置CPU裸跑程序中,支持中断函数并发调用日志输出接口,保证输出接口线程安全。利用定长内存池管理日志内存空间,通过缓存队列缓存日志地址,同时实现后台程序通过轮询的方式消费日志缓存队列,并最终输出日志信息,实现继电保护装置裸跑程序异步日志输出。裸跑程序异步日志输出步骤包括:
步骤1:创建日志定长内存池,用于缓存日志内容;
步骤2:创建实现异步日志缓存队列;
步骤3:中断函数并发调用日志输出接口;
步骤4:后台程序轮询执行日志输出函数,输出日志内容。
优选地,所述步骤1包括:
步骤1.1:根据程序配置的单条日志最大内存占用、日志缓存条目和链表管理内存池需要预留的链表指针内存空间,计算定长内存池大小,在堆内存动态分配日志定长内存池空间;
步骤1.2:初始化申请的日志内存空间,保证内存数据清零;
步骤1.3:创建空闲链表,初始化内存池的定长内存块中预留的链表指针,将内存空间地址添加到空闲链表中。
优选地,所述步骤1.1中,单条日志最大内存占用空间包括:固定大小的日志数据头信息和最大的日志输出空间,按照应用需求定义单条日志的最大内存占用。
优选地,所述步骤1.3中,空闲链表添加删除操作采用无锁策略,通过CPU硬件底层提供的CAS机制保证空闲链表添加和删除操作的无锁实现。
优选地,所述步骤2中,异步日志缓存队列为通过CPU硬件底层提供的CAS机制利用有界数组实现多写单读的无锁环形队列。
优选地,所述步骤2中,队列深度按照程序的处理性能和实际输出吞吐量设定。
优选地,所述步骤3包括:
步骤3.1:通过内存池内存申请函数从定长内存池申请日志内存空间;
步骤3.2:初始化日志头信息,其中,日志头信息包括基本信息、日志长度和格式化字符串长度;基本信息包括:日志等级、时间戳、标签和调用模块id;
步骤3.3:按照格式化字符串数据解析可变参数对应的内存数据,按照格式化字符串和可变参数的内存占用对应关系格式化日志内存,可变参数据按可变参数实际内存占用重新拷贝到日志内存空间中;更新日志头信息包含的日志长度信息和格式化字符串长度信息;
步骤3.4:将日志内存存储空间的地址,添加到异步日志缓存的环形队列中。
优选地,所述步骤3.4中,当有中断同时向环形队列添加指针时,通过CPU硬件底层提供的CAS指令实现,保证并发调用接口的线程安全。
优选地,所述步骤4包括:
步骤4.1:后台程序轮询查询日志缓存的环形队列是否为空,后台程序作为单一消费者读取环形队列的数据;
步骤4.2:如果日志缓存的队列不为空,读取队列中缓存的日志地址,从该地址的内存中读取日志的信息头,从信息头获取格式化字符串长度信息,根据长度信息获取格式化字符串的内容,解析格式化字符串信息按照步骤3.3所述的可变参内存空间和可变参数的关系,获取可变参数实际内存信息,通过标准日志格式化函数将日志内容格式化成标准字符串;
步骤4.3:将格式化好的字符串通过日志后端模块输出,输出方式包括:文件、串口或网络数据包;
步骤4.4:日志输出结束后,调用内存释放接口将日志内存占用的内存空间,返还给日志定长内存池。
优选地,内存释放通过CPU硬件底层提供的CAS机制实现空闲链表更新时实现无锁操作,保证空闲链表更新操作的原子性。
与现有技术相比,本发明具有如下的有益效果:
1、本发明中提到的方法能够支持裸跑程序在中断嵌套的运行环境下,多个中断并发输出日志时能够保证日志输出结果正确,并且保持较高的性能。
2、本发明明显改善在中断函数输出日志新的处理器性能开销,通过独立的后台程序完成异步的日志的异步输出,异步模式不仅提高了多个中断同时输出日志的吞吐量,而且还通过将对耗时的日志格式化字符串操作分成两个步骤完成,中断函数仅对日志内容做简单格式化操作,标准的字符串格式化操作在后台日志输出函数完成,大大提升了裸跑程序日志输出的整体性能。
附图说明
图1是本发明提供的日志异步输出过程执行流程图;
图2是本发明提供的继电保护装置裸跑程序异步日志处理方法的详细实施流程图。
具体实施方式
下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。
应当理解,文中所使用的步骤编号仅是为了方便描述,不作为对步骤执行先后顺序的限定。
值得注意的是,本发明对于现有技术改进的核心构思之一在于,继电保护装置裸跑程序的异步日志处理方法实施过程的初始化,包含:创建日志存储区在存储区内划分出定长内存池,定长内存池用于存储日志头信息和实际日志输出内容。创建日志环形队列用于接收缓存多个中断发送的日志信息。创建后台程序用来轮询日志环形队列获取日志内容,将日志内容进行格式化字符串处理并最终输出,日志的具体输出方式,包括网络、文件、串口等多种输出方式。用户根据需要调用日志输出接口,完成日志信息的输出。初始化完成后,继电保护装置裸机程序可以在中断和非中断上下文同时调用日志输出接口,通过环形队列缓存日志信息,并在后台处理函数实现日志的异步输出。
更具体地,如图1所示,本发明的实施例提供了一种继电保护装置裸跑程序的异步日志处理方法,包括以下步骤:
步骤1:创建日志定长内存池,利用定长内存池实现日志内容的缓存,通过空闲链表对定长内存池进行管理,同时利用CPU底层硬件提供的CAS机制(Compare And Swap),实现链表添加删除的无锁接口,保证多线程环境下并发调用内存池申请释放接口的线程安全。保证多个中断可以并发的对空闲链表的头指针进行添加和删除操作。
作为本发明能够取得的有益技术效果之一,定长内存池也能够保证日志长期运行不会出现内存碎片。同时通过控制日志内存释放时机,可以充分利用定长内存池缓存日志数据,应用可以自定义缓存策略实现日志的缓存功能,对比通过队列存储日志信息,定长内存池实现日志的存储不会受到队列先进先出特性的限制,对于程序实现具有更好的灵活性和扩展性。
在本发明优选但非限制性的实施方式中,步骤1包括如下步骤:
步骤1.1:根据程序对日志空间占用内存池大小和单条日志最大内存占用的配置,通过链表管理内存池需要预留的链表指针内存空间,在堆内存动态分配日志定长内存池空间。
进一步地,单条日志最大内存占用空间包括固定大小的日志数据头信息。日志内容占用空间包括日志头信息,日志头信息包括日志格式化字符串长度和日志内容实际长度信息,日志头信息可以包括自定义的扩展字段。
步骤1.2:初始化定长内存池,保证内存数据清零。
步骤1.3:创建空闲链表,初始化内存池的定长内存块中预留的链表指针,将内存空间添加到空闲链表中。空闲链表添加删除操作采用无锁策略,通过处理器硬件底层提供的CAS机制保证空闲链表添加和删除操作的无锁实现。
步骤2:创建实现日志缓存环形队列,通过CPU硬件底层提供的CAS机制利用有界数组实现多写单读的无锁环形队列。
作为本发明能够取得的有益技术效果之一,多个写入者要求队列写入操作要实现成无锁操作。日志输出只能通过后台程序完成,因此只有一个读者消费队列数据,所以队列的读取操作无需通过无锁机制实现,这样可以提高读取接口的执行效率。
进一步地,队列深度可以按照程序的处理性能和实际输出吞吐量设定。
步骤3:中断函数并发调用日志输出接口,日志输出接口支持可变参数实现,日志接口是线程安全的,多个中断函数同时输出日志时,通过环形队列缓存日志内容。
在本发明优选但非限制性的实施方式中,步骤3包括如下步骤:
步骤3.1:通过内存池内存申请函数从定长内存池申请日志内存空间。
步骤3.2:初始化日志数据头信息。
进一步地,日志头信息包括基本信息和日志长度,格式化字符串长度等信息,基本信息可以包含日志等级,时间戳,标签,调用模块id等信息。
步骤3.3:按照格式化字符串数据解析可变参数对应的内存数据,格式化不执行耗费时间的可变参的标准字符串格式化操作,仅通过解析可变参类型,按照格式化字符串和可变参数的内存占用对应关系格式化日志内存,可变参内容按可变参数实际内存占用拷贝到从内存池中申请的日志内存空间中,更新日志头信息包含的日志长度信息和格式化字符串长度信息。
步骤3.4:将日志内存存储空间的地址,添加到异步日志缓存的环形队列中。当有中断同时向环形队列添加指针时,通过处理器底层提供的CAS指令实现,保证并发调用接口的线程安全。CAS是由CPU底层硬件实现的,不同的CPU实现机制不同,CAS能够保证读取写入操作的原子性。
步骤4:后台轮询执行日志输出函数消费日志环形队列,异步输出日志内容。
在本发明优选但非限制性的实施方式中,步骤4包括如下步骤:
步骤4.1:后台程序轮询查询日志缓存的环形队列是否为空,后台程序作为单一消费者读取环形队列的数据。
步骤4.2:如果日志缓存的队列不为空,读取队列中缓存的日志地址,从该地址的内存中读取日志的信息头,从信息头获取格式化字符串长度信息,根据长度信息获取格式化字符串的内容,解析格式化字符串信息按照步骤3.3所述的可变参内存空间和可变参数的关系,获取可变参数实际内存信息,通过标准日志格式化函数将日志内容格式化成标准字符串。
步骤4.3:将格式化好的字符串通过日志后端模块输出,输出方式可以是文件、串口或网络数据包。
步骤4.4:日志输出结束后,调用内存释放接口将日志内存占用的内存空间,返还给日志定长内存池。内存释放通过CPU的CAS实现空闲链表更新时实现无锁操作,保证空闲链表更新操作的原子性。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。
Claims (10)
1.一种继电保护装置裸跑程序的异步日志处理方法,其特征在于,在继电保护装置裸跑环境下支持中断嵌套的前后台程序,调用日志输出接口异步输出日志,包括如下步骤:
步骤1:创建日志定长内存池,用于缓存日志内容;
步骤2:创建实现异步日志缓存队列;
步骤3:中断函数并发调用日志输出接口;
步骤4:后台程序轮询执行日志输出函数,输出日志内容。
2.根据权利要求1所述的一种继电保护装置裸跑程序的异步日志处理方法,其特征在于:
所述步骤1包括:
步骤1.1:根据程序配置的单条日志最大内存占用、日志缓存条目和链表管理内存池需要预留的链表指针内存空间,计算定长内存池大小,在堆内存动态分配日志定长内存池空间;
步骤1.2:初始化申请的日志内存空间,保证内存数据清零;
步骤1.3:创建空闲链表,初始化内存池的定长内存块中预留的链表指针,将内存空间地址添加到空闲链表中。
3.根据权利要求2所述的一种继电保护装置裸跑程序的异步日志处理方法,其特征在于:
所述步骤1.1中,单条日志最大内存占用空间包括:固定大小的日志数据头信息和最大的日志输出空间,按照应用需求定义单条日志的最大内存占用。
4.根据权利要求2所述的一种继电保护装置裸跑程序的异步日志处理方法,其特征在于:
所述步骤1.3中,空闲链表添加删除操作采用无锁策略,通过CPU硬件底层提供的CAS机制保证空闲链表添加和删除操作的无锁实现。
5.根据权利要求1所述的一种继电保护装置裸跑程序的异步日志处理方法,其特征在于:
所述步骤2中,异步日志缓存队列为通过CPU硬件底层提供的CAS机制利用有界数组实现多写单读的无锁环形队列。
6.根据权利要求5所述的一种继电保护装置裸跑程序的异步日志处理方法,其特征在于:
所述步骤2中,队列深度按照程序的处理性能和实际输出吞吐量设定。
7.根据权利要求5所述的一种继电保护装置裸跑程序的异步日志处理方法,其特征在于:
所述步骤3包括:
步骤3.1:通过内存池内存申请函数从定长内存池申请日志内存空间;
步骤3.2:初始化日志头信息,其中,日志头信息包括基本信息、日志长度和格式化字符串长度;基本信息包括:日志等级、时间戳、标签和调用模块id;
步骤3.3:按照格式化字符串数据解析可变参数对应的内存数据,按照格式化字符串和可变参数的内存占用对应关系格式化日志内存,可变参数据按可变参数实际内存占用重新拷贝到日志内存空间中;更新日志头信息包含的日志长度信息和格式化字符串长度信息;
步骤3.4:将日志内存存储空间的地址,添加到异步日志缓存的环形队列中。
8.根据权利要求7所述的一种继电保护装置裸跑程序的异步日志处理方法,其特征在于:
所述步骤3.4中,当有中断同时向环形队列添加指针时,通过CPU硬件底层提供的CAS指令实现,保证并发调用接口的线程安全。
9.根据权利要求7述的一种继电保护装置裸跑程序的异步日志处理方法,其特征在于:
所述步骤4包括:
步骤4.1:后台程序轮询查询日志缓存的环形队列是否为空,后台程序作为单一消费者读取环形队列的数据;
步骤4.2:如果日志缓存的队列不为空,读取队列中缓存的日志地址,从该地址的内存中读取日志的信息头,从信息头获取格式化字符串长度信息,根据长度信息获取格式化字符串的内容,解析格式化字符串信息按照步骤3.3所述的可变参内存空间和可变参数的关系,获取可变参数实际内存信息,通过标准日志格式化函数将日志内容格式化成标准字符串;
步骤4.3:将格式化好的字符串通过日志后端模块输出,输出方式包括:文件、串口或网络数据包;
步骤4.4:日志输出结束后,调用内存释放接口将日志内存占用的内存空间,返还给日志定长内存池。
10.根据权利要求9述的一种继电保护装置裸跑程序的异步日志处理方法,其特征在于:
内存释放通过CPU硬件底层提供的CAS机制实现空闲链表更新时实现无锁操作,保证空闲链表更新操作的原子性。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211674783.2A CN116048914A (zh) | 2022-12-26 | 2022-12-26 | 一种继电保护装置裸跑程序的异步日志处理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211674783.2A CN116048914A (zh) | 2022-12-26 | 2022-12-26 | 一种继电保护装置裸跑程序的异步日志处理方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116048914A true CN116048914A (zh) | 2023-05-02 |
Family
ID=86115626
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211674783.2A Pending CN116048914A (zh) | 2022-12-26 | 2022-12-26 | 一种继电保护装置裸跑程序的异步日志处理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116048914A (zh) |
-
2022
- 2022-12-26 CN CN202211674783.2A patent/CN116048914A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CA2706737C (en) | A multi-reader, multi-writer lock-free ring buffer | |
US7650602B2 (en) | Parallel processing computer | |
US7337275B2 (en) | Free list and ring data structure management | |
US9086920B2 (en) | Device for managing data buffers in a memory space divided into a plurality of memory elements | |
US7478390B2 (en) | Task queue management of virtual devices using a plurality of processors | |
US8549521B2 (en) | Virtual devices using a plurality of processors | |
US5740406A (en) | Method and apparatus for providing fifo buffer input to an input/output device used in a computer system | |
SK31194A3 (en) | Multi-media signal processor computer system | |
US5948082A (en) | Computer system having a data buffering system which includes a main ring buffer comprised of a plurality of sub-ring buffers connected in a ring | |
RU2641244C2 (ru) | Унифицированный доступ к совместно используемой и управляемой памяти | |
US5696990A (en) | Method and apparatus for providing improved flow control for input/output operations in a computer system having a FIFO circuit and an overflow storage area | |
KR20200135718A (ko) | 액세스 요청을 관리하기 위한 방법, 장치, 기기 및 저장 매체 | |
US6665747B1 (en) | Method and apparatus for interfacing with a secondary storage system | |
US5638535A (en) | Method and apparatus for providing flow control with lying for input/output operations in a computer system | |
WO2023201987A1 (zh) | 请求处理方法、装置、设备及介质 | |
EP3598310B1 (en) | Network interface device and host processing device | |
US20210089481A1 (en) | Novel RTOS/OS Architecture for Context Switching Without Disabling Interrupts | |
CN113467964A (zh) | 接入用户态协议栈的实现方法、系统、装置及存储介质 | |
US20140156959A1 (en) | Concurrent array-based queue | |
CN110851276A (zh) | 一种业务请求处理方法、装置、服务器和存储介质 | |
US7913059B2 (en) | Information processing device, data transfer method, and information storage medium | |
CN108958903B (zh) | 嵌入式多核中央处理器任务调度方法与装置 | |
US20080005404A1 (en) | Method for managing buffers pool and a system using the method | |
CN116048914A (zh) | 一种继电保护装置裸跑程序的异步日志处理方法 | |
CN116820579A (zh) | 访存指令的调度方法、装置、电子设备和存储介质 |
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 |