CN116501476B - linux通用字符设备处理方法、装置、设备和介质 - Google Patents

linux通用字符设备处理方法、装置、设备和介质 Download PDF

Info

Publication number
CN116501476B
CN116501476B CN202310774133.3A CN202310774133A CN116501476B CN 116501476 B CN116501476 B CN 116501476B CN 202310774133 A CN202310774133 A CN 202310774133A CN 116501476 B CN116501476 B CN 116501476B
Authority
CN
China
Prior art keywords
thread
instruction
result
main process
prefix
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
Application number
CN202310774133.3A
Other languages
English (en)
Other versions
CN116501476A (zh
Inventor
宋琳
张正萍
龙政方
朱乾勇
韩波
邓凌天
陈建伟
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Chongqing Selis Phoenix Intelligent Innovation Technology Co ltd
Original Assignee
Chengdu Seres Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Chengdu Seres Technology Co Ltd filed Critical Chengdu Seres Technology Co Ltd
Priority to CN202310774133.3A priority Critical patent/CN116501476B/zh
Publication of CN116501476A publication Critical patent/CN116501476A/zh
Application granted granted Critical
Publication of CN116501476B publication Critical patent/CN116501476B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • G06F9/4881Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5027Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
    • G06F9/5038Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the execution order of a plurality of tasks, e.g. taking priority or time dependency constraints into consideration
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/546Message passing systems or structures, e.g. queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/547Messaging middleware
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/548Queue
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)
  • Retry When Errors Occur (AREA)

Abstract

本申请涉及一种linux通用字符设备处理方法、装置、设备和介质。所述方法包括:创建主进程;所述主进程创建第一线程,所述第一线程实现串口设备的初始化后监听设备文件是否可用,若是则创建第二线程;所述第二线程轮询设备文件并获取字符流,向所述第一线程反馈第二线程是否正常;所述主进程创建第三线程,所述第三线程构建一个指令执行队列并根据指令执行队列顺序依次将指令挂载到全局链表上,向所述第一线程反馈第二线程是否异常;当第二线程异常时关闭第二线程并生成新的第二线程。本方法提供了在linux下通用字符设备处理方式,减少了适配性工作量,提升了适配效率。

Description

