CN111679923A - 实时通信方法和系统 - Google Patents
实时通信方法和系统 Download PDFInfo
- Publication number
- CN111679923A CN111679923A CN202010529980.XA CN202010529980A CN111679923A CN 111679923 A CN111679923 A CN 111679923A CN 202010529980 A CN202010529980 A CN 202010529980A CN 111679923 A CN111679923 A CN 111679923A
- Authority
- CN
- China
- Prior art keywords
- positioning
- related data
- time
- real
- read
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/14—Handling requests for interconnection or transfer
- G06F13/20—Handling requests for interconnection or transfer for access to input/output bus
- G06F13/28—Handling requests for interconnection or transfer for access to input/output bus using burst mode transfer, e.g. direct memory access DMA, cycle steal
- G06F13/30—Handling requests for interconnection or transfer for access to input/output bus using burst mode transfer, e.g. direct memory access DMA, cycle steal with priority control
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/38—Information transfer, e.g. on bus
- G06F13/42—Bus transfer protocol, e.g. handshake; Synchronisation
- G06F13/4282—Bus transfer protocol, e.g. handshake; Synchronisation on a serial bus, e.g. I2C bus, SPI bus
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/545—Interprogram communication where tasks reside in different layers, e.g. user- and kernel-space
-
- Y—GENERAL 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
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE 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/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Abstract
本发明实施例提供实时通信方法和系统。该系统包括MCU、定位模块和IMU;MCU运行的操作系统为非实时操作系统;非实时操作系统包括内核空间和用户空间;内核空间中部署有内核驱动kenel;该方法包括:上电后,kenel启动定时器(用于每隔预设周期触发进入中断);每次进入中断后,kenel调用回调函数以记录时间戳和触发内核空间的实时读取线程;退出中断后,实时读取线程进行如下操作:读取外设设备的定位相关数据;其中,外设设备至少包括惯性测试单元;存储并通知定位进程读取标记时间戳后的定位相关数据。实时读取线程比定位进程优先级更高,且没有由用户空间切换到内核空间的过程,从而可以更稳定的周期读取IMU数据。
Description
技术领域
本发明涉及汽车电子技术领域,特别涉及实时通信方法和系统。
背景技术
当前T-box已开始支持给车辆提供高精度定位,需要使用加速度、角速度(可统称为惯性测试数据)、定位信息数据等进行综合运算得到车辆的高精度位置,以实现高精度定位。
定位信息数据一般由定位模块(例如GPS模块、北斗模块)一秒产生一次。惯性测试数据(可称为IMU数据)由惯性测试单元产生。
目前,请参见图1,T-box(Telematics BOX,远程信息处理器)一般包括两个MCU(Microcontroller Unit,微控制单元),其中一个MCU为主MCU运行非实时操作系统(例如Linux操作系统),另一个MCU为从MCU,运行实时操作系统。其中,主MCU上运行用户空间的定位进程(进行高精度定位的应用进程),从MCU上则不可运行该进程,从MCU主要用于接收、处理CAN报文。
由于高精度定位需要使用定位模块产生的原始数据(rawdata),而定位模块一次产生的定位信息数据的数据量可以超过1Kbytes/s,因此,当前主流将定位模块挂载在主MCU上,主MCU与定位模块之间采用串口通信方式通讯。至于IMU,则通过集成电路(I2C)总线与主MCU连接。
高精度定位要求使用时间间隔为20ms的IMU数据,以实时修正车辆的当前位置。这就意味着在实际应用场景下,需要短周期实时从IMU处读取IMU数据,一般读取周期要求为10ms或20ms。或者说,本次读取IMU数据的时刻与上一次读取IMU数据的时刻的时间间隔应小于20ms。
发明人发现:尽管Linux系统最小的定时间隔是10ms,但由于其是非实时操作系统,目前无法保证每隔10ms或20ms读取一次IMU数据。这是因为主MCU上的用户空间的定位进程采用app直接读取数据的方案来读取数据,该方案涉及两个阶段,分别包括:
一,主MCU读取IMU数据阶段:
定位进程向主MCU发起读请求,主MCU的Linux系统由用户空间切换到内核空间,然后内核驱动(kenel)从外设(也即IMU单元)读取IMU数据至存储空间。
二,定位进程从存储空间读取IMU数据:应用层读取IMU数据也要经过内核层。
在第一阶段中,根据调度机制,在用户空间和内核空间来回切换时可能会被其他线程或进程抢走MCU,导致从外设读取IMU数据的延时不可控,读取IMU数据的周期也随之不可控。
发明内容
有鉴于此,本发明实施例提供实时通信方法和系统,以实现以相对稳定的周期读取IMU数据。
为实现上述目的,本发明实施例提供如下技术方案:
一种实时通信方法,基于实时通信系统,包括微控制单元MCU、定位模块和惯性测试单元IMU;所述MCU运行的操作系统为非实时操作系统;所述非实时操作系统包括内核空间和用户空间;内核空间中部署有内核驱动kenel;
所述方法包括:
上电后,所述内核空间中的内核驱动kenel启动定时器;所述定时器用于每隔预设周期触发进入中断;
每一次进入所述中断后,所述kenel调用回调函数以记录时间戳和触发内核空间的实时读取线程;所述实时读取线程的优先级高于所述用户空间的定位进程;
退出中断后,被触发的所述实时读取线程进行如下操作:
读取外设设备产生的定位相关数据;其中,所述外设设备至少包括所述惯性测试单元;所读取的定位相关数据至少包括IMU数据;所述时间戳用于标记读取的定位相关数据;
存储标记时间戳后的定位相关数据;
通知所述定位进程对所述标记时间戳后的定位相关数据进行读取。
可选的,所述存储标记时间戳后的定位相关数据包括:将所述标记时间戳后的定位相关数据存至内存映射mmap共享内存;所述mmap共享内存具有读取指针变量read_index和写入指针变量write_index;所述read_index用于指示上一次读取的结束位置,由所述定位进程根据本次所读取的标记时间戳后的定位相关数据的长度进行更新;所述write_index用于指示上一次写入的结束位置;根据所述标记时间戳后的定位相关数据的长度,更新所述mmap共享内存的write_index。
可选的,所述将所述标记时间戳后的定位相关数据存至mmap共享内存包括:将当前的write_index和所述标记时间戳后的定位相关数据的长度相加,得到相加结果;若所述相加结果小于等于所述mmap共享内存的最大值,从当前write_index所指示的位置处开始存储所述标记时间戳后的定位相关数据;若所述相加结果大于所述最大值,将所述相加结果减去所述最大值,得到差值;判断所述差值是否大于当前read_index;若是,丢弃所述标记时间戳后的定位相关数据;否则,从当前write_index所指示的位置处开始存储所述标记时间戳后的定位相关数据,并在到达所述mmap共享内存的尾部后,从所述mmap共享内存的头部开始存储所述标记时间戳后的定位相关数据中剩余的数据。
可选的,所述定位模块和所述IMU之间分别通过集成电路I2C总线挂载在所述MCU之上;所述外设设备还包括所述定位模块;所述定位相关数据还包括所述定位模块产生的定位信息数据;每次退出中断后,所述实时读取线程读取的定位信息数据的长度不大于预设长度。
可选的,所述读取外设设备产生的定位相关数据包括:准备读取定位相关数据的临时内存空间;配置直接存储器访问DMA控制信息;阻塞等待外设设备将定位相关数据通过DMA传输至所述临时内存空间,直至传输完毕。
可选的,所述定位模块还通过通用I/O端口向所述MCU输出秒脉冲信号;所述存储标记时间戳后的定位相关数据还包括:判断是否有秒脉冲信号,若有,将秒脉冲信号按时间先后顺序排序存至所述mmap共享内存;所述定位相关数据还包括秒脉冲信号。
一种实时通信系统,包括微控制单元MCU、定位模块和惯性测试单元IMU;所述MCU运行的操作系统为非实时操作系统;所述非实时操作系统包括内核空间和用户空间;内核空间中部署有内核驱动kenel;
所述kenel包括:
启动模块,用于上电后,启动定时器;所述定时器用于每隔预设周期触发进入中断;
调用模块,用于每一次进入所述中断后,所述kenel调用回调函数以记录时间戳和触发内核空间的实时读取线程;所述实时读取线程的优先级高于所述用户空间的定位进程;
其中,退出中断后,被触发的所述实时读取线程用于:
读取外设设备产生的定位相关数据;其中,所述外设设备至少包括所述惯性测试单元;所读取的定位相关数据至少包括IMU数据;所述时间戳用于标记读取的定位相关数据;
存储标记时间戳后的定位相关数据;
通知所述定位进程对所述标记时间戳后的定位相关数据进行读取。
可选的,在存储标记时间戳后的定位相关数据的方面,所述实时读取线程具体用于:将所述标记时间戳后的定位相关数据存至内存映射mmap共享内存;所述mmap共享内存具有读取指针变量read_index和写入指针变量write_index;所述read_index用于指示上一次读取的结束位置,由所述定位进程根据本次所读取的标记时间戳后的定位相关数据的长度进行更新;所述write_index用于指示上一次写入的结束位置;根据所述标记时间戳后的定位相关数据的长度,更新所述mmap共享内存的write_index。
可选的,在所述将所述标记时间戳后的定位相关数据存至mmap共享内存的方面,所述实时读取线程具体用于:将当前的write_index和所述标记时间戳后的定位相关数据的长度相加,得到相加结果;若所述相加结果小于等于mmap共享内存的最大值,从当前write_index所指示的位置处开始存储所述标记时间戳后的定位相关数据;若所述相加结果大于最大值,将所述相加结果减去所述最大值,得到差值;判断所述差值是否大于当前write_index;若是,丢弃所述标记时间戳后的定位相关数据;否则,从当前write_index所指示的位置处开始存储所述标记时间戳后的定位相关数据,并在到达所述mmap共享内存的尾部后,从所述mmap共享内存的头部开始存储所述标记时间戳后的定位相关数据中剩余的数据。
可选的,所述定位模块和IMU之间分别通过集成电路I2C总线挂载在MCU之上;所述外设设备还包括定位模块;所述定位相关数据包括所述定位模块产生的定位信息数据;每次退出中断后,实时读取线程读取的定位信息数据的长度不大于预设长度。
可见,本发明实施例用非实时操作系统,实现了实时读取。在本发明实施例中,每隔预设周期进入中断,进入中断后会记录时间戳和触发内核空间的实时读取线程,由实时读取线程读取外设设备的定位相关数据,并通知用户空间的定位进程去读取数据。与现有技术相比,在读取外设数据的过程中,本发明实施例不需要用户空间的定位进程发起读请求,不需要从用户空间切换至内核空间,直接在内核空间执行读取外设数据:每隔预设周期进入中断,中断退出后由内核空间的实时读取线程主动读取数据。内核空间的实时读取线程相较于用户空间的定位进程有更高的优先级,并且,没有由用户空间切换到内核空间的过程,因此不会被其他线程或进程抢走MCU,从而可以相对更稳定的周期读取IMU数据。
附图说明
图1为现有T-box的一种示例性结构;
图2为本发明实施例提供的T-box的一种示例性结构;
图3为本发明实施例提供的Linux系统的系统架构示意图;
图4为本发明实施例提供的T-box的另一种示例性结构;
图5为本发明实施例提供的实时通信方法的一种示例性流程;
图6为本发明实施例提供的使用DMA方式读取外设的数据的一种示例性流程;
图7为本发明实施例提供的读取写入的示例性流程;
图8为本发明实施例提供的各主要参与方的主要交互步骤;
图9为现有T-box的另一种示例性结构;
图10为本发明实施例提供的kenel结构示意图。
具体实施方式
本发明提供实时通信方法和系统,以实现以相对稳定的周期读取IMU数据。
上述实时通信系统具体为片上芯片系统(SOC),可应用于T-box中。
图2示出了包含上述实时通信系统的T-box的一种示例性结构,包括:
SOC和运行实时操作系统的MCU(从MCU),其中,SOC包括运行非实时操作系统的MCU(主MCU),以及外设设备(简称外设),包括定位模块(例如GPS模块、北斗模块)和惯性测试单元(IMU)。
主MCU上运行的非实时操作系统示例性的可为Linux系统。
下面简单介绍Linux系统,Linux系统的系统架构如图3所示,其可包括内核空间和用户空间,在用户空间可运行用户空间线程,在内核空间包括:系统调用接口(向用户空间的线程提供操作系统服务接口),内核驱动(kenel)和驱动层,kenel可通过驱动层访问外设(例如前述的定位模块、IMU)。
在Linux系统中,任务(线程)优先级排序为:硬中断>软中断>tasklist命令>实时线程/进程>普通线程/进程(也即用户空间进程)。
“Tasklist”命令用来显示运行在本地或远程计算机上的所有进程。
至于外设,请参见图4,IMU进一步可包括角速度传感器(例如陀螺仪)和加速度传感器。此外,外祋还可包括Codec,这是一种支持视频和音频压缩(CO)与解压缩(DEC)的编解码器。
角速度传感器、加速度传感器、Codec可通过I2C(集成电路)总线挂载在主MCU之上。
I2C总线是一种简单、双向二线制同步串行总线,只需要两根线即可在连接于总线上的器件之间传送信息,I2C常使用的通信速率为100kbit/s和400Kbit/s,一般I2C方案会在I2C上接一个或多个低速且数据量不大的设备。
至于定位模块,其可仍采用串口通信方式与主MCU通讯。或者,为了少占串口资源,可将其挂载在I2C总线上。
此外,定位模块还可通过通用I/O端口(gpio)向主MCU输出秒脉冲信号(PPS):定位模块有个gpio输出,连接到主MCU。
PPS由定位模块一秒产生一次。具体的,每隔一秒定位模块拉高一个脉冲,脉冲会让主MCU触发一次中断,这样主MCU就可以通过这个脉冲中断检测到PPS信号的发生,PPS主要用于系统校时。
此外,需要对codec进行说明的是,codec的应用场景如下:
在系统启动时对codec进行初始化,在使用语音过程中(如拨打电话过程中)调整增益(调整声音大小),codec的使用概率非常低,且数据量非常少,所以不会造成影响。另外,codec的操作直接在app程序里使用,有一定延时也不会对功能造成影响。
下面将基于以上描述中本发明涉及的共性方面,对本发明实施例做进一步详细说明。
图5示出了上述实时通信系统所执行的实时通信方法的一种示例性流程,包括:
S1:上电后,内核空间中的内核驱动kenel启动定时器。定时器用于每隔预设周期(定时间隔)触发进入中断。
在一个示例中,预设周期可依据定位进程所需的数据的时间精度而定。举例来讲,若定位进程所需的时间精度是20ms,可设计预设周期小于等于20ms,例如10ms。
具体的,可利用Linux系统本身的tick机制设计定时器(timer)的定时间隔。
Linux系统以tick为单位,默认tick周期为10ms。tick是分时操作系统的基本组成单位,Linux每隔一个tick时间检查一次是否要调度,还检查是否有到期的定时器。由于默认tick为10ms,导致默认Linux的定时器精度(最小的定时间隔)是10ms。
S2:每一次进入中断后,kenel调用回调函数以记录时间戳和触发内核空间的实时读取线程。
此场景相当于软中断。上述回调函数具体可为timer回调函数。
timer回调函数可用于记录时间戳和触发内核空间的实时读取线程。中断后,根据Linux系统的机制,被触发的实时读取线程将得以执行。
实时读取线程被设计为读取外设的定位相关数据等操作。实时读取线程的优先级高于用户空间的定位进程。
实际上,内核空间有一些默认任务线程在运行着,较通用的方法是把需要执行的任务挂到这些任务线程上,任务线程则执行任务,但这些任务线程的优先级比较低。为了增强读取I2C数据的实时性,本实施例创建了一个内核线程,并把该内核线程设置为实时线程。在一个示例中,可将该内核线程的优先级调至实时线程中的最高级。
上述内核线程即为实时读取线程。创建的实时读取线程可以做到在硬中断、软中断、tasklist结束后马上被调度到(依照Linux系统选择执行线程的原理,在硬中断、软中断、tasklist结束后,若有实时线程就会选择实时线程执行)。
Timer和实时读取线程都属于knenel的一部分。
这样,在退出中断后,被触发的实时读取线程就可被执行了,其所进行的操作(S3-S6)如下:
S3:读取外设设备产生的定位相关数据。
具体的,外设设备至少包括惯性测试单元,所读取的定位相关数据至少包括IMU数据。
在本发明其他实施例中,上述定位相关数据还包括定位模块产生的定位信息数据。由于定位信息数据一秒产生一次,每次产生的数据量可能几百字节(bytes)甚至超过1kbytes(根据卫星数不同,数据大小是变化的),所以可设计为分批次读取定位信息数据。也即,每次退出中断后,实时读取线程读取的定位信息数据的长度不大于预设长度。
预设长度示例性的可为80字节。
具体的,在读取定位信息数据前,先判断有效数据长度(可通过读取定位模块寄存器的值判断),分次读取,每次只读80字节,定时器多次触发,才可将定位信息数据读完,其目的是减少单次读取的数据量,从而减少实时读取线程的运行时间,让其它线程不至于阻塞。
在一个示例中,可使用DMA(Direct Memory Access,直接存储器访问)方式读取外设的数据,其优点是外设可不通过CPU(MCU)而直接与系统内存交换数据,从而可以释放CPU,在传输数据的同时让CPU去做其它任务,该技术比较成熟,请参见图6,简单介绍其过程包括:
S31:准备读取定位相关数据的临时内存空间。
S32:配置DMA控制信息;
具体的,可配置外设设备地址,以及,临时内存空间的地址。
前述提及,读取定位信息数据可分次读取,每次读取80字节。在实现时,可配置向定位模块发送的控制信息中包括读取长度为80字节和临时内存空间的地址。
S33:阻塞等待。
在阻塞中,由于不需要MCU参与,MCU可切换执行其它线程。
S34:外设设备将定位相关数据通过DMA传输至临时内存空间,直至传输完毕。
DMA传输完毕后会产生传输完毕的中断(硬件实现的),中断结束后就会继续往下执行。
S4:进行预处理。
在一个示例中,预处理可包括:使用时间戳标记读取的定位相关数据。
标记了时间戳,后续用户空间的定位进程就可以按时间顺序读取。
预处理可包括:对传感器数据进行处理,例如,将IMU数据处理成定位进程所需要的角速度数据和加速度数据。
S5:存储预处理后的(标记时间戳后的)定位相关数据;
在一个示例中,为了提高效率,可将标记时间戳后的定位相关数据存至mmap(内存映射)共享内存;内核空间和用户空间中的线程或进程均可直接访问mmap共享内存中的数据,这样,后续用户空间的定位进程可直接从mmap共享内存中读取数据。
需要说明的是,一般情况下,Linux系统中内核空间与用户空间互传数据需要进行一次内存拷贝,把数据从内核拷贝到用户空间,或者反之。
mmap的具体原理为:内核申请一块内存,内核就可以访问这块内存了,利用Linux的mmap机制把这块内存地址转换为用户空间线程或进程可以访问的地址,用户空间线程或进程就可以通过这个转换后的地址直接访问内核数据了。
而如果不用mmap机制,那么每次用户空间线程或进程从内核取数据相当于把数据从内核的buf(某一块物理内存地址)搬移到用户空间线程或进程的buf(另一块物理内存地址),此时就需要MCU参与进行数据拷贝了。
因此,使用mmap机制的好处是减少提及的内存拷贝,提高效率。此外,考虑到用户空间的定位进程在某些极端情况下会隔很久才能执行到,所以对mmap共享内存的大小设计为最大可以存10秒的数据,以足够缓存使用。另外,可设计当mmap共享内存存满后再从头开始存放。
此外,前述提及了,定位模块还通过通用I/O端口每隔一秒向MCU输出PPS信号。
因此,定位相关数据还包括秒脉冲信号。在存储定位相关数据时,还可判断是否有秒脉冲信号,若有,将秒脉冲信号按时间先后顺序排序存至mmap共享内存。
综上,内核读取、存储定位相关数据的特点包括:
1)读取IMU数据,每次触发(10ms)都会读。
2)读取定位模块产生的定位信息数据。由于定位信息数据一秒产生一次,一次可能几百bytes甚至超过1kbytes,所以在读取定位信息数据前,可先判断有效数据长度,并分次读取,例如每次只读80bytes,分多次timer触发把数据读完,目的是减少读取数据数量,从而减少实时高优先级线程运行时间,让其它线程不至于阻塞。
3)对于PPS信号,是靠定位模块的脉冲触发中断记录事件发生,并记录时间戳,将其存储在临时内存空间中。
在实时读取线程向mmap共享内存存储数据之前,会判断是否有PPS信号,如果有,则把PPS信号和其他定位相关数据按时间戳的先后顺序排序放到mmap共享内存。
S6:通知用户空间的定位进程对标记时间戳后的定位相关数据进行读取。
在一个示例中,若将标记时间戳后的定位相关数据存至mmap共享内存,定位进程可直接访问mmap共享内存,得到标记时间戳后的定位相关数据。
可见,本发明实施例用非实时操作系统,实现了实时读取。在本发明实施例中,每隔预设周期进入中断,进入中断后会记录时间戳和触发内核空间的实时读取线程,由实时读取线程读取外设设备的定位相关数据并标记时间戳,并通知用户空间的定位进程去读取标记时间戳后的定位相关数据。与现有技术相比,在读取外设数据的过程中,本发明实施例不需要用户空间的定位进程发起读请求,不需要从用户空间切换至内核空间,直接在内核空间执行读取外设数据:每隔预设周期进入中断,中断退出后由内核空间的实时读取线程主动读取数据。内核空间的实时读取线程相较于用户空间的定位进程有更高的优先级,并且,没有由用户空间切换到内核空间的过程,因此不会被其他线程或进程抢走MCU,从而可以相对更稳定的周期读取IMU数据。
并且,本发明实施例实现了在不更改内核I2C架构(Linux内核对I2C的操作有一个公共层的抽象,属于代码公共部分,操作I2C的操作基本都基于此抽象基础之上进行)基础上,实现在内核中进行I2C外设设备的数据的读取。
前述提及了,使用mmap共享内存存储定位相关数据。但是使用mmap需要控制内存数据访问的风险性,比如内核在写数据时,用户空间直接去读数据就会出问题。
在本实施例中,可采用标志位来控制内存数据访问的风险,例如可为mmap共享内存定义读取指针变量(read_index)和写入指针变量(write_index)。read_index用于指示上一次读取的结束位置,write_index用于指示上一次写入的结束位置。read_index由用户空间的定位程序更新,而write_index由实时读取线程更新。
当内核将标记时间戳后的定位相关数据存至内存映射mmap共享内存后,实时读取线程会根据标记时间戳后的定位相关数据的长度,更新write_index,并通知用户空间的定位进程去读取数据。
定位进程在读取数据后,根据本次所读取的标记时间戳后的定位相关数据的长度对read_index进行更新。
具体的,mmap共享内存使用约定好的结构体(用于定义一段数据内存里各个字段表示的含义)做映射,结构体中含变量write_index和read_index。
请参见图7,下面介绍更详细的读取写入过程:
S71:将write_index和标记时间戳后的定位相关数据的长度相加,得到相加结果;
举例来讲,假定write_index=1024,标记时间戳后的定位相关数据(新定位相关数据)的长度为512,则二者相加结果为1536。
S72:若相加结果小于等于mmap共享内存的最大值,从当前write_index所指示的位置处开始存储标记时间戳后的定位相关数据。
仍沿用前例,假定mmap共享内存的最大值为2048,相加结果为1536小于2048,说明mmap共享内存的可写入空间充裕,从而可直接从write_index所指示的位置处开始存储标记时间戳后的定位相关数据。
当然,存储完后,更新write_index的值。
S73:若相加结果大于最大值,将相加结果减去最大值,得到差值。
举例来讲,假定mmap共享内存的最大值为1280,小于上述相加结果1536,则使用1536-1280=256。
因为设计当mmap共享内存存满后再从头(从0)开始存放,达到模拟循环buffer效果。这里的差值表征在mmap共享内存存满后,若从头开始存放,仍需要多少存储空间。
S74:判断差值是否大于当前read_index;若是,进入S75,否则,进入S76。
write_index与read_index之间的数据为未被定位进程读取的数据。
若差值大于当前的read_index,说明若从头开始存放将覆盖未被读取的数据,而若差值小于等于当前的read_index,说明若从头开始存放,并不会覆盖未被读取的数据。
S75:丢弃标记时间戳后的定位相关数据。
S76:从当前write_index所指示的位置处开始存储标记时间戳后的定位相关数据,并在到达mmap共享内存的尾部后,从mmap共享内存的头部开始存储标记时间戳后的定位相关数据中剩余的数据。
当然,存储完后,更新write_index的值。
而用户空间的定位进程在读取数据时,会判断当前可以读取的数据,具体的:
如果write_index>read_index,则write_index与read_index的差值,为可读取的数据的长度。
如果write_index<read_index,则将write_index+缓冲区长度-read_index,得到的数值表示可读取的数据的长度。
此外,定位进程读走多少数据,read_index就相应增加多少,所以只有read _index和write_index之间数据才是有效的不可覆盖的。
利用本实施例所提供的方法,在对mmap共享内存进行读写访问时不需要进行加锁处理。
所谓的加锁处理指:假定A进程要访问数据C,需先加锁Alock再访问数据C,此时如果B进程想修改C时也去尝试加锁Alock,由于Alock已经被锁住,所以B进程会在Alock这里等待,一直到A进程释放Alock,B进程才能修改C。这样做的主要目的就是保定数据C在同一时间只有一个进程访问,以防止数据被某个进程写一半时又被其它进程读走,加锁处理是Linux的基础机制。
而本实施例使用write_index和read_index进行判断,防止数据覆盖,所以无需加锁,也不会造成数据读写不一致。这样,基于mmap机制再加上根据write_index和read_index的读写处理,以及,设计成当mmap共享内存存满后再从头开始存放,就形成一个类似环形缓冲的实现。
图8简单示出了各主要参与方的主要交互步骤:
步骤1,定时器每隔预设周期(例如10ms)触发进入中断。
步骤2,(省略了记录时间戳和触发实时读取线程),实时读取线程从外设设备处读取定位相关数据。
步骤3,实时读取线程将读取的定位相关数据进行存储(最终存储至mmap共享内存)。
步骤4,实时读取线程通知用户空间的定位进程读取数据。
步骤5,定位进程读取定位相关数据。
此外,前述介绍了,定位模块产生的定位信息数据可能因数据量大,而被分次读取(每次读取固定长度的数据块)、存储至mmap共享内存。
那么定位进程侧可将分次读取并存储至mmap共享内存的数据块组合成完整的定位信息数据。
具体实现时,定位信息数据的包头、包尾的格式及长度是固定的,可根据包头中有效数据的长度以及时间戳来组合出完整的定位信息数据。
需要说明的是,请参见图9,现有技术中,还可将IMU单元挂载在运行实时操作系统的从MCU上,从MCU与IMU单元之间通过I2C(集成电路)总线通讯,用于保证读取IMU数据的实时性。
将定位模块则挂载在主MCU上,主MCU与定位模块之间采用串口通信方式通讯。
但两个MCU通过串口或SPI通信,通信链路越长,其稳定性就越差。
而本发明实施例,无需两MCU通信相交定位相关数据,稳定性更高。
综上,本发明实施例具有如下特点:
节省soc管脚资源;
在不对Linux系统有大的改动情况下,实现在Linux系统上实时性读取数据,且不会造成其它任务阻塞;
减少内存在用户空间和内核空间拷贝,且做无锁处理,减少对cpu使用。
本发明还要求保护一种实时通信系统,以及包含该实时通信系统的T-box。
上述实时通信系统具体为片上芯片系统(SOC)。
图2示出了包含上述实时通信系统的T-box的一种示例性结构,包括:
SOC和运行实时操作系统的MCU(从MCU),其中,SOC包括运行非实时操作系统的MCU(主MCU),以及外设设备(简称外设),包括定位模块(例如GPS模块、北斗模块)和惯性测试单元(IMU)。
主MCU上运行的非实时操作系统示例性的可为Linux系统,其可包括内核空间和用户空间,在用户空间可运行用户空间线程,在内核空间包括:系统调用接口,内核驱动(kenel)和驱动层,kenel可通过驱动层访问外设(例如前述的定位模块、IMU)。
请参见图10,kenel包括:
启动模块1,用于上电后启动定时器;定时器用于每隔预设周期触发进入中断;
调用模块2,用于每一次进入中断后,调用回调函数以记录时间戳和触发内核空间的实时读取线程;实时读取线程的优先级是所有线程中优先级最高的;
其中,退出中断后,被触发的实时读取线程用于:
读取外设设备产生的定位相关数据;其中,外设设备至少包括惯性测试单元;所读取的定位相关数据至少包括IMU数据;时间戳用于标记读取的定位相关数据;
存储标记时间戳后的定位相关数据;
通知用户空间的标记时间戳后的定位进程对定位相关数据进行读取。
具体描述请参见本文前述记载,在此不作赘述。
在其他实施例中,在“存储标记时间戳后的定位相关数据”的方面,上述所有实施例中的实时读取线程可具体用于:
将标记时间戳后的定位相关数据存至内存映射mmap共享内存;mmap共享内存具有读取指针变量read_index和写入指针变量write_index;read_index用于指示上一次读取的结束位置,由定位进程根据本次所读取的标记时间戳后的定位相关数据的长度进行更新;write_index用于指示上一次写入的结束位置;
根据标记时间戳后的定位相关数据的长度,更新mmap共享内存的write_index。
具体描述请参见本文前述记载,在此不作赘述。
在其他实施例中,在“将标记时间戳后的定位相关数据存至mmap共享内存”的方面,上述所有实施例中的实时读取线程可具体用于:
将当前的write_index和标记时间戳后的定位相关数据的长度相加,得到相加结果;
若相加结果小于等于mmap共享内存的最大值,从当前write_index所指示的位置处开始存储标记时间戳后的定位相关数据;
若相加结果大于最大值,将相加结果减去最大值,得到差值;
判断差值是否大于当前write_index;若是,丢弃所述标记时间戳后的定位相关数据;
否则,从当前write_index所指示的位置处开始存储所述标记时间戳后的定位相关数据,并在到达mmap共享内存的尾部后,从mmap共享内存的头部开始存储所述标记时间戳后的定位相关数据中剩余的数据。
具体描述请参见本文前述记载,在此不作赘述。
在其他实施例中,上述所有实施例中的定位模块和IMU之间分别通过I2C总线挂载在MCU之上;外设设备包括定位模块;定位相关数据包括定位模块产生的定位信息数据;每次退出中断后,实时读取线程读取的定位信息数据的长度不大于预设长度。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及模型步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
结合本文中所公开的实施例描述的方法或模型的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、WD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (10)
1.一种实时通信方法,其特征在于,基于实时通信系统,包括微控制单元MCU、定位模块和惯性测试单元IMU;所述MCU运行的操作系统为非实时操作系统;所述非实时操作系统包括内核空间和用户空间;内核空间中部署有内核驱动kenel;
所述方法包括:
上电后,所述内核空间中的内核驱动kenel启动定时器;所述定时器用于每隔预设周期触发进入中断;
每一次进入所述中断后,所述kenel调用回调函数以记录时间戳和触发所述内核空间的实时读取线程;所述实时读取线程的优先级高于所述用户空间的定位进程;
退出中断后,被触发的所述实时读取线程进行如下操作:
读取外设设备产生的定位相关数据;其中,所述外设设备至少包括所述惯性测试单元;所读取的定位相关数据至少包括IMU数据;所述时间戳用于标记读取的定位相关数据;
存储标记时间戳后的定位相关数据;
通知所述定位进程对所述标记时间戳后的定位相关数据进行读取。
2.如权利要求1所述的方法,其特征在于,所述存储标记时间戳后的定位相关数据包括:
将所述标记时间戳后的定位相关数据存至内存映射mmap共享内存;所述mmap共享内存具有读取指针变量read_index和写入指针变量write_index;所述read_index用于指示上一次读取的结束位置,由所述定位进程根据本次所读取的标记时间戳后的定位相关数据的长度进行更新;所述write_index用于指示上一次写入的结束位置;
根据所述标记时间戳后的定位相关数据的长度,更新所述mmap共享内存的write_index。
3.如权利要求2所述的系统,其特征在于,所述将所述标记时间戳后的定位相关数据存至mmap共享内存包括:
将当前的write_index和所述标记时间戳后的定位相关数据的长度相加,得到相加结果;
若所述相加结果小于等于所述mmap共享内存的最大值,从当前write_index所指示的位置处开始存储所述标记时间戳后的定位相关数据;
若所述相加结果大于所述最大值,将所述相加结果减去所述最大值,得到差值;
判断所述差值是否大于当前read_index;若是,丢弃所述标记时间戳后的定位相关数据;
否则,从当前write_index所指示的位置处开始存储所述标记时间戳后的定位相关数据,并在到达所述mmap共享内存的尾部后,从所述mmap共享内存的头部开始存储所述标记时间戳后的定位相关数据中剩余的数据。
4.如权利要求1-3任一项所述的方法,其特征在于,所述定位模块和所述IMU之间分别通过集成电路I2C总线挂载在所述MCU之上;所述外设设备还包括所述定位模块;所述定位相关数据还包括所述定位模块产生的定位信息数据;
每次退出中断后,所述实时读取线程读取的定位信息数据的长度不大于预设长度。
5.如权利要求4所述的方法,其特征在于,
所述读取外设设备产生的定位相关数据包括:
准备读取定位相关数据的临时内存空间;
配置直接存储器访问DMA控制信息;
阻塞等待外设设备将定位相关数据通过DMA传输至所述临时内存空间,直至传输完毕。
6.如权利要求5所述的方法,其特征在于,所述定位模块还通过通用I/O端口向所述MCU输出秒脉冲信号;
所述存储标记时间戳后的定位相关数据还包括:
判断是否有秒脉冲信号,若有,将秒脉冲信号按时间先后顺序排序存至所述mmap共享内存;
所述定位相关数据还包括秒脉冲信号。
7.一种实时通信系统,其特征在于,包括微控制单元MCU、定位模块和惯性测试单元IMU;所述MCU运行的操作系统为非实时操作系统;所述非实时操作系统包括内核空间和用户空间;内核空间中部署有内核驱动kenel;
所述kenel包括:
启动模块,用于上电后,启动定时器;所述定时器用于每隔预设周期触发进入中断;
调用模块,用于每一次进入所述中断后,所述kenel调用回调函数以记录时间戳和触发所述内核空间的实时读取线程;所述实时读取线程的优先级高于所述用户空间的定位进程;
其中,退出中断后,被触发的所述实时读取线程用于:
读取外设设备产生的定位相关数据;其中,所述外设设备至少包括所述惯性测试单元;所读取的定位相关数据至少包括IMU数据;所述时间戳用于标记读取的定位相关数据;
存储标记时间戳后的定位相关数据;
通知所述定位进程对所述标记时间戳后的定位相关数据进行读取。
8.如权利要求7的系统,其特征在于,在存储标记时间戳后的定位相关数据的方面,所述实时读取线程具体用于:
将所述标记时间戳后的定位相关数据存至内存映射mmap共享内存;所述mmap共享内存具有读取指针变量read_index和写入指针变量write_index;所述read_index用于指示上一次读取的结束位置,由所述定位进程根据本次所读取的标记时间戳后的定位相关数据的长度进行更新;所述write_index用于指示上一次写入的结束位置;
根据所述标记时间戳后的定位相关数据的长度,更新所述mmap共享内存的write_index。
9.如权利要求8的系统,其特征在于,在所述将所述标记时间戳后的定位相关数据存至mmap共享内存的方面,所述实时读取线程具体用于:
将当前的write_index和所述标记时间戳后的定位相关数据的长度相加,得到相加结果;
若所述相加结果小于等于mmap共享内存的最大值,从当前write_index所指示的位置处开始存储所述标记时间戳后的定位相关数据;
若所述相加结果大于最大值,将所述相加结果减去所述最大值,得到差值;
判断所述差值是否大于当前write_index;若是,丢弃所述标记时间戳后的定位相关数据;
否则,从当前write_index所指示的位置处开始存储所述标记时间戳后的定位相关数据,并在到达所述mmap共享内存的尾部后,从所述mmap共享内存的头部开始存储所述标记时间戳后的定位相关数据中剩余的数据。
10.如权利要求7-9任一项的系统,其特征在于,所述定位模块和IMU之间分别通过集成电路I2C总线挂载在MCU之上;所述外设设备还包括定位模块;所述定位相关数据包括所述定位模块产生的定位信息数据;每次退出中断后,实时读取线程读取的定位信息数据的长度不大于预设长度。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010529980.XA CN111679923B (zh) | 2020-06-11 | 2020-06-11 | 实时通信方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010529980.XA CN111679923B (zh) | 2020-06-11 | 2020-06-11 | 实时通信方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111679923A true CN111679923A (zh) | 2020-09-18 |
CN111679923B CN111679923B (zh) | 2023-08-08 |
Family
ID=72454872
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010529980.XA Active CN111679923B (zh) | 2020-06-11 | 2020-06-11 | 实时通信方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111679923B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112631975A (zh) * | 2020-12-09 | 2021-04-09 | 珠海全志科技股份有限公司 | 基于Linux的SPI传输方法 |
CN112769861A (zh) * | 2021-01-25 | 2021-05-07 | 东方电气自动控制工程有限公司 | 一种电厂安全i区网络安全危急信号识别输出装置 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100070803A1 (en) * | 2008-09-07 | 2010-03-18 | Eads North America Defense Test And Services, Inc. | Sequencer and test system including the sequencer |
CN101894045A (zh) * | 2010-06-18 | 2010-11-24 | 阳坚 | 一种实时Linux操作系统 |
CN103942178A (zh) * | 2014-03-03 | 2014-07-23 | 浙江大学 | 多核处理器上实时操作系统与非实时操作系统之间的通信方法 |
WO2016004587A1 (zh) * | 2014-07-08 | 2016-01-14 | 北京航空航天大学 | 一种基于多核处理器架构的机器人混合系统应用框架 |
CN108170050A (zh) * | 2017-12-21 | 2018-06-15 | 黑龙江惠达科技发展有限公司 | 一种基于Linux系统的高性能陀螺仪数据采集方法 |
CN108989432A (zh) * | 2018-07-20 | 2018-12-11 | 南京中兴新软件有限责任公司 | 用户态的文件发送方法、文件接收方法和文件收发装置 |
-
2020
- 2020-06-11 CN CN202010529980.XA patent/CN111679923B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100070803A1 (en) * | 2008-09-07 | 2010-03-18 | Eads North America Defense Test And Services, Inc. | Sequencer and test system including the sequencer |
CN101894045A (zh) * | 2010-06-18 | 2010-11-24 | 阳坚 | 一种实时Linux操作系统 |
CN103942178A (zh) * | 2014-03-03 | 2014-07-23 | 浙江大学 | 多核处理器上实时操作系统与非实时操作系统之间的通信方法 |
WO2016004587A1 (zh) * | 2014-07-08 | 2016-01-14 | 北京航空航天大学 | 一种基于多核处理器架构的机器人混合系统应用框架 |
CN108170050A (zh) * | 2017-12-21 | 2018-06-15 | 黑龙江惠达科技发展有限公司 | 一种基于Linux系统的高性能陀螺仪数据采集方法 |
CN108989432A (zh) * | 2018-07-20 | 2018-12-11 | 南京中兴新软件有限责任公司 | 用户态的文件发送方法、文件接收方法和文件收发装置 |
Non-Patent Citations (6)
Title |
---|
匡启和,刘建业: "基于自由软件的GPS/INS组合导航系统设计", no. 02, pages 1 - 4 * |
吴文江;张杰;彭正森;: "基于RT-Linux的数控系统进程间通信方式的研究", no. 05 * |
喻诗祥;顾乃杰;张旭;曹越;: "一种多核ARM平台下用户态定时器的实现", no. 01 * |
杨宇音,李志淮: "Linux中用户空间与内核空间的通信实现", no. 05 * |
郑子辉;杨东升;尹震宇;: "数控现场总线NCSF监测分析系统的设计与实现", no. 05 * |
陈梦桐;魏丰;杨兵见;: "Linux下PCI同步时钟卡的驱动程序设计", no. 01 * |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112631975A (zh) * | 2020-12-09 | 2021-04-09 | 珠海全志科技股份有限公司 | 基于Linux的SPI传输方法 |
CN112769861A (zh) * | 2021-01-25 | 2021-05-07 | 东方电气自动控制工程有限公司 | 一种电厂安全i区网络安全危急信号识别输出装置 |
CN112769861B (zh) * | 2021-01-25 | 2023-01-31 | 东方电气自动控制工程有限公司 | 一种电厂安全i区网络安全危急信号识别输出装置 |
Also Published As
Publication number | Publication date |
---|---|
CN111679923B (zh) | 2023-08-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7003699B2 (en) | Generation of trace signals within a data processing apparatus | |
US20110231858A1 (en) | Burst access protocol | |
US7941652B2 (en) | Apparatus and computer program product for implementing atomic data tracing | |
WO2021043212A1 (zh) | 一种日志数据的存储方法、电子设备及存储介质 | |
KR20030060067A (ko) | 무선 핸드헬드 멀티미디어 디바이스를 지원하기 위한 집적프로세서 플랫폼 | |
CN111679923B (zh) | 实时通信方法和系统 | |
CN113468097B (zh) | 基于片上系统的数据交换方法 | |
CN112445725A (zh) | 预读取文件页的方法、装置和终端设备 | |
JPH10293744A (ja) | Pciバス・システム | |
US9304772B2 (en) | Ordering thread wavefronts instruction operations based on wavefront priority, operation counter, and ordering scheme | |
US8972693B2 (en) | Hardware managed allocation and deallocation evaluation circuit | |
JP4675891B2 (ja) | タスクスケジューリング装置、タスクスケジューリング方法、タスクスケジューリングプログラム、記録媒体、及び伝送媒体 | |
CN109426562B (zh) | 优先级加权轮转调度器 | |
JP3245500B2 (ja) | マルチプログラミングにおける事象管理方式 | |
JP2000207174A (ja) | 電子制御装置 | |
CN108958905B (zh) | 嵌入式多核中央处理器的轻量级操作系统 | |
CN108958904B (zh) | 嵌入式多核中央处理器的轻量级操作系统的驱动程序框架 | |
GB2391351A (en) | Generation of trace signals within a data processing apparatus | |
JPWO2006001051A1 (ja) | マルチプロセッサ装置及びその制御方法 | |
US20050039149A1 (en) | Microcomputer logic development device | |
JPH10275092A (ja) | マイクロプロセッサのトレース情報出力方法 | |
US20230276301A1 (en) | System and method for gpu-initiated communication | |
US20230276422A1 (en) | System and method for gpu-initiated communication | |
CN116841760A (zh) | 进程间的通信方法、装置、电子设备及存储介质 | |
CN116089081A (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 | ||
CB02 | Change of applicant information | ||
CB02 | Change of applicant information |
Address after: 4 / F, building 1, No.14 Jiuxianqiao Road, Chaoyang District, Beijing 100020 Applicant after: Beijing Jingwei Hengrun Technology Co.,Ltd. Address before: 8 / F, block B, No. 11, Anxiang Beili, Chaoyang District, Beijing 100101 Applicant before: Beijing Jingwei HiRain Technologies Co.,Ltd. |
|
GR01 | Patent grant | ||
GR01 | Patent grant |