异常处理方法、远程泊车辅助系统及计算机存储介质与流程

文档序号:24161050发布日期:2021-03-05 16:54阅读:78来源:国知局
异常处理方法、远程泊车辅助系统及计算机存储介质与流程

[0001]
本发明涉及数据处理领域,尤其涉及一种异常处理方法、远程泊车辅助系统及计算机存储介质。


背景技术:

[0002]
现有技术中,远程泊车辅助系统的应用层包括多个功能模块,各模块都有自己的核心工作线程,它们的业务逻辑处理也都在各自的工作线程内部完成,但没有定义一套完整的failsafe异常处理框架,可以让多个功能模块的工作线程同时捕获和处理各自的异常和错误。考虑到嵌入式软硬件资源有限,远程泊车辅助系统采用c语言编写。c语言本身没有failsafe的异常处理原语和处理机制,无法满足各个功能模块对异常进行捕获处理的实际需求。


技术实现要素:

[0003]
有鉴于此,本发明提供了一种异常处理方法、远程泊车辅助系统及计算机存储介质,能通过c语言实现多线程的统一异常处理。
[0004]
第一方面,本发明提供了一种异常处理方法,包括:
[0005]
对进程和工作线程依次初始化后,在所述工作线程内部运行c语言异常处理原语;
[0006]
根据所述工作线程确定对应的异常栈链列表,在所述异常栈链列表创建异常帧以存储异常;
[0007]
调用抛出异常帧的函数以捕获异常,处理所述异常后清除所述异常帧。
[0008]
其中,所述对进程和工作线程依次初始化,包括:
[0009]
对内存池初始化;
[0010]
调用异常环境管理器创建全局线程互斥对象以及全局map对象,初始化所述全局map对象;
[0011]
在当前进程创建工作线程;
[0012]
在所述工作线程调用所述异常环境管理器进入线程锁,创建异常环境上下文对象和异常栈链列表;
[0013]
创建map结构体对象,所述map结构体对象用于存储异常状态节点;
[0014]
初始化所述map结构体对象。
[0015]
其中,所述map结构体对象为红黑树结构,所述map结构体对象的键值为所述工作线程的名称,所述map结构体对象的取值为所述工作线程的上下文对象,所述上下文对象中包括所述异常状态节点。
[0016]
其中,所述根据所述工作线程确定对应的异常栈链列表,在所述异常栈链列表创建异常帧以存储异常,包括:
[0017]
根据所述工作线程的名称获取异常处理上下文对象;
[0018]
在所述异常处理上下文对象中查找输入异常状态节点;
[0019]
若存在输入异常状态节点,且所述输入异常状态节点等于当前异常状态节点,则进入线程锁,初始化当前异常状态节点后,离开所述线程锁;
[0020]
若不存在输入异常状态节点,则进入线程锁,创建并初始化异常帧,在所述异常帧中创建异常状态节点,将所述异常状态节点加入所述异常栈链列表后,离开所述线程锁。
[0021]
其中,所述调用抛出异常帧的函数以捕获异常,包括:
[0022]
判断所述异常帧的当前异常状态节点是否存在且所述异常帧为已尝试和正在捕获状态;
[0023]
若是,则继续处理下一异常状态节点;
[0024]
若否,则打印所述异常栈链列表中的所有异常帧,并对所述工作线程和所述进程依次反初始化。
[0025]
其中,所述调用抛出异常帧的函数以捕获异常,还包括:
[0026]
若所述异常帧的当前异常状态节点存在且所述异常帧为已抛出状态,则根据所述异常帧的跳转值进行逻辑跳转;
[0027]
若所述异常帧的当前异常状态节点存在且所述异常帧不为已抛出状态,则打印所述异常栈链列表中的所有异常帧,并对所述工作线程和所述进程依次反初始化。
[0028]
其中,所述清除所述异常帧,包括:
[0029]
若所述异常帧的异常状态节点存在且所述异常帧为已尝试和已捕获状态,则进入线程锁,删除当前异常状态节点后,离开所述线程锁;
[0030]
若所述异常帧的异常状态节点存在且不为已捕获状态,则继续判断下一异常状态节点;
[0031]
若所述异常帧的异常状态节点存在且所述异常帧为已尝试和正在捕获状态,则将当前异常状态节点的内容赋值给下一异常状态节点,删除当前异常状态节点后,离开所述线程锁;
[0032]
若所述异常帧的异常状态节点不存在,则打印所述异常栈链列表中的所有异常帧,并对所述工作线程和所述进程依次反初始化。
[0033]
其中,所述对所述工作线程和所述进程依次反初始化,包括:
[0034]
调用异常环境管理器进入线程锁;
[0035]
删除所述异常栈链列表和map结构体对象;
[0036]
离开线程锁,所述工作线程结束运行;
[0037]
删除所述全局map对象和所述全局线程互斥对象。
[0038]
第二方面,本发明还提供了一种远程泊车辅助系统,包括:至少一个处理器;
[0039]
至少一个存储器,所述至少一个存储器被耦合到所述至少一个处理器并且存储用于由所述至少一个处理器执行的指令,所述指令当由所述至少一个处理器执行时,使得所述设备执行如上所述的异常处理方法。
[0040]
第三方面,本发明还提供一种计算机存储介质,所述计算机存储介质上存储有计算机程序指令;所述计算机程序指令被处理器执行时实现如上所述的异常处理方法。
[0041]
综上所述,本发明提供了一种异常处理方法、远程泊车辅助系统及计算机存储介质,异常处理方法包括:对进程和工作线程依次初始化后,在工作线程内部运行c语言异常处理原语;根据工作线程确定对应的异常栈链列表,在异常栈链列表创建异常帧以存储异
常;调用抛出异常帧的函数以捕获异常,处理异常后清除异常帧。本方案实现了c语言多线程的统一异常处理,通过c语言异常处理原语能快速、高效地完成各线程的异常处理,保证多线程能安全访问异常处理过程。
[0042]
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其他目的、特征和优点能够更明显易懂,以下特举较佳实施例,并配合附图,详细说明如下。
附图说明
[0043]
图1为根据本发明实施例示出的异常处理方法的流程示意图;
[0044]
图2为根据本发明实施例示出的异常处理核心类的示意图;
[0045]
图3为根据本发明实施例示出的进程初始化时序图;
[0046]
图4为根据本发明实施例示出的线程初始化时序图;
[0047]
图5为根据本发明实施例示出的异常处理方法的具体流程图;
[0048]
图6为根据本发明实施例示出的创建异常帧的示意图;
[0049]
图7为根据本发明实施例示出的准备抛出异常帧的示意图;
[0050]
图8为根据本发明实施例示出的执行抛出异常帧的示意图;
[0051]
图9为根据本发明实施例示出的清除异常帧的示意图;
[0052]
图10为根据本发明实施例示出的打印异常帧的示意图;
[0053]
图11为根据本发明实施例示出的线程反初始化的时序图;
[0054]
图12为根据本发明实施例示出的进程反初始化的时序图。
具体实施方式
[0055]
为更进一步阐述本发明为达成预定发明目的所采取的技术手段及功效,以下结合附图及较佳实施例,对本发明详细说明如下。
[0056]
图1为根据本发明实施例示出的异常处理方法的流程示意图。如图1所示,本发明实施例提供了一种异常处理方法,包括:
[0057]
步骤201:对进程和工作线程依次初始化后,在工作线程内部运行c语言异常处理原语;
[0058]
步骤202:根据工作线程确定对应的异常栈链列表,在异常栈链列表创建异常帧以存储异常;
[0059]
步骤203:调用抛出异常帧的函数以捕获异常,处理异常后清除异常帧。
[0060]
错误异常可分为系统级异常(unchecked异常)和普通级异常(checked异常)。系统级异常是软件本身缺陷所导致的问题,比如数据角标越界、空指针、类型转换异常等,用户无法克服和恢复这种问题;普通级异常是运行环境的变化或异常所导致的问题,比如两个芯片之间通信失败、内存空间不够、网络断线等,用户能够克服这种问题。本发明构建了一种failsafe(安全失败)异常处理框架,可对这两个级别的异常统一处理。具体地,failsafe框架定义了两级异常处理机制:首先是提供了多线程安全访问机制,failsafe框架对外部功能模块提供了重要的多线程安全访问api,方便灵活调用;再者failsafe框架定义了一系列异常捕获和处理原语,支持多级嵌套和按时间顺序操作,方便外部功能模块开发者使用。
这些原语的使用,都是在多线程安全访问的前提下进行的,因此不会发生多线程资源竞争条件和访问冲突。
[0061]
为实现本申请的异常处理方法,在failsafe异常处理框架中定义了核心类及c语言异常处理原语。图2为根据本发明实施例示出的异常处理核心类的示意图。如图2所示,本申请的failsafe框架定义的异常处理核心类包括:
[0062]
【rpa_excpt_primit】
[0063]
定义了failsafe框架的各种异常处理原语,包括:try/throw/throw_zero/throw_nonzero/catch/catch_gr oup/default/finally/end_try;另外,对各种异常处理原语的执行,实现必要的跟踪和日志记录功能,支持try-catch等嵌套、按时间顺序操作等。异常处理原语定义如下表所示:
[0064]
[0065][0066]
【rpa_excpt_env_mgr】异常环境管理器
[0067]
用于实现failsafe框架多线程安全访问的封装,包括进程初始化/反初始化、线程初始化/反初始化、在线程内部取得当前线程id等;
[0068]
【rpa_list】异常栈链列表
[0069]
定义了一个双向链表double linked list,failsafe在此基础上,实现了栈链stack操作,用于实现try-throw-catch的嵌套使用;
[0070]
【rpa_list_iter】异常栈链列表迭代器
[0071]
定义了一个双向链表的迭代器,可以对双向链表进行正向/反向查找遍历;
[0072]
【rpa_rb_tree】红黑树
[0073]
定义了一棵红黑树,是一种特化的平衡二叉树,都是在进行插入和删除操作时,通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能,其时间复杂度为o(log n);
[0074]
【rpa_map】map结构体对象
[0075]
rpa_map基于红黑树结构,实现了一种map键值映射数据结构。在failsafe框架中,rpa_map被用来存储使用异常处理原语的工作线程id和线程上下文对象,以保证failsafe框架可以被多线程安全访问。
[0076]
在此基础上,failsafe框架主要分为2个大开发包,包括:
[0077]
【failsafe】
[0078]
该开发包实现了failsafe框架的核心业务逻辑,包括rpa_excpt_utils和rpa_excpt_hdl。前者定义了failsafe框架多线程安全访问的实现机制,同时定义了一系列异常处理原语和对应的业务操作;后者做为扩展业务逻辑实现,即对捕获到的异常进行后续处理。如果有通用的实现机制,可以封装在此处理包中,比如,紧急安全停车的指令标志位给到mcu,预备安全停车触发舒适减速至1.5km/h,重启自模块,容忍继续执行并记录日志等;
[0079]
【rpa_common_ds】
[0080]
该开发包实现了failsafe框架需要的数据结构定义,这些数据结构经过良好的设计和封装,可以作为通用的数据结构给整个rpa项目工程复用。目前failsafe需要两种数据结构,即基于双向链表实现的stack栈和基于红黑树实现的map键值映射结构。
[0081]
步骤201中,对进程和工作线程依次初始化时,包括进程初始化和线程初始化。进程初始化时,首先对内存池初始化,然后调用异常环境管理器创建全局线程互斥对象以及全局map对象,初始化全局map对象。接着在当前进程创建工作线程。线程初始化时,在工作线程调用异常环境管理器进入线程锁,创建异常环境上下文对象和异常栈链列表;然后创建map结构体对象,map结构体对象用于存储异常状态节点,接着初始化map结构体对象。
[0082]
图3为根据本发明实施例示出的进程初始化时序图。如图3所示,对failsafe框架进程初始化,包括:
[0083]
(1)系统主进程函数main进行内存池初始化;
[0084]
(2)在本进程空间内,main函数调用rpa异常环境管理器接口进行异常处理资源初始化;
[0085]
(3)rpa异常环境管理器创建全局线程互斥对象;
[0086]
(4)rpa异常环境管理器创建全局map对象,其key为工作线程id,其value为工作线程id对应的、用于failsafe异常处理的线程上下文对象;
[0087]
(5)对全局map对象进行初始化。
[0088]
然后,如图4所示,对异常处理的工作线程进行初始化,包括:
[0089]
(1)系统主进程函数main创建业务功能模块工作线程;
[0090]
(2)工作线程调用rpa异常环境管理器的接口,进行该线程上下文相关的异常处理资源初始化;
[0091]
(3)rpa异常环境管理器进入线程锁;
[0092]
(4)rpa异常环境管理器获取当前线程id,并检查map对象中是否存在key是当前线程id的节点,如果已经存在,则直接返回;如果不存在,则继续下面步骤;
[0093]
(5)rpa异常环境管理器创建新的异常环境上下文对象;
[0094]
(6)rpa异常环境管理器创建新的栈链结构列表;
[0095]
(7)rpa异常环境管理器将释放栈链的回调函数赋值给栈链结构列表;
[0096]
(8)rpa异常环境管理器将当前线程id、线程上下文对象、释放map节点的回调函
数,放入(put)到全局map结构中;
[0097]
(9)map管理器创建rpa map结构体对象并初始化;
[0098]
(10)map管理器遍历红黑树,并比较key值,找到新节点待插入位置;
[0099]
(11)map管理器调用红黑树管理器,插入颜色;
[0100]
(12)红黑树管理器设置颜色,旋转并插入节点;
[0101]
(13)rpa异常环境管理器离开线程锁。
[0102]
对进程和工作线程依次初始化后,在工作线程内部运行c语言异常处理原语。图5为根据本发明实施例示出的异常处理方法的具体流程图。如图5所示,failsafe框架异常处理原语使用流程,包括:
[0103]
(1)在main函数调用failsafe框架进程初始化函数,以及在工作线程内部调用failsafe框架线程初始化函数后,在工作线程内部运行异常处理原语;
[0104]
(2)根据当前线程的id,获取当前线程的异常处理上下文对象。然后判断当前上下文对象中的栈链列表里的异常帧数量是否达到了最大值(这里设为50);若是,则执行步骤(3);若否,则执行步骤(4);
[0105]
(3)打印出栈链中所有的异常帧,然后创建新的异常帧;
[0106]
(4)创建新的异常帧;
[0107]
(5)新的异常帧创建成功后,设置跳转值和已尝试(tried)状态标志置位;
[0108]
(6)调用准备抛出异常函数,以及调用执行抛出异常函数;
[0109]
(7)捕获异常,对当前异常帧的正在捕获(catching)状态标志和已捕获(caught)状态标志置位;
[0110]
(8)执行异常处理的收尾工作(此步骤各个功能模块可以自行实现);
[0111]
(9)调用清除异常帧函数,结束。
[0112]
异常帧是指一个异常对象,定义如下:
[0113][0114]
包含了jmp_buf:跳转缓存,_n_jmp_value:跳转值,_b_caught:已经捕获到该异常帧,_b_catching:正在捕获该异常帧,_b_tried:已经执行了try块内容,_b_thrown:已经抛出了该异常帧,_n_line:在什么代码行处引发了该异常帧,*_p_file_name:在什么代码文件中引发了该异常帧,*_p_func_name:是什么函数引发了该异常帧,_st_excpt_name_data:该结构体包含了该异常帧的异常号、名字、信号、异常消息等。
[0115]
步骤202中,根据工作线程确定对应的异常栈链列表,在异常栈链列表创建异常帧以存储异常。首先根据工作线程的名称获取异常处理上下文对象,在异常处理上下文对象中查找输入异常状态节点;若存在输入异常状态节点,且输入异常状态节点等于当前异常状态节点,则进入线程锁,初始化当前异常状态节点后,离开线程锁;若不存在输入异常状态节点,则进入线程锁,创建并初始化异常帧,在异常帧中创建异常状态节点,将异常状态节点加入异常栈链列表后,离开线程锁。
[0116]
图6为根据本发明实施例示出的创建异常帧的示意图。如图6所示,failsafe框架创建新的异常帧流程,包括:
[0117]
(1)首先根据当前线程的id,获取当前线程的异常处理上下文对象;
[0118]
(2)判断输入的异常状态节点是否存在;若是,则执行步骤(3);若否,则结束;
[0119]
(3)继续判断输入的异常状态节点是否等于当前的异常状态节点;若是,则执行步骤(4);若否,则执行步骤(5);
[0120]
(4)进入mutex线程锁,重新初始化当前的异常状态节点内容,然后离开线程锁,结束;
[0121]
(5)进入mutex线程锁,创建异常状态帧,初始化该异常状态帧。然后根据此异常状态帧,创建异常状态节点,最后将此新建的异常状态节点,加入到异常栈链列表,离开线程锁,结束。
[0122]
步骤203中,调用抛出异常帧的函数以捕获异常,包括:判断异常帧的当前异常状态节点是否存在且异常帧为已尝试和正在捕获状态;若是,则继续处理下一异常状态节点;若否,则打印异常栈链列表中的所有异常帧,并对工作线程和进程依次反初始化。
[0123]
图7为根据本发明实施例示出的准备抛出异常帧的示意图。如图7所示,本申请执行准备抛出异常的流程,包括:
[0124]
(1)首先根据当前线程的id,获取当前线程的异常处理上下文对象;
[0125]
(2)判断当前上下文对象中的当前异常状态节点是否存在,且已尝试(tried)状态标志是否已经置位;若否,则执行步骤(3);若是,则执行步骤(4);
[0126]
(3)打印当前上下文对象的栈链中所有的异常帧,然后调用failsafe框架线程反初始化函数,以及failsafe框架进程反初始化函数,结束;
[0127]
(4)继续判断当前异常状态节点的异常状态帧的正在捕获(catching)状态是否置位,即该异常状态帧是否正在被捕获;若否,则执行步骤(10);若是,则执行步骤(5);
[0128]
(5)继续判断异常栈链中是否有下一个异常状态节点;若是,则执行步骤(7);若否,则执行步骤(6);
[0129]
(6)调用清除异常帧函数,结束;
[0130]
(7)根据输入的当前异常状态节点,创建新的异常帧;若创建异常帧成功,则执行步骤(9);若创建异常帧失败,则执行步骤(8);
[0131]
(8)打印当前上下文对象的栈链中所有的异常帧,然后调用failsafe框架线程反初始化函数,以及failsafe框架进程反初始化函数,结束;
[0132]
(9)进入mutex线程锁,将栈链的下一个异常跳转值复制给当前异常帧,并重新设置当前异常帧的内容,以及让当前异常帧的已捕获(thrown)状态标志置位。然后离开线程锁,结束;
[0133]
(10)根据输入的当前异常状态节点,创建新的异常帧;若创建异常帧成功,则执行步骤(11);若创建异常帧失败,则执行步骤(12);
[0134]
(11)进入mutex线程锁,重新设置当前异常帧的内容,以及让当前异常帧的已捕获(thrown)状态标志置位,然后离开线程锁,结束;
[0135]
(12)打印栈链中所有的异常帧,再进入mutex线程锁,重新设置当前异常帧的内容,以及让当前异常帧的已捕获(thrown)状态标志置位,然后离开线程锁,结束。
[0136]
步骤203中,调用抛出异常帧的函数以捕获异常,还包括:若异常帧的当前异常状态节点存在且异常帧为已抛出状态,则根据异常帧的跳转值进行逻辑跳转;若异常帧的当前异常状态节点存在且异常帧不为已抛出状态,则打印异常栈链列表中的所有异常帧,并对工作线程和进程依次反初始化。
[0137]
图8为根据本发明实施例示出的执行抛出异常帧的示意图。如图8所示,本申请执行抛出异常的流程,包括:
[0138]
(1)首先根据当前线程的id,获取当前线程的异常处理上下文对象;
[0139]
(2)从当前上下文对象中,取得异常状态帧;
[0140]
(3)判断异常状态帧已抛出(thrown)状态标志是否置位;若已经置位,则执行步骤(4);若没有置位,则执行步骤(5);
[0141]
(4)根据跳转值进行代码逻辑跳转,结束;
[0142]
(5)进入mutex线程锁,生成异常打印消息,然后离开线程锁。接着打印栈链中所有的异常帧,然后调用failsafe框架线程反初始化函数,以及failsafe框架进程反初始化函数,结束。
[0143]
步骤203中,清除所述异常帧,包括:若异常帧的异常状态节点存在且异常帧为已尝试和已捕获状态,则进入线程锁,删除当前异常状态节点后,离开线程锁;若异常帧的异常状态节点存在且异常帧不为已捕获状态,则继续判断下一异常状态节点;若异常帧的异常状态节点存在且异常帧为已尝试和正在捕获状态,则将当前异常状态节点的内容赋值给下一异常状态节点,删除当前异常状态节点后,离开线程锁;若异常帧的异常状态节点不存在,则打印异常栈链列表中的所有异常帧,并对工作线程和进程依次反初始化。
[0144]
图9为根据本发明实施例示出的清除异常帧的示意图。如图9所示,本申请执行清除异常帧的流程,包括:
[0145]
(1)首先根据当前线程的id,获取当前线程的异常处理上下文对象;
[0146]
(2)从当前上下文对象中,取出当前异常状态节点,并判断是否存在;若否,则执行步骤(3);若是,则执行步骤(4);
[0147]
(3)打印当前上下文对象的栈链中所有的异常帧,然后调用failsafe框架线程反初始化函数,以及failsafe框架进程反初始化函数,结束;
[0148]
(4)继续判断该异常节点是否已抛出(thrown)状态标志置位,且已捕获(caught)状态标志没有置位;若否,则执行步骤(5);若是,则执行步骤(8);
[0149]
(5)判断当前异常状态节点的下一个节点是否存在;若是,则执行步骤(6);若否,则执行步骤(7);
[0150]
(6)进入mutex线程锁,然后从栈链中删除当前异常状态节点,并让下一个异常状态节点作为当前异常状态节点,最后离开线程锁,结束;
[0151]
(7)进入mutex线程锁,从栈链列表中删除当前异常状态节点,然后离开线程锁,结束;
[0152]
(8)继续判断当前异常状态节点的下一个节点是否存在;若否,则执行步骤(9);若是,则执行步骤(10);
[0153]
(9)打印当前上下文对象的栈链中所有的异常帧,然后调用failsafe框架线程反初始化函数,以及failsafe框架进程反初始化函数,结束;
[0154]
(10)继续判断当前异常状态帧的已尝试(tried)状态标志置位,且正在捕获(catching)状态标志没有置位;若否,结束;若是,则执行步骤(11);
[0155]
(11)进入mutex线程锁,然后把当前异常状态节点内容赋值给下一个异常状态节点,从栈链列表中删除当前异常状态节点,接着离开线程锁,调用准备抛出异常函数,以及执行抛出异常函数,结束。
[0156]
图10为根据本发明实施例示出的打印异常帧的示意图。如图10所示,本申请打印异常帧日志消息的流程,包括:
[0157]
(1)打印当前输入的错误异常日志消息;
[0158]
(2)根据当前线程的id,获取当前线程的异常处理上下文对象;
[0159]
(3)进入mutex线程锁;
[0160]
(4)为当前上下文对象的异常帧栈链创建迭代器;
[0161]
(5)进入while循环,根据迭代器取得栈链里的异常节点;
[0162]
(6)判断异常节点是否存在;
[0163]
(7)如果异常节点存在,则初始化异常打印消息缓存;
[0164]
(8)然后生成具体的异常打印消息,并将异常帧的各种处理状态tried/catching/caught/thrown赋值给打印消息;
[0165]
(9)完成异常消息打印,然后再次while循环,直到栈链中所有异常帧的消息都被打印出来为止;
[0166]
(10)当迭代器里取不出新的异常节点时退出while循环,并销毁迭代器;
[0167]
(11)离开线程锁,结束。
[0168]
前述流程中,对工作线程和进程依次反初始化,包括:调用异常环境管理器进入线程锁;删除异常栈链列表和map结构体对象;离开线程锁,工作线程结束运行;删除全局map对象和全局线程互斥对象。
[0169]
图11为根据本发明实施例示出的线程反初始化的时序图。如图11所示,对异常处理的工作线程进行反初始化,包括:
[0170]
(1)工作线程调用rpa异常环境管理器接口,进行线程上下文相关的异常处理资源反初始化;
[0171]
(2)rpa异常环境管理器进入线程锁;
[0172]
(3)rpa异常环境管理器取得当前线程id;
[0173]
(4)rpa异常环境管理器根据当前线程id,获取map结构中对应的线程上下文对象;
[0174]
(5)map管理器根据key(即当前线程id),遍历红黑树,找到目标value(即线程上下文对象);
[0175]
(6)map管理器把目标map节点对象返回给rpa异常环境管理器;
[0176]
(7)rpa异常环境管理器调用map管理器删除接口,删除目标map节点对象;
[0177]
(8)map管理器删除红黑树节点对象;
[0178]
(9)红黑树管理器删除目标节点,设置颜色并旋转;
[0179]
(10)map管理器回调功能模块自定义的key-value数据删除函数;
[0180]
(11)map管理器销毁栈链列表对象;
[0181]
(12)栈链管理器遍历整个栈链,并回调功能模块自定义的数据对象释放函数;
[0182]
(13)栈链管理器将数据对象逐个从内存池中释放;
[0183]
(14)栈链管理器将栈链列表对象从内存池中释放;
[0184]
(15)map管理器将目标map节点从内存池中释放;
[0185]
(16)rpa异常环境管理器离开线程锁;
[0186]
(17)工作线程结束运行。
[0187]
图12为根据本发明实施例示出的进程反初始化的时序图。如图12所示,对进程进行反初始化,包括:
[0188]
(1)系统主进程main函数,在进程空间内调用failsafe框架异常处理资源反初始化函数;
[0189]
(2)failsafe框架内部的rpa异常环境管理器销毁map对象;
[0190]
(3)map销毁函数从头顺序遍历map节点,并调用删除map节点函数;
[0191]
(4)map删除节点函数将删除当前map红黑树节点对象;
[0192]
(5)红黑树删除函数删除目标节点,设置颜色并旋转;
[0193]
(6)map删除节点函数回调功能模块自定义的key-value数据删除函数;
[0194]
(7)key-value数据删除函数销毁栈链对象;
[0195]
(8)栈链销毁函数遍历整个栈链并回调功能模块自定义的数据对象释放函数;
[0196]
(9)栈链销毁函数将数据对象逐个从内存池中释放;
[0197]
(10)栈链销毁函数将栈链对象从内存池中释放;
[0198]
(11)map销毁函数将目标map节点从内存池中释放,然后继续循环3-11步骤,直到所有map节点都已经被删除;
[0199]
(12)map销毁函数将map对象从内存池中释放;
[0200]
(13)rpa异常环境管理器删除线程互斥对象mutex;
[0201]
(14)系统主进程main函数结束退出。
[0202]
综上,本发明设计了一个轻量级的安全失败(failsafe)机制服务框架,通过宏定义实现了一系列c语言异常处理原语,从而让远程泊车辅助系统中各个模块捕获和处理异常时,通过异常处理原语api快速、高效地完成异常处理过程。failsafe框架采用stack栈链数据结构,对异常帧所在的对象节点进行压栈和出栈处理,支持try-throw-catch等原语的嵌套操作、按时间顺序操作等。failsafe框架基于红黑树的map数据结构,对模块工作线程的id和异常处理上下文实现一一映射关系,从而实现每个模块的工作线程处理异常时,都有自己的线程上下文。failsafe框架使用mutex互斥对象,让failsafe框架对异常的处理过程实现多线程安全访问。此外,failsafe框架在内存空间使用时采用内存池技术,有效避免了动态内存分配和释放所带来的碎片化问题,极大满足了嵌入式系统对有限内存空间的使用要求。同时,本发明基于c语言实现的异常处理原语,可以普遍复用到各种嵌入式软件系统中。
[0203]
本申请还提供一种远程泊车辅助系统,包括:
[0204]
至少一个处理器;
[0205]
至少一个存储器,至少一个存储器被耦合到至少一个处理器并且存储用于由至少一个处理器执行的指令,指令当由至少一个处理器执行时,使得所述设备执行时实现如上实施例所述的异常处理方法。
[0206]
本申请还提供一种计算机存储介质,计算机存储介质上存储有计算机程序指令;计算机程序指令被处理器执行时实现如上实施例所述的异常处理方法。
[0207]
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
[0208]
在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,除了包含所列的那些要素,而且还可包含没有明确列出的其他要素。
[0209]
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1