linux通用字符设备处理方法、装置、设备和介质
技术领域
本申请涉及linux通用字符设备处理技术领域,特别是涉及一种linux通用字符设备处理方法、装置、计算机设备和存储介质。
背景技术
在嵌入式开发和程序运行过程中存在一种通用的需求即通过串口进行信息交互。典型的需求:适配不同的5G模组时,适配GPS模组等。
Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds)于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。但信息交互缺乏可适配支持多种相同协议,如AT指令、SDBP协议等外设的字符流处理框架,因此需要提供一种灵活快速开发的linux通用字符设备处理方法、装置,来减少适配性工作。
发明内容
基于此,有必要针对上述技术问题,提供一种linux通用字符设备处理方法、装置、计算机设备和存储介质,能够解决目前缺乏适配不同的模组的linux通用字符设备处理方法,导致增加适配性工作量,降低适配效率的技术问题。
一方面,提供一种linux通用字符设备处理方法,所述方法包括:
创建主进程,完成模组适配层的功能函数注册;
响应于完成模组适配层的功能函数注册后,所述主进程创建第一线程,所述第一线程实现串口设备的初始化后监听设备文件是否可用,若是则创建第二线程;
所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程,解析获取指令结果的前缀并与全局链表上的指令前缀比对,若相同则将指令结果挂载到全局链表上,同时释放条件变量并向所述第一线程反馈第二线程正常;
响应于完成模组适配层的功能函数注册后,所述主进程创建第三线程,所述第三线程构建一个指令执行队列并根据指令执行队列顺序依次将指令挂载到全局链表上,同时设置每个指令的结果等待时长,若超出结果等待时长未检测到指令结果时向所述第一线程反馈第二线程异常,若在结果等待时长内检测到指令结果时释放条件变量结束第二线程。
在其中一个实施例中,在所述创建主进程时,还包括:
所述主进程根据消息队列组建状态机来处理业务流;
所述主进程创建第四线程,所述第四线程用于管理队列并与所述第三线程交互,当监听到消息时将指令进行入队,当接收到所述第二线程反馈的指令结果时,将对应指令结果的指令从队列中出队。
在其中一个实施例中,在所述主进程根据消息队列组建状态机来处理业务流时,还包括:
创建副进程,在zmq消息初始化后,持续读取标准输入字符获取输入的指令;
响应于当监听到指令时,获取命令字符串;
所述副进程将命令字符串通过zmq消息发送给主进程;
所述主进程将接收到zmq消息发送给第四线程进行入队。
在其中一个实施例中,所述副进程创建while(1)函数持续读取标准输入字符获取输入的指令;
响应于当监听到指令时,通过执行回调函数获取命令字符串;
当返回的命令字符串个数不为空时,所述副进程将获得的命令字符串通过预设的网址、端口携带对应的指令前缀,以消息形式发送给主进程;
所述主进程将接收到zmq消息,通过消息队列发送给第四线程进行入队。
在其中一个实施例中,所述第一线程在创建第二线程之后还包括持续判断第二线程的状态;其中持续判断第二线程的状态包括:
实时监测所述第二线程执行对应指令的执行反馈结果,若反馈结果为第二线程正常则结束;
实时监测所述第三线程遍历指令执行队列中每一指令的执行反馈结果,若反馈结果为对应指令的第二线程正常则结束,若反馈结果为对应指令的第二线程异常则关闭第二线程并生成新的第二线程重新执行对应指令。
在其中一个实施例中,所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程步骤包括:
通过linux提供的读写函数获取相应的字符流;
当第二线程在字符流中读取到单行命令字符串时,获取命令字符串对应指令的指令前缀,检查是否接收到对应指令前缀的指令结果;
响应于接收到对应指令前缀的指令结果时,将接收的指令结果反馈给所述主进程。
在其中一个实施例中,所述设置每个指令的结果等待时长步骤,包括:
设置每个指令的条件变量的最大阻塞时长作为每个指令的结果等待时长;
在目标指令的结果等待时长内进行下一指令阻塞,等待目标指令的条件变量释放。
另一方面,提供了一种linux通用字符设备处理装置,所述装置包括:
主进程管理模块,用于创建主进程,完成模组适配层的功能函数注册;
第一线程管理模块,用于响应于完成模组适配层的功能函数注册后,所述主进程创建第一线程,所述第一线程实现串口设备的初始化后监听设备文件是否可用,若是则创建第二线程;
第二线程管理模块,用于控制所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程,解析获取指令结果的前缀并与全局链表上的指令前缀比对,若相同则将指令结果挂载到全局链表上,同时释放条件变量并向所述第一线程反馈第二线程正常;
第三线程管理模块,用于响应于完成模组适配层的功能函数注册后,所述主进程创建第三线程,所述第三线程构建一个指令执行队列并根据指令执行队列顺序依次将指令挂载到全局链表上,同时设置每个指令的结果等待时长,若超出结果等待时长未检测到指令结果时向所述第一线程反馈第二线程异常,若在结果等待时长内检测到指令结果时释放条件变量结束第二线程。
再一方面,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
创建主进程,完成模组适配层的功能函数注册;
响应于完成模组适配层的功能函数注册后,所述主进程创建第一线程,所述第一线程实现串口设备的初始化后监听设备文件是否可用,若是则创建第二线程;
所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程,解析获取指令结果的前缀并与全局链表上的指令前缀比对,若相同则将指令结果挂载到全局链表上,同时释放条件变量并向所述第一线程反馈第二线程正常;
响应于完成模组适配层的功能函数注册后,所述主进程创建第三线程,所述第三线程构建一个指令执行队列并根据指令执行队列顺序依次将指令挂载到全局链表上,同时设置每个指令的结果等待时长,若超出结果等待时长未检测到指令结果时向所述第一线程反馈第二线程异常,若在结果等待时长内检测到指令结果时释放条件变量结束第二线程。
又一方面,提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
创建主进程,完成模组适配层的功能函数注册;
响应于完成模组适配层的功能函数注册后,所述主进程创建第一线程,所述第一线程实现串口设备的初始化后监听设备文件是否可用,若是则创建第二线程;
所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程,解析获取指令结果的前缀并与全局链表上的指令前缀比对,若相同则将指令结果挂载到全局链表上,同时释放条件变量并向所述第一线程反馈第二线程正常;
响应于完成模组适配层的功能函数注册后,所述主进程创建第三线程,所述第三线程构建一个指令执行队列并根据指令执行队列顺序依次将指令挂载到全局链表上,同时设置每个指令的结果等待时长,若超出结果等待时长未检测到指令结果时向所述第一线程反馈第二线程异常,若在结果等待时长内检测到指令结果时释放条件变量结束第二线程。
上述linux通用字符设备处理方法、装置、计算机设备和存储介质,提供了在linux下通用字符设备处理方式,减少了适配不同模组、不同协议之间导致的业务冗余开发时间,减少了适配性工作量,提升了适配效率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为一个实施例中linux通用字符设备处理方法的应用环境图;
图2为一个实施例中linux通用字符设备处理方法的流程示意图;
图3为一个实施例中主进程根据消息队列组建状态机来处理业务流步骤的流程示意图;
图4为一个实施例中第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程步骤的流程示意图;
图5为一个实施例中设置每个指令的结果等待时长步骤的流程示意图;
图6为一个实施例中linux通用字符设备处理装置的结构框图;
图7为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
实施例1
如图1所示,本发明实施例1中创造性的提出了一种linux通用字符设备处理方法,基于linux提供常用的资源(进程、线程、定时器、信号量、锁等)创建出两个进程多个线程精准、可靠、快速实现处理多线程之间同时发指令收指令结果,完成业务逻辑的正常运行。此框架抽象出大部分模组之间的共同功能,保证功能不变的同时,适配不同模组之间的任务量变小。
创建主进程实现:定时器的初始化、zmq消息及消息队列初始化、完成模组适配层的功能函数注册、接受消息队列组建状态机来处理业务流程。
其中zmq是一个基于ZeroMQ的高性能、开放源代码的消息传递库。它提供了一个简单易用的API,使得应用程序可以轻松地在不同的进程和机器之间进行消息传递。
zmq的优势包括:1)高性能:zmq使用异步I/O模型,可以处理数百万个并发连接,同时提供低延迟和高吞吐量的消息传递。2)可靠性:zmq提供了多种机制来保证消息传递的可靠性,例如消息确认、重发、超时等。
zmq消息和消息队列是两类;zmq消息用于和副进程(Subprocess)通信,传递数据用;消息队列是主进程(Mainprocess)使用,用于传递消息队列组建状态机。状态机用于业务的逻处理如:模组拨号、模组状态切换、信号灯的切换、上层应用的动作回复等。zmq消息是处理主进程与副进程之间的消息传递,zmq消息是用于主进程副进程通信使用;消息队列是主进程再用,用于组建状态机,传递业务信息。
zmq是一个库需要对其进行初始化如创建对象context、socket创建等。消息队列的创建是为了主进程(Mainprocess)传递消息,组建消息状态机来构建业务逻辑。
定时器监听设备文件及触发业务初始化消息。
定时器主要维护设备文件是否掉线以及触发首次拨号的业务,和zmq不相关。
适配层为了方便移植以处理相同功能不同协议报文的情况。
主进程创建第一线程,第一线程实现串口设备的初始化后开启while(1)函数开始监听设备文件是否可用,实现以USB协议连接时热插拔导致的线程崩溃的程序自愈,不可用会发送zmq消息给主进程进行业务调度。当设备文件正常可用时,创建第二线程。
while(1)函数具体是完成:1、判定/dev/ttyUSB0文件读写权限;2、创建第二线程;3、由条件变量阻塞第一线程用于线程关闭时进行自愈回到第一步。
本实施例通过access函数判断监听设备文件是否可用。
第一线程创建子第二线程是以完成监听处理设备文件的字符流。字符流分为监听与处理两类,监听以read一直读取所有发往设备文件的字符并返回,处理主要是设备文件返回的字符通过全局链表挂载的期待返回值进行比对,比对成功就进行挂载到全局链表,同时释放条件变量。处理字符过程中去掉多余的返回格式,同时可直接识别响应结果将结果挂载到全局链表上。可将指令结果正常打印或涉密打印。第二线程的处理工作还实现了检测模组(指5G通信模组,GNSS导航模组)的主动上报指令结果,主动上报指令结果可发送业务消息给主进程,进程实现业务流程的状态调度。
条件变量是一种线程同步原语,用于在多线程编程中实现共享资源的互斥访问。当多个线程需要同时访问同一个共享资源时,条件变量可以帮助它们协调彼此的执行顺序,以避免冲突和竞争条件的发生。
条件变量通常与锁(互斥锁)一起使用,通过等待和唤醒操作来实现线程间的同步。当一个线程想要获得锁时,它会尝试获取锁并阻塞在该线程上。如果其他线程已经获得了锁,则等待该条件变量被唤醒。一旦条件变量被唤醒,持有锁的线程将释放锁并允许其他等待该条件变量的线程继续执行。
条件变量通常在操作系统提供的线程库中实现。每个操作系统都有自己的条件变量实现,但它们的基本功能是相同的。
条件变量属于操作系统,而不是某个特定的编程语言或应用程序。程序员可以使用条件变量来实现多线程编程中的同步和互斥访问,但他们必须了解如何使用操作系统提供的线程库来实现这些功能。
指令正常打印即通过printf正常输出打印到屏幕;涉密打印可设置设密指令,通过比对设密指令的字符数组将*代替正常字符。涉密命令可设置,当命令涉及到账号密码等会采取此方式。
主进程进行业务调度为主流程维护状态机:1、完成对模组的初始化:模组拨号、下ap侧的配置到模组端等业务逻辑; 2、接收主动上报命令的消息触发,进行业务响应:当5G与4G模式更改时,灯的状态响应;当模组驻网成功后ap侧完成的拨号动作等;3、当定时器access设备不可用时发起设备停用的消息,主进程开始进行第二线程的资源回收。
第四线程主要完成队列的入队、出队请求调度。因每次发送给串口设备文件是会通过pthread_condition_wait等待条件变量会导致线程阻塞,所以每次都是由第三线程来完成队列的遍历并依次读取队列节点中存放命令并完成命令字符的发送。
主进程创建第三线程,为实现多个线程的同时发送,是构建了一个队列,(依次将指令、指令结果挂载到全局链表(response链表)上)将所有发送的命令进行依次填充到一个全局链表中,由第三线程进行发送。同时由条件变量设定最大阻塞30s进行阻塞实际发送指令函数,直到第二线程完成链表的期待返回值挂载同时会释放掉条件变量。如果条件变量到期则同时会导致第一线程直接关闭第二线程完成异常问题修复并自愈。发送接口可进行字符的格式化解析,实现灵活的数据获取。进行字符的格式化解析是指字符的处理分为监听和处理两个顺序步骤。先监听,再处理。先从设备文件中获取到字符串,再判断此字符串释放是主动上报字符命令组里面、是否是期待命令前缀。
队列的形式是以链表为和核心的先进先出的数据格式。当write发送给/dev/ttyUSB0后正常释放了条件变量,第三线程会发送下一个节点的命令。
指令函数是一种统称,如我想要实现模组拨号的功能,则这个功能就是发送指令的函数,因为会发命令给第四线程,入队,第三线程会回复msg给指令函数。阻塞实际发送函数的是由模组的响应时间决定的。阻塞是为了解决异步设备获得同步消息的一种手段,保证我发的消息模组能收到,模组发的我能收到。
每个命令可单独设置等待时间,可在队列节点中添加。默认30s。超时会触发第二线程的关闭、线程资源回收。条件变量在条件满足时会被释放,所有由这个条件变量阻塞的线程都会被满足。超时也会释放条件变量。
第四线程只完成队列入队和出队,第三线程用来write发送队列一个节点上保存的命令。全局链表是在,业务逻辑执行命令发送时创建一个节点,将命令结果前缀挂载到全局链表上。当第二线程监听到字符串后且比对链表上的命令前缀数组一致后将监听到的字符串保存到全局全局链表上。
主进程创建定时器完成:设备文件的状态检查与初始化流程的触发(区分热插拔与模组自动重启导致的不同业务流程)。
设备文件具体包括外置模组与ap侧挂载使用的协议一般如USB、PCIE协议等,但AT通道使用的串口都是由各协议内部向linux发起串口注册。因此在注册成功后在/dev目录生成对应的设备文件如/ttyUSB0 /nr31等。当设备文件注册完成时,可向此设备文件发送命令,命令的回复也会发送到此文件中,通过linux提供的对文件的读写函数(write、read)即可获取相应的字符流。
副进程主要实现通过解析shell命令实现直接调试模组的业务流程。主要通过zmq消息发送给主进程,再由主进程打印出指令响应结果。
读取stdin,发送给主进程(Mainprocess)单条调试具体指令。
stdin 是标准输入。当使用副进程(Subprocess)调试单条命令时,可直接再shell端进行输入命令。
在计算机编程中,stdin 是指从标准输入设备(键盘)读取输入的数据流。标准输入设备通常是终端窗口或控制台,它们允许用户通过键入字符和命令来与程序交互。当程序运行时,它会等待用户输入数据,并将其发送到标准输入设备中。然后,程序可以使用stdin 对象来读取这些输入字符,并根据需要执行相应的操作。
stdin 通常用于读取命令行参数、配置文件等。例如,在 Linux 系统中,bashshell 可以通过 $argv 数组访问传递给脚本的所有命令行参数,其中第一个参数就是 $0,表示脚本本身的名称。
副进程(Subprocess)与主进程(Mainprocess)对指令结果的需求是不一致的。副进程(Subprocess)用于单条指令的输入调试,主进程(Mainprocess)用于完成业务功能。常见的指令如at指令,以at指令为例描述详细的指令收发步骤。以At指令-查询信号质量指令为例: “at+hacq?” At指令响应结果:^hcsq:11,22,33,44,55。副进程(Subprocess)只需要输入at指令将结果打印出来即可,业务逻辑还需要指定期待指令返回结果:^hcsq用于清洗字符串。在去掉不相关的固定格式头之后如:”^hcsq”“:”等 ,将剩下的字符串按格式获取、保存到每条特定指令对应的结构体成员中。格式转换通过常用库函数atoi。
Hcsq
{
Member1, //=11
Member2 //=22,
Member3 //=33,
Member4 //=44,
Member5 //=55,
}
当副进程(Subprocess)初始化:zmq_ctx_new、zmq_socket、zmq_connect,创建一个publish完成zmq消息初始化。创建while(1)函数一直read获取stdin字符。此时在shell端直接输入at指令:”at+hacq?” 。当read返回字符个数不为空时,将获取字符通过zmq消息发送出去。此时通过publish通过约定好的网址、端口再携带约定好的topoic发送zmq消息被主进程(Mainprocess)初始化时创建的subscribe监听到。当subscribe监听到约定好的topic后,执行对应的回调函数。回调函数就是将要发送的命令字符串通过消息队列发送给第四线程进行入队。第四线程主要完成队列的入队、出队请求调度。因每次发送给串口设备文件是会通过pthread_condition_wait等待条件变量会导致线程阻塞,所以每次都是由第三线程来完成队列的遍历并依次读取队列节点中存放命令并完成命令字符的发送。
第三线程的功能就是遍历队列,读取每个队列中的每个节点中保存的命令字符串通过write设备文件将之发送出去。在write字符串给设备文件/dev/ttyUSB0后,会pthread_condition_wait等待条件变量cmmd_condition的释放。当条件变量cmmd_condition释放后,继续遍历队列节点执行write命令。
当命令发送给/dev/ttyUSB0后,第二线程 使用read一直获取/dev/ttyUSB0的fd的字符。当read字符个数不为空时,通过一个全局数组s_tbuffer 8K容量保存‘\r’‘\n’‘\0’之前的字符串。将此时读取到的字符串打印出来^hcsq:11,22,33,44,55。即当使用副进程(Subprocess)发送命令给主进程(Mainprocess)完成单条命令的调试。
主进程(Mainprocess)进程和副进程(Subprocess)不同,主进程(Mainprocess)进程需要的是能正确解析命令返回的数据。因此需要一个全局链表保存第二线程获取到的数据。当第二线程读取到单行字符串时,将buffer传出到processline函数处理。Processline函数的处理步骤为:
1、判断全局链表首节点是否为空,若为空则进行主动上报的检查。匹配字符串^hcsq:11,22,33,44,55中以:号分割,取表头^hcsq命令进行与主动上报的命令字符串数组进行匹配。匹配完成后就通过就执行对应的函数指针进行业务逻辑函数的执行。以^hcsq命令为例:当检测到^hcsq命令主动上报后,触发到主动上报函数的执行。主动上报函数将^hcsq的结果解析到^hcsq对应的结构体里面。通过异步消息队列发送给主进程(Mainprocess)中的状态机。状态机中有不同的业务逻辑的事件状态,收到^hcsq命令对应的事件后,通常做法就是将信号标识的灯转换成对应的状态。如4G灯切换到5G,信号强度由强到弱等。
2、当全局链表不为空时,则说明是主进程(Mainprocess)进程在命令发起前创建了全局链表s_response的节点,并将节点挂载到链表上。在主进程(Mainprocess)发起命令的时候,会指定命令结果前缀。如检查主动上报的动作一致,会去匹配命令发起返回后的字符串是否和命令结果前缀一致。一致则将此字符串挂载到节点上,同时释放掉cmmd_condition。此时第三线程中由cmmd_condition阻塞的位置也得到了释放。当阻塞超时时,会使用pthread_cancel函数关闭第二线程。继续执行下一个节点中的命令。同时发送同步消息返回执行命令后的结果。将命令结果拿到之后:跳过命令头、跳过空格,通过strsep分割字符串,通过strtoul、strtol等库函数将字符串转换成期待格式保存到结构体中。
当模组出现异常之后:首先主进程(Mainprocess)创建的定时器使用access函数判定/dev/ttyUS0的读写是否正常,当出现异常后,就会发送消息到主进程(Mainprocess)中的状态机进行执行掉线后的操作。
1、pthread_cancel函数关闭第二线程;
2、关闭设备文件获取fd,释放掉cmmd_condition条件变量;
3、全局变量s_readerclose=1置位;
4、释放掉s_state_cond条件变量;
5、由于第一线程使用线程等待pthread_condition_wait一直等待的条件变量s_state_cond得到了释放,就回到了一直通过access判定/dev/ttyUSB0是否可用的循环。当条件满足可用时,就设置tios的结构体设置串口参数如:波特率等。重新创建第二线程达到自愈的流程。
本发明提供了在linux下通用字符设备处理框架,提供了适配不同模组、不同协议之间导致的业务冗余开发,减少了适配性工作量,提升了适配效率。
实施例2
在本申请实施例2中包含了实施例1的全部技术特征。如图2所示,在本申请实施例2中提供了一种linux通用字符设备处理方法,以该方法应用于图1中为例进行说明,包括以下步骤:
步骤S1,创建主进程,控制定时器初始化、zmq消息及消息队列初始化、完成模组适配层的功能函数注册、根据消息队列组建状态机来处理业务流;
步骤S2,响应于完成模组适配层的功能函数注册后,所述主进程创建第一线程,所述第一线程实现串口设备的初始化后监听设备文件是否可用,若是则创建第二线程;
步骤S3,所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程,解析获取指令结果的前缀并与全局链表上的指令前缀比对,若相同则将指令结果挂载到全局链表上,同时释放条件变量并向所述第一线程反馈第二线程正常;
步骤S4,响应于完成模组适配层的功能函数注册后,所述主进程创建第三线程,所述第三线程构建一个指令执行队列并根据指令执行队列顺序依次将指令挂载到全局链表上,同时设置每个指令的结果等待时长,若超出结果等待时长未检测到指令结果时向所述第一线程反馈第二线程异常,若在结果等待时长内检测到指令结果时释放条件变量结束第二线程。
其中步骤S2中,创建第二线程是执行对应指令,之后持续判断第二线程的状态,当第二线程异常时关闭第二线程并生成新的第二线程。
如图3所示,在本实施例中,在所述创建主进程时,还包括:
所述主进程根据消息队列组建状态机来处理业务流;
所述主进程创建第四线程,所述第四线程用于管理队列并与所述第三线程交互,当监听到入队消息时将指令进行入队,当接收到所述第二线程反馈的指令结果时,将对应指令结果的指令从队列中出队。
如图3所示,在本实施例中,在所述主进程根据消息队列组建状态机来处理业务流时,还包括:
步骤S11,创建副进程,在zmq消息及消息队列初始化后,持续读取标准输入字符获取输入的指令;
步骤S12,响应于当监听到指令时,获取命令字符串;
步骤S13,所述副进程将命令字符串通过zmq消息发送给主进程;
步骤S14,所述主进程将接收到zmq消息发送给第四线程进行入队。
具体的,所述副进程创建while(1)函数持续读取标准输入字符获取输入的指令;响应于当监听到指令时,通过执行回调函数获取命令字符串;当返回的命令字符串个数不为空时,所述副进程将获得的命令字符串通过预设的网址、端口携带对应的指令前缀,以消息形式发送给主进程;所述主进程将接收到zmq消息通过消息队列发送给第四线程进行入队。
在本实施例中,所述第一线程在创建第二线程之后还包括:持续判断第二线程的状态,其中持续判断第二线程的状态时,包括:
实时监测所述第二线程执行对应指令的执行反馈结果,若反馈结果为第二线程正常则结束;
实时监测所述第三线程遍历指令执行队列中每一指令的执行反馈结果,若反馈结果为对应指令的第二线程正常则结束,若反馈结果为对应指令的第二线程异常则关闭第二线程并生成新的第二线程重新执行对应指令。
如图4所示,在本实施例中,所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程步骤包括:
步骤S21,通过linux提供的读写函数(write、read)获取相应的字符流;
步骤S22,当第二线程在字符流中读取到单行命令字符串时,获取命令字符串对应指令的指令前缀,检查是否接收到对应指令前缀的指令结果;
步骤S23,响应于接收到对应指令前缀的指令结果时,将接收的指令结果反馈给所述主进程。
如图5所示,在本实施例中,所述设置每个指令的结果等待时长步骤,包括:
步骤S31,设置每个指令的条件变量的最大阻塞时长作为每个指令的结果等待时长;
步骤S32,在目标指令的结果等待时长内进行下一指令阻塞,等待目标指令的条件变量释放。
上述linux通用字符设备处理方法中,提供了在linux下通用字符设备处理方式,减少了适配不同模组、不同协议之间导致的业务冗余开发时间,减少了适配性工作量,提升了适配效率。
应该理解的是,虽然图2-图5的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2-图5中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图6所示,提供了一种linux通用字符设备处理装置10,包括:主进程管理模块1、第一线程管理模块2、第二线程管理模块3、第三线程管理模块4。
所述主进程管理模块1用于创建主进程,控制定时器初始化、zmq消息及消息队列初始化、完成模组适配层的功能函数注册、根据消息队列组建状态机来处理业务流程。
所述第一线程管理模块2用于响应于完成模组适配层的功能函数注册后,所述主进程创建第一线程,所述第一线程实现串口设备的初始化后监听设备文件是否可用,若是则创建第二线程执行对应指令并持续判断第二线程的状态,当第二线程异常时关闭第二线程并生成新的第二线程。
所述第二线程管理模块3用于控制所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程,解析获取指令结果的前缀并与全局链表上的指令前缀比对,若相同则将指令结果挂载到全局链表上,同时释放条件变量并向所述第一线程反馈第二线程正常。
所述第三线程管理模块4用于响应于完成模组适配层的功能函数注册后,所述主进程创建第三线程,所述第三线程构建一个指令执行队列并根据指令执行队列顺序依次将指令挂载到全局链表上,同时设置每个指令的结果等待时长,若超出结果等待时长未检测到指令结果时向所述第一线程反馈第二线程异常,若在结果等待时长内检测到指令结果时释放条件变量结束第二线程。
在本实施例中,linux通用字符设备处理装置10还包括第四线程管理模块5。在所述主进程根据消息队列组建状态机来处理业务流时,还包括所述主进程创建第四线程。第四线程管理模块5控制所述第四线程用于管理队列并与所述第三线程交互,当监听到入队消息时将指令进行入队,当接收到所述第二线程反馈的指令结果时,将对应指令结果的指令从队列中出队。
在本实施例中,linux通用字符设备处理装置10还包括副进程管理模块6。在所述主进程根据消息队列组建状态机来处理业务流时,还包括:创建副进程。
副进程管理模块6用于在zmq消息初始化后,持续读取标准输入字符获取输入的指令;响应于当监听到指令时,获取命令字符串;所述副进程将命令字符串通过zmq消息发送给主进程;所述主进程将接收到zmq消息通过消息队列发送给第四线程进行入队。
在本实施例中,所述副进程创建while(1)函数持续读取标准输入字符获取输入的指令;
响应于当监听到指令时,通过执行回调函数获取命令字符串;
当返回的命令字符串个数不为空时,所述副进程将获得的命令字符串通过预设的网址、端口携带对应的指令前缀,以消息形式发送给主进程;
所述主进程将接收到入队、出队消息通过消息队列发送给第四线程进行入队。
在本实施例中,所述第一线程创建第二线程执行对应指令并持续判断第二线程的状态时,包括:
实时监测所述第二线程执行对应指令的执行反馈结果,若反馈结果为第二线程正常则结束;
实时监测所述第三线程遍历指令执行队列中每一指令的执行反馈结果,若反馈结果为对应指令的第二线程正常则结束,若反馈结果为对应指令的第二线程异常则关闭第二线程并生成新的第二线程重新执行对应指令。
在本实施例中,所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程步骤包括:
通过linux提供的读写函数(write、read)获取相应的字符流;
当第二线程在字符流中读取到单行命令字符串时,获取命令字符串对应指令的指令前缀,检查是否接收到对应指令前缀的指令结果;
响应于接收到对应指令前缀的指令结果时,将接收的指令结果反馈给所述主进程。
在本实施例中,所述设置每个指令的结果等待时长步骤,包括:
设置每个指令的条件变量的最大阻塞时长作为每个指令的结果等待时长;
在目标指令的结果等待时长内进行下一指令阻塞,等待目标指令的条件变量释放。
上述linux通用字符设备处理装置中,提供了在linux下通用字符设备处理方式,减少了适配不同模组、不同协议之间导致的业务冗余开发时间,减少了适配性工作量,提升了适配效率。
关于linux通用字符设备处理装置的具体限定可以参见上文中对于linux通用字符设备处理方法的限定,在此不再赘述。上述linux通用字符设备处理装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图7所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储linux通用字符设备处理数据。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种linux通用字符设备处理方法。
本领域技术人员可以理解,图7中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:
创建主进程,控制定时器初始化、zmq消息及消息队列初始化、完成模组适配层的功能函数注册、根据消息队列组建状态机来处理业务流;
响应于完成模组适配层的功能函数注册后,所述主进程创建第一线程,所述第一线程实现串口设备的初始化后监听设备文件是否可用,若是则创建第二线程执行对应指令并持续判断第二线程的状态,当第二线程异常时关闭第二线程并生成新的第二线程;
所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程,解析获取指令结果的前缀并与全局链表上的指令前缀比对,若相同则将指令结果挂载到全局链表上,同时释放条件变量并向所述第一线程反馈第二线程正常;
响应于完成模组适配层的功能函数注册后,所述主进程创建第三线程,所述第三线程构建一个指令执行队列并根据指令执行队列顺序依次将指令挂载到全局链表上,同时设置每个指令的结果等待时长,若超出结果等待时长未检测到指令结果时向所述第一线程反馈第二线程异常,若在结果等待时长内检测到指令结果时释放条件变量结束第二线程。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
在所述主进程根据消息队列组建状态机来处理业务流时,还包括:
所述主进程创建第四线程,所述第四线程用于管理队列并与所述第三线程交互,当监听到入队消息时将指令进行入队,当接收到所述第二线程反馈的指令结果时,将对应指令结果的指令从队列中出队。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
在所述主进程根据消息队列组建状态机来处理业务流时,还包括:
创建副进程,在zmq消息初始化后,持续读取标准输入字符获取输入的指令;
响应于当监听到指令时,获取命令字符串;
所述副进程将命令字符串通过zmq消息发送给主进程;
所述主进程将接收到zmq消息通过消息队列发送给第四线程进行入队。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
所述副进程创建while(1)函数持续读取标准输入字符获取输入的指令;
响应于当监听到指令时,通过执行回调函数获取命令字符串;
当返回的命令字符串个数不为空时,所述副进程将获得的命令字符串通过预设的网址、端口携带对应的指令前缀,以消息形式发送给主进程;
所述主进程将接收到入队消息通过消息队列发送给第四线程进行入队。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
所述第一线程创建第二线程执行对应指令并持续判断第二线程的状态时,包括:
实时监测所述第二线程执行对应指令的执行反馈结果,若反馈结果为第二线程正常则结束;
实时监测所述第三线程遍历指令执行队列中每一指令的执行反馈结果,若反馈结果为对应指令的第二线程正常则结束,若反馈结果为对应指令的第二线程异常则关闭第二线程并生成新的第二线程重新执行对应指令。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程步骤包括:
通过linux提供的读写函数(write、read)获取相应的字符流;
当第二线程在字符流中读取到单行命令字符串时,获取命令字符串对应指令的指令前缀,检查是否接收到对应指令前缀的指令结果;
响应于接收到对应指令前缀的指令结果时,将接收的指令结果反馈给所述主进程。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
所述设置每个指令的结果等待时长步骤,包括:
设置每个指令的条件变量的最大阻塞时长作为每个指令的结果等待时长;
在目标指令的结果等待时长内进行下一指令阻塞,等待目标指令的条件变量释放。
关于处理器执行计算机程序时实现步骤的具体限定可以参见上文中对于linux通用字符设备处理的方法的限定,在此不再赘述。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
创建主进程,控制定时器初始化、zmq消息及消息队列初始化、完成模组适配层的功能函数注册、根据消息队列组建状态机来处理业务流;
响应于完成模组适配层的功能函数注册后,所述主进程创建第一线程,所述第一线程实现串口设备的初始化后监听设备文件是否可用,若是则创建第二线程执行对应指令并持续判断第二线程的状态,当第二线程异常时关闭第二线程并生成新的第二线程;
所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程,解析获取指令结果的前缀并与全局链表上的指令前缀比对,若相同则将指令结果挂载到全局链表上,同时释放条件变量并向所述第一线程反馈第二线程正常;
响应于完成模组适配层的功能函数注册后,所述主进程创建第三线程,所述第三线程构建一个指令执行队列并根据指令执行队列顺序依次将指令挂载到全局链表上,同时设置每个指令的结果等待时长,若超出结果等待时长未检测到指令结果时向所述第一线程反馈第二线程异常,若在结果等待时长内检测到指令结果时释放条件变量结束第二线程。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
在所述主进程根据消息队列组建状态机来处理业务流时,还包括:
所述主进程创建第四线程,所述第四线程用于管理队列并与所述第三线程交互,当监听到入队消息时将指令进行入队,当接收到所述第二线程反馈的指令结果时,将对应指令结果的指令从队列中出队。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
在所述主进程根据消息队列组建状态机来处理业务流时,还包括:
创建副进程,在zmq消息初始化后,持续读取标准输入字符获取输入的指令;
响应于当监听到指令时,获取命令字符串;
所述副进程将命令字符串通过zmq消息发送给主进程;
所述主进程将接收到zmq消息通过消息队列发送给第四线程进行入队。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
所述副进程创建while(1)函数持续读取标准输入字符获取输入的指令;
响应于当监听到指令时,通过执行回调函数获取命令字符串;
当返回的命令字符串个数不为空时,所述副进程将获得的命令字符串通过预设的网址、端口携带对应的指令前缀,以消息形式发送给主进程;
所述主进程将接收到zmq消息通过消息队列发送给第四线程进行入队。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
所述第一线程创建第二线程执行对应指令并持续判断第二线程的状态时,包括:
实时监测所述第二线程执行对应指令的执行反馈结果,若反馈结果为第二线程正常则结束;
实时监测所述第三线程遍历指令执行队列中每一指令的执行反馈结果,若反馈结果为对应指令的第二线程正常则结束,若反馈结果为对应指令的第二线程异常则关闭第二线程并生成新的第二线程重新执行对应指令。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程步骤包括:
通过linux提供的读写函数(write、read)获取相应的字符流;
当第二线程在字符流中读取到单行命令字符串时,获取命令字符串对应指令的指令前缀,检查是否接收到对应指令前缀的指令结果;
响应于接收到对应指令前缀的指令结果时,将接收的指令结果反馈给所述主进程。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
所述设置每个指令的结果等待时长步骤,包括:
设置每个指令的条件变量的最大阻塞时长作为每个指令的结果等待时长;
在目标指令的结果等待时长内进行下一指令阻塞,等待目标指令的条件变量释放。
关于计算机程序被处理器执行时实现步骤的具体限定可以参见上文中对于linux通用字符设备处理的方法的限定,在此不再赘述。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink) DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

Claims (8)

1.一种linux通用字符设备处理方法,其特征在于,包括:
创建主进程,完成模组适配层的功能函数注册;
响应于完成模组适配层的功能函数注册后,所述主进程创建第一线程,所述第一线程实现串口设备的初始化后监听设备文件是否可用,若是则创建第二线程;
所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程,解析获取指令结果的前缀并与全局链表上的指令前缀比对,若相同则将指令结果挂载到全局链表上,同时释放条件变量并向所述第一线程反馈第二线程正常;
响应于完成模组适配层的功能函数注册后,所述主进程创建第三线程,所述第三线程构建一个指令执行队列并根据指令执行队列顺序依次将指令挂载到全局链表上,同时设置每个指令的结果等待时长,若超出结果等待时长未检测到指令结果时向所述第一线程反馈第二线程异常,若在结果等待时长内检测到指令结果时释放条件变量结束第二线程;
其中,在所述创建主进程时,还包括:
所述主进程根据消息队列组建状态机来处理业务流;
所述主进程创建第四线程,所述第四线程用于管理队列并与所述第三线程交互,当监听到消息时将指令进行入队,当接收到所述第二线程反馈的指令结果时,将对应指令结果的指令从队列中出队;
其中,在所述主进程根据消息队列组建状态机来处理业务流时,还包括:
创建副进程,在zmq消息初始化后,持续读取标准输入字符获取输入的指令;
响应于当监听到指令时,获取命令字符串;
所述副进程将命令字符串通过zmq消息发送给主进程;
所述主进程将接收到zmq消息发送给第四线程进行入队。
2.根据权利要求1所述的linux通用字符设备处理方法,其特征在于,
所述副进程创建while(1)函数持续读取标准输入字符获取输入的指令;
响应于当监听到指令时,通过执行回调函数获取命令字符串;
当返回的命令字符串个数不为空时,所述副进程将获得的命令字符串通过预设的网址、端口携带对应的指令前缀,以消息形式发送给主进程;
所述主进程将接收到消息通过消息队列发送给第四线程进行入队。
3.根据权利要求1所述的linux通用字符设备处理方法,其特征在于,所述第一线程在创建第二线程之后还包括持续判断第二线程的状态;其中持续判断第二线程的状态包括:
实时监测所述第二线程执行对应指令的执行反馈结果,若反馈结果为第二线程正常则结束;
实时监测所述第三线程遍历指令执行队列中每一指令的执行反馈结果,若反馈结果为对应指令的第二线程正常则结束,若反馈结果为对应指令的第二线程异常则关闭第二线程并生成新的第二线程重新执行对应指令。
4.根据权利要求1所述的linux通用字符设备处理方法,其特征在于,所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程步骤包括:
通过linux提供的读写函数获取相应的字符流;
当第二线程在字符流中读取到单行命令字符串时,获取命令字符串对应指令的指令前缀,检查是否接收到对应指令前缀的指令结果;
响应于接收到对应指令前缀的指令结果时,将接收的指令结果反馈给所述主进程。
5.根据权利要求1所述的linux通用字符设备处理方法,其特征在于,所述设置每个指令的结果等待时长步骤,包括:
设置每个指令的条件变量的最大阻塞时长作为每个指令的结果等待时长;
在目标指令的结果等待时长内进行下一指令阻塞,等待目标指令的条件变量释放。
6.一种linux通用字符设备处理装置,其特征在于,所述装置包括:
主进程管理模块,用于创建主进程,完成模组适配层的功能函数注册;
第一线程管理模块,用于响应于完成模组适配层的功能函数注册后,所述主进程创建第一线程,所述第一线程实现串口设备的初始化后监听设备文件是否可用,若是则创建第二线程;
第二线程管理模块,用于控制所述第二线程轮询设备文件并获取字符流,将接收的字符流中的指令结果反馈给所述主进程,解析获取指令结果的前缀并与全局链表上的指令前缀比对,若相同则将指令结果挂载到全局链表上,同时释放条件变量并向所述第一线程反馈第二线程正常;
第三线程管理模块,用于响应于完成模组适配层的功能函数注册后,所述主进程创建第三线程,所述第三线程构建一个指令执行队列并根据指令执行队列顺序依次将指令挂载到全局链表上,同时设置每个指令的结果等待时长,若超出结果等待时长未检测到指令结果时向所述第一线程反馈第二线程异常,若在结果等待时长内检测到指令结果时释放条件变量结束第二线程;
第四线程管理模块,用于在所述主进程根据消息队列组建状态机来处理业务流时创建第四线程;控制所述第四线程用于管理队列并与所述第三线程交互,当监听到消息时将指令进行入队,当接收到所述第二线程反馈的指令结果时,将对应指令结果的指令从队列中出队;
副进程管理模块,用于所述主进程根据消息队列组建状态机来处理业务流时创建副进程;用于在zmq消息初始化后,持续读取标准输入字符获取输入的指令;响应于当监听到指令时,获取命令字符串;所述副进程将命令字符串通过zmq消息发送给主进程;所述主进程将接收到zmq消息发送给第四线程进行入队。
7.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至5中任一项所述方法的步骤。
8.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至5中任一项所述的方法的步骤。
CN202310774133.3A 2023-06-28 2023-06-28 linux通用字符设备处理方法、装置、设备和介质 Active CN116501476B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310774133.3A CN116501476B (zh) 2023-06-28 2023-06-28 linux通用字符设备处理方法、装置、设备和介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310774133.3A CN116501476B (zh) 2023-06-28 2023-06-28 linux通用字符设备处理方法、装置、设备和介质

Publications (2)

Publication Number Publication Date
CN116501476A CN116501476A (zh) 2023-07-28
CN116501476B true CN116501476B (zh) 2023-09-12

Family

ID=87321655

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310774133.3A Active CN116501476B (zh) 2023-06-28 2023-06-28 linux通用字符设备处理方法、装置、设备和介质

Country Status (1)

Country Link
CN (1) CN116501476B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117271144B (zh) * 2023-11-22 2024-04-23 荣耀终端有限公司 一种线程的处理方法和电子设备

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102122255A (zh) * 2011-03-15 2011-07-13 合肥华云通信技术有限公司 利用虚拟字符设备和genetlink实现Linux系统中进程间通信的方法
CN102567111A (zh) * 2011-12-23 2012-07-11 深圳市融创天下科技股份有限公司 一种异步过程调用的方法、系统和终端设备
CN103593239A (zh) * 2013-10-28 2014-02-19 大唐移动通信设备有限公司 Linux系统中应用进程命令处理的方法及装置
CN109992352A (zh) * 2017-12-29 2019-07-09 迈普通信技术股份有限公司 数据传输方法、装置、电子设备及可读取存储介质
CN113315736A (zh) * 2020-02-26 2021-08-27 成都鼎桥通信技术有限公司 一种业务进程间的数据同步方法和装置
CN113608790A (zh) * 2021-07-14 2021-11-05 深圳市科陆电子科技股份有限公司 基于Linux系统的串口设备自适配管理方法、系统及存储介质
CN115098283A (zh) * 2022-07-31 2022-09-23 苏州浪潮智能科技有限公司 一种ipc消息处理方法、系统、存储介质及设备
CN115562728A (zh) * 2022-10-28 2023-01-03 艾体威尔电子技术(北京)有限公司 一种at指令的解析方法、终端及计算机可读介质
CN116055578A (zh) * 2023-03-06 2023-05-02 北京朝歌数码科技股份有限公司 一种轻量级的at协议栈、通信方法和系统

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106293979B (zh) * 2015-06-25 2019-11-15 伊姆西公司 检测进程无响应的方法和装置

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102122255A (zh) * 2011-03-15 2011-07-13 合肥华云通信技术有限公司 利用虚拟字符设备和genetlink实现Linux系统中进程间通信的方法
CN102567111A (zh) * 2011-12-23 2012-07-11 深圳市融创天下科技股份有限公司 一种异步过程调用的方法、系统和终端设备
CN103593239A (zh) * 2013-10-28 2014-02-19 大唐移动通信设备有限公司 Linux系统中应用进程命令处理的方法及装置
CN109992352A (zh) * 2017-12-29 2019-07-09 迈普通信技术股份有限公司 数据传输方法、装置、电子设备及可读取存储介质
CN113315736A (zh) * 2020-02-26 2021-08-27 成都鼎桥通信技术有限公司 一种业务进程间的数据同步方法和装置
CN113608790A (zh) * 2021-07-14 2021-11-05 深圳市科陆电子科技股份有限公司 基于Linux系统的串口设备自适配管理方法、系统及存储介质
CN115098283A (zh) * 2022-07-31 2022-09-23 苏州浪潮智能科技有限公司 一种ipc消息处理方法、系统、存储介质及设备
CN115562728A (zh) * 2022-10-28 2023-01-03 艾体威尔电子技术(北京)有限公司 一种at指令的解析方法、终端及计算机可读介质
CN116055578A (zh) * 2023-03-06 2023-05-02 北京朝歌数码科技股份有限公司 一种轻量级的at协议栈、通信方法和系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于可移植Linux的火灾报警控制器系统软件的设计与实现;杨巨;《中国优秀硕士学位论文全文数据库 信息科技辑》;I140-860 *

Also Published As

Publication number Publication date
CN116501476A (zh) 2023-07-28

Similar Documents

Publication Publication Date Title
JP5519909B2 (ja) アプリケーション・プロセスにおいて内部イベントをリプレイするための非侵入的方法およびこの方法を実装するシステム
US8402443B2 (en) Method and system for automated analysis of the performance of remote method invocations in multi-tier applications using bytecode instrumentation
CN116501476B (zh) linux通用字符设备处理方法、装置、设备和介质
US20070242611A1 (en) Computer Hardware Fault Diagnosis
JP2008529112A (ja) アプリケーション・プロセス実行の範囲内での非決定論的オペレーションを管理、ロギング、またはリプレイするための予測方法
WO2021042840A1 (zh) 数据处理方法、装置、服务器和计算机可读存储介质
US10528414B2 (en) Centralized error handling in application specific integrated circuits
US20060167916A1 (en) Non-intrusive method for logging external events related to an application process, and a system implementing said method
EP3352415A1 (en) Smb service failure handling method, and storage device
US8806435B2 (en) Remote logging mechanism
US6868437B1 (en) System and method for interprocess communication of remote procedure call messages utilizing shared memory
CN110413398B (zh) 任务调度方法、装置、计算机设备和存储介质
JP2010092336A (ja) ストレージシステム及び通信方法
US20030154288A1 (en) Server-client system and data transfer method used in the same system
CN114911632B (zh) 一种进程间通信的控制方法和系统
US9189370B2 (en) Smart terminal fuzzing apparatus and method using multi-node structure
JP4415391B2 (ja) データをネットワークに送信する方法及び装置並びにデータをネットワークから受信する方法及び装置
CN113254062B (zh) 一种bmc参数配置及生效的方法、装置、设备和介质
US9563494B2 (en) Systems and methods for managing task watchdog status register entries
CN111447046A (zh) 业务数据传输方法、装置、设备和存储介质
Li et al. Design and validation of portable communication infrastructure for fault-tolerant cluster middleware
CN116302850B (zh) 一种Linux套接字连接事件监控方法及装置
CN117579700B (zh) 基于消息队列的通用型微服务处理方法、系统和设备
CN113162932B (zh) 一种基于套接字的异步i/o操作的方法和装置
CN113965561B (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
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right

Effective date of registration: 20240116

Address after: No. 13 Xingxiang Road, Zengjia Town, High tech Zone, Jiulongpo District, Chongqing, 400039

Patentee after: Chongqing Selis Phoenix Intelligent Innovation Technology Co.,Ltd.

Address before: 610095 No. 2901, floor 29, unit 1, building 1, No. 151, Tianfu Second Street, high tech Zone, China (Sichuan) pilot Free Trade Zone, Chengdu, Sichuan Province

Patentee before: Chengdu Thalys Technology Co.,Ltd.

TR01 Transfer of patent right