在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习。我的使命就是过滤掉大量的无效信息,将知识体系化,以短平快的方式直达问题本质,把大家从大海捞针的痛苦中解脱出来。

文章目录

  • 1 问题引入
    • 1.1 问题表象
    • 1.2 问题背景
  • 2 问题分析和定位
  • 3 问题解决
  • 4 复盘

1 问题引入

1.1 问题表象

问题出在使用PCIe设备的应用层,而且该问题是一个很偶现的问题。该问题出现时的表象是业务模块获取到的PCIe Bar空间基地址为NULL,并产生了任务异常(额,居然没判空就用了)。

1.2 问题背景

为了能够将该问题表述清楚,需要交代一下问题出现时的场景。

如下图所示,硬件上分为两个处理器,一个主处理器,一个从处理器。主处理器上p0进程为主进程,控制着主要的时序逻辑;主处理器p1进程负责主处理器上连接的PCIe设备的用户态服务。从处理器p0进程负责从处理器上连接的PCIe设备的用户态服务;从处理器p1进程负责业务逻辑,并且依赖PCIe的服务。

任务异常就出现在从处理器的p1进程上。

#mermaid-svg-4zubFqKZhGxUfGsV .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-4zubFqKZhGxUfGsV .label text{fill:#333}#mermaid-svg-4zubFqKZhGxUfGsV .node rect,#mermaid-svg-4zubFqKZhGxUfGsV .node circle,#mermaid-svg-4zubFqKZhGxUfGsV .node ellipse,#mermaid-svg-4zubFqKZhGxUfGsV .node polygon,#mermaid-svg-4zubFqKZhGxUfGsV .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-4zubFqKZhGxUfGsV .node .label{text-align:center;fill:#333}#mermaid-svg-4zubFqKZhGxUfGsV .node.clickable{cursor:pointer}#mermaid-svg-4zubFqKZhGxUfGsV .arrowheadPath{fill:#333}#mermaid-svg-4zubFqKZhGxUfGsV .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-4zubFqKZhGxUfGsV .flowchart-link{stroke:#333;fill:none}#mermaid-svg-4zubFqKZhGxUfGsV .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-4zubFqKZhGxUfGsV .edgeLabel rect{opacity:0.9}#mermaid-svg-4zubFqKZhGxUfGsV .edgeLabel span{color:#333}#mermaid-svg-4zubFqKZhGxUfGsV .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-4zubFqKZhGxUfGsV .cluster text{fill:#333}#mermaid-svg-4zubFqKZhGxUfGsV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-4zubFqKZhGxUfGsV .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-4zubFqKZhGxUfGsV text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-4zubFqKZhGxUfGsV .actor-line{stroke:grey}#mermaid-svg-4zubFqKZhGxUfGsV .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-4zubFqKZhGxUfGsV .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-4zubFqKZhGxUfGsV #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-4zubFqKZhGxUfGsV .sequenceNumber{fill:#fff}#mermaid-svg-4zubFqKZhGxUfGsV #sequencenumber{fill:#333}#mermaid-svg-4zubFqKZhGxUfGsV #crosshead path{fill:#333;stroke:#333}#mermaid-svg-4zubFqKZhGxUfGsV .messageText{fill:#333;stroke:#333}#mermaid-svg-4zubFqKZhGxUfGsV .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-4zubFqKZhGxUfGsV .labelText,#mermaid-svg-4zubFqKZhGxUfGsV .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-4zubFqKZhGxUfGsV .loopText,#mermaid-svg-4zubFqKZhGxUfGsV .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-4zubFqKZhGxUfGsV .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-4zubFqKZhGxUfGsV .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-4zubFqKZhGxUfGsV .noteText,#mermaid-svg-4zubFqKZhGxUfGsV .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-4zubFqKZhGxUfGsV .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-4zubFqKZhGxUfGsV .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-4zubFqKZhGxUfGsV .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-4zubFqKZhGxUfGsV .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-4zubFqKZhGxUfGsV .section{stroke:none;opacity:0.2}#mermaid-svg-4zubFqKZhGxUfGsV .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-4zubFqKZhGxUfGsV .section2{fill:#fff400}#mermaid-svg-4zubFqKZhGxUfGsV .section1,#mermaid-svg-4zubFqKZhGxUfGsV .section3{fill:#fff;opacity:0.2}#mermaid-svg-4zubFqKZhGxUfGsV .sectionTitle0{fill:#333}#mermaid-svg-4zubFqKZhGxUfGsV .sectionTitle1{fill:#333}#mermaid-svg-4zubFqKZhGxUfGsV .sectionTitle2{fill:#333}#mermaid-svg-4zubFqKZhGxUfGsV .sectionTitle3{fill:#333}#mermaid-svg-4zubFqKZhGxUfGsV .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-4zubFqKZhGxUfGsV .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-4zubFqKZhGxUfGsV .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-4zubFqKZhGxUfGsV .grid path{stroke-width:0}#mermaid-svg-4zubFqKZhGxUfGsV .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-4zubFqKZhGxUfGsV .task{stroke-width:2}#mermaid-svg-4zubFqKZhGxUfGsV .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-4zubFqKZhGxUfGsV .taskText:not([font-size]){font-size:11px}#mermaid-svg-4zubFqKZhGxUfGsV .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-4zubFqKZhGxUfGsV .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-4zubFqKZhGxUfGsV .task.clickable{cursor:pointer}#mermaid-svg-4zubFqKZhGxUfGsV .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-4zubFqKZhGxUfGsV .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-4zubFqKZhGxUfGsV .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-4zubFqKZhGxUfGsV .taskText0,#mermaid-svg-4zubFqKZhGxUfGsV .taskText1,#mermaid-svg-4zubFqKZhGxUfGsV .taskText2,#mermaid-svg-4zubFqKZhGxUfGsV .taskText3{fill:#fff}#mermaid-svg-4zubFqKZhGxUfGsV .task0,#mermaid-svg-4zubFqKZhGxUfGsV .task1,#mermaid-svg-4zubFqKZhGxUfGsV .task2,#mermaid-svg-4zubFqKZhGxUfGsV .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-4zubFqKZhGxUfGsV .taskTextOutside0,#mermaid-svg-4zubFqKZhGxUfGsV .taskTextOutside2{fill:#000}#mermaid-svg-4zubFqKZhGxUfGsV .taskTextOutside1,#mermaid-svg-4zubFqKZhGxUfGsV .taskTextOutside3{fill:#000}#mermaid-svg-4zubFqKZhGxUfGsV .active0,#mermaid-svg-4zubFqKZhGxUfGsV .active1,#mermaid-svg-4zubFqKZhGxUfGsV .active2,#mermaid-svg-4zubFqKZhGxUfGsV .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-4zubFqKZhGxUfGsV .activeText0,#mermaid-svg-4zubFqKZhGxUfGsV .activeText1,#mermaid-svg-4zubFqKZhGxUfGsV .activeText2,#mermaid-svg-4zubFqKZhGxUfGsV .activeText3{fill:#000 !important}#mermaid-svg-4zubFqKZhGxUfGsV .done0,#mermaid-svg-4zubFqKZhGxUfGsV .done1,#mermaid-svg-4zubFqKZhGxUfGsV .done2,#mermaid-svg-4zubFqKZhGxUfGsV .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-4zubFqKZhGxUfGsV .doneText0,#mermaid-svg-4zubFqKZhGxUfGsV .doneText1,#mermaid-svg-4zubFqKZhGxUfGsV .doneText2,#mermaid-svg-4zubFqKZhGxUfGsV .doneText3{fill:#000 !important}#mermaid-svg-4zubFqKZhGxUfGsV .crit0,#mermaid-svg-4zubFqKZhGxUfGsV .crit1,#mermaid-svg-4zubFqKZhGxUfGsV .crit2,#mermaid-svg-4zubFqKZhGxUfGsV .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-4zubFqKZhGxUfGsV .activeCrit0,#mermaid-svg-4zubFqKZhGxUfGsV .activeCrit1,#mermaid-svg-4zubFqKZhGxUfGsV .activeCrit2,#mermaid-svg-4zubFqKZhGxUfGsV .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-4zubFqKZhGxUfGsV .doneCrit0,#mermaid-svg-4zubFqKZhGxUfGsV .doneCrit1,#mermaid-svg-4zubFqKZhGxUfGsV .doneCrit2,#mermaid-svg-4zubFqKZhGxUfGsV .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-4zubFqKZhGxUfGsV .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-4zubFqKZhGxUfGsV .milestoneText{font-style:italic}#mermaid-svg-4zubFqKZhGxUfGsV .doneCritText0,#mermaid-svg-4zubFqKZhGxUfGsV .doneCritText1,#mermaid-svg-4zubFqKZhGxUfGsV .doneCritText2,#mermaid-svg-4zubFqKZhGxUfGsV .doneCritText3{fill:#000 !important}#mermaid-svg-4zubFqKZhGxUfGsV .activeCritText0,#mermaid-svg-4zubFqKZhGxUfGsV .activeCritText1,#mermaid-svg-4zubFqKZhGxUfGsV .activeCritText2,#mermaid-svg-4zubFqKZhGxUfGsV .activeCritText3{fill:#000 !important}#mermaid-svg-4zubFqKZhGxUfGsV .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-4zubFqKZhGxUfGsV g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-4zubFqKZhGxUfGsV g.classGroup text .title{font-weight:bolder}#mermaid-svg-4zubFqKZhGxUfGsV g.clickable{cursor:pointer}#mermaid-svg-4zubFqKZhGxUfGsV g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-4zubFqKZhGxUfGsV g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-4zubFqKZhGxUfGsV .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-4zubFqKZhGxUfGsV .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-4zubFqKZhGxUfGsV .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-4zubFqKZhGxUfGsV .dashed-line{stroke-dasharray:3}#mermaid-svg-4zubFqKZhGxUfGsV #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-4zubFqKZhGxUfGsV #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-4zubFqKZhGxUfGsV #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-4zubFqKZhGxUfGsV #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-4zubFqKZhGxUfGsV #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-4zubFqKZhGxUfGsV #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-4zubFqKZhGxUfGsV #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-4zubFqKZhGxUfGsV #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-4zubFqKZhGxUfGsV .commit-id,#mermaid-svg-4zubFqKZhGxUfGsV .commit-msg,#mermaid-svg-4zubFqKZhGxUfGsV .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-4zubFqKZhGxUfGsV .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-4zubFqKZhGxUfGsV .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-4zubFqKZhGxUfGsV g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-4zubFqKZhGxUfGsV g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-4zubFqKZhGxUfGsV g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-4zubFqKZhGxUfGsV g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-4zubFqKZhGxUfGsV g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-4zubFqKZhGxUfGsV g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-4zubFqKZhGxUfGsV .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-4zubFqKZhGxUfGsV .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-4zubFqKZhGxUfGsV .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-4zubFqKZhGxUfGsV .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-4zubFqKZhGxUfGsV .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-4zubFqKZhGxUfGsV .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-4zubFqKZhGxUfGsV .edgeLabel text{fill:#333}#mermaid-svg-4zubFqKZhGxUfGsV .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-4zubFqKZhGxUfGsV .node circle.state-start{fill:black;stroke:black}#mermaid-svg-4zubFqKZhGxUfGsV .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-4zubFqKZhGxUfGsV #statediagram-barbEnd{fill:#9370db}#mermaid-svg-4zubFqKZhGxUfGsV .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-4zubFqKZhGxUfGsV .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-4zubFqKZhGxUfGsV .statediagram-state .divider{stroke:#9370db}#mermaid-svg-4zubFqKZhGxUfGsV .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-4zubFqKZhGxUfGsV .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-4zubFqKZhGxUfGsV .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-4zubFqKZhGxUfGsV .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-4zubFqKZhGxUfGsV .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-4zubFqKZhGxUfGsV .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-4zubFqKZhGxUfGsV .note-edge{stroke-dasharray:5}#mermaid-svg-4zubFqKZhGxUfGsV .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-4zubFqKZhGxUfGsV .error-icon{fill:#522}#mermaid-svg-4zubFqKZhGxUfGsV .error-text{fill:#522;stroke:#522}#mermaid-svg-4zubFqKZhGxUfGsV .edge-thickness-normal{stroke-width:2px}#mermaid-svg-4zubFqKZhGxUfGsV .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-4zubFqKZhGxUfGsV .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-4zubFqKZhGxUfGsV .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-4zubFqKZhGxUfGsV .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-4zubFqKZhGxUfGsV .marker{fill:#333}#mermaid-svg-4zubFqKZhGxUfGsV .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-4zubFqKZhGxUfGsV {color: rgba(0, 0, 0, 0.75);font: ;}主处理器p1主处理器p0从处理器p0从处理器p1Msg1:PCIe初始化完成Msg2:PCIe初始化完成Msg3:所有PCIe任务初始化完成主处理器p1主处理器p0从处理器p0从处理器p1进程间消息交互

2 问题分析和定位

查看业务层代码发现从处理器p1进程出现任务异常的原因:是主处理器p0进程通过一系列流程(简化之后就是上图的Msg3消息)告诉了从处理器p1进程所有PCIe任务已经初始化完成,可以进行下一步操作。因此,从处理器p1就进行了下一步操作,这步操作就是向从处理器p0进程获取PCIe设备的BAR空间基址。但是,问题出现了,获取到的基址为NULL,并且直接引用了这个地址导致任务异常。

那第一个思路肯定是现在就去确认当前的PCIe设备BAR空间是否真的是NULL,手动查看之后发现并不是NULL;而且查看从处理器p0进程初始化PCIe的打印,发现BAR空间基址也是正常的。

那么,真相只有一个——从处理器p1进程获取BAR空间基址的时间点过早(偶现)——一个典型的时序问题。

根据这个思路,我们再看上图。满足Msg3发送的条件是Msg1和Msg2发送成功(其实,还有好多业务条件也需要满足,前期也查询了这些业务条件都没有问题才开始怀疑到这里的,定位问题的真实场景往往都是道阻且长)。所以,只需要出一个定位版本持续压力就可以定位Msg2是否有问题了。

定位版本中只需要在发送Msg3前判断从处理器p0维护的BAR空间基址是否为NULL就可以了。定位发现,果然出现了NULL的情况。那么可以断定Msg2出现了问题。


时序问题,要么是事件触发错误(比如丢消息),要么是状态记录错误(比如状态转换缺失环节)。

由于系统对各个消息进行了监控,发现Msg2消息在历史上发送过,因此,不是丢消息,而是Msg2还没发送,Msg3就发送了。

这就表明是状态机的状态转换出现了问题。

先给出正确的状态迁移图。

主处理器上的PCIe设备初始化状态和从处理器上的PCIe设备初始化状态都记录在主处理器的主进程中。不同的PCIe设备的初始化都是并行的,因此,各自的状态迁移也是并行发生,如下图所示。

#mermaid-svg-vg4BByo4v4rxfgu5 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .label text{fill:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .node rect,#mermaid-svg-vg4BByo4v4rxfgu5 .node circle,#mermaid-svg-vg4BByo4v4rxfgu5 .node ellipse,#mermaid-svg-vg4BByo4v4rxfgu5 .node polygon,#mermaid-svg-vg4BByo4v4rxfgu5 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-vg4BByo4v4rxfgu5 .node .label{text-align:center;fill:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .node.clickable{cursor:pointer}#mermaid-svg-vg4BByo4v4rxfgu5 .arrowheadPath{fill:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-vg4BByo4v4rxfgu5 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-vg4BByo4v4rxfgu5 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-vg4BByo4v4rxfgu5 .edgeLabel rect{opacity:0.9}#mermaid-svg-vg4BByo4v4rxfgu5 .edgeLabel span{color:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-vg4BByo4v4rxfgu5 .cluster text{fill:#333}#mermaid-svg-vg4BByo4v4rxfgu5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-vg4BByo4v4rxfgu5 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-vg4BByo4v4rxfgu5 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-vg4BByo4v4rxfgu5 .actor-line{stroke:grey}#mermaid-svg-vg4BByo4v4rxfgu5 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-vg4BByo4v4rxfgu5 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .sequenceNumber{fill:#fff}#mermaid-svg-vg4BByo4v4rxfgu5 #sequencenumber{fill:#333}#mermaid-svg-vg4BByo4v4rxfgu5 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .messageText{fill:#333;stroke:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-vg4BByo4v4rxfgu5 .labelText,#mermaid-svg-vg4BByo4v4rxfgu5 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-vg4BByo4v4rxfgu5 .loopText,#mermaid-svg-vg4BByo4v4rxfgu5 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-vg4BByo4v4rxfgu5 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-vg4BByo4v4rxfgu5 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-vg4BByo4v4rxfgu5 .noteText,#mermaid-svg-vg4BByo4v4rxfgu5 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-vg4BByo4v4rxfgu5 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-vg4BByo4v4rxfgu5 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-vg4BByo4v4rxfgu5 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-vg4BByo4v4rxfgu5 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vg4BByo4v4rxfgu5 .section{stroke:none;opacity:0.2}#mermaid-svg-vg4BByo4v4rxfgu5 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-vg4BByo4v4rxfgu5 .section2{fill:#fff400}#mermaid-svg-vg4BByo4v4rxfgu5 .section1,#mermaid-svg-vg4BByo4v4rxfgu5 .section3{fill:#fff;opacity:0.2}#mermaid-svg-vg4BByo4v4rxfgu5 .sectionTitle0{fill:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .sectionTitle1{fill:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .sectionTitle2{fill:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .sectionTitle3{fill:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vg4BByo4v4rxfgu5 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-vg4BByo4v4rxfgu5 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vg4BByo4v4rxfgu5 .grid path{stroke-width:0}#mermaid-svg-vg4BByo4v4rxfgu5 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-vg4BByo4v4rxfgu5 .task{stroke-width:2}#mermaid-svg-vg4BByo4v4rxfgu5 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vg4BByo4v4rxfgu5 .taskText:not([font-size]){font-size:11px}#mermaid-svg-vg4BByo4v4rxfgu5 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vg4BByo4v4rxfgu5 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-vg4BByo4v4rxfgu5 .task.clickable{cursor:pointer}#mermaid-svg-vg4BByo4v4rxfgu5 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-vg4BByo4v4rxfgu5 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-vg4BByo4v4rxfgu5 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-vg4BByo4v4rxfgu5 .taskText0,#mermaid-svg-vg4BByo4v4rxfgu5 .taskText1,#mermaid-svg-vg4BByo4v4rxfgu5 .taskText2,#mermaid-svg-vg4BByo4v4rxfgu5 .taskText3{fill:#fff}#mermaid-svg-vg4BByo4v4rxfgu5 .task0,#mermaid-svg-vg4BByo4v4rxfgu5 .task1,#mermaid-svg-vg4BByo4v4rxfgu5 .task2,#mermaid-svg-vg4BByo4v4rxfgu5 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-vg4BByo4v4rxfgu5 .taskTextOutside0,#mermaid-svg-vg4BByo4v4rxfgu5 .taskTextOutside2{fill:#000}#mermaid-svg-vg4BByo4v4rxfgu5 .taskTextOutside1,#mermaid-svg-vg4BByo4v4rxfgu5 .taskTextOutside3{fill:#000}#mermaid-svg-vg4BByo4v4rxfgu5 .active0,#mermaid-svg-vg4BByo4v4rxfgu5 .active1,#mermaid-svg-vg4BByo4v4rxfgu5 .active2,#mermaid-svg-vg4BByo4v4rxfgu5 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-vg4BByo4v4rxfgu5 .activeText0,#mermaid-svg-vg4BByo4v4rxfgu5 .activeText1,#mermaid-svg-vg4BByo4v4rxfgu5 .activeText2,#mermaid-svg-vg4BByo4v4rxfgu5 .activeText3{fill:#000 !important}#mermaid-svg-vg4BByo4v4rxfgu5 .done0,#mermaid-svg-vg4BByo4v4rxfgu5 .done1,#mermaid-svg-vg4BByo4v4rxfgu5 .done2,#mermaid-svg-vg4BByo4v4rxfgu5 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-vg4BByo4v4rxfgu5 .doneText0,#mermaid-svg-vg4BByo4v4rxfgu5 .doneText1,#mermaid-svg-vg4BByo4v4rxfgu5 .doneText2,#mermaid-svg-vg4BByo4v4rxfgu5 .doneText3{fill:#000 !important}#mermaid-svg-vg4BByo4v4rxfgu5 .crit0,#mermaid-svg-vg4BByo4v4rxfgu5 .crit1,#mermaid-svg-vg4BByo4v4rxfgu5 .crit2,#mermaid-svg-vg4BByo4v4rxfgu5 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-vg4BByo4v4rxfgu5 .activeCrit0,#mermaid-svg-vg4BByo4v4rxfgu5 .activeCrit1,#mermaid-svg-vg4BByo4v4rxfgu5 .activeCrit2,#mermaid-svg-vg4BByo4v4rxfgu5 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-vg4BByo4v4rxfgu5 .doneCrit0,#mermaid-svg-vg4BByo4v4rxfgu5 .doneCrit1,#mermaid-svg-vg4BByo4v4rxfgu5 .doneCrit2,#mermaid-svg-vg4BByo4v4rxfgu5 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-vg4BByo4v4rxfgu5 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-vg4BByo4v4rxfgu5 .milestoneText{font-style:italic}#mermaid-svg-vg4BByo4v4rxfgu5 .doneCritText0,#mermaid-svg-vg4BByo4v4rxfgu5 .doneCritText1,#mermaid-svg-vg4BByo4v4rxfgu5 .doneCritText2,#mermaid-svg-vg4BByo4v4rxfgu5 .doneCritText3{fill:#000 !important}#mermaid-svg-vg4BByo4v4rxfgu5 .activeCritText0,#mermaid-svg-vg4BByo4v4rxfgu5 .activeCritText1,#mermaid-svg-vg4BByo4v4rxfgu5 .activeCritText2,#mermaid-svg-vg4BByo4v4rxfgu5 .activeCritText3{fill:#000 !important}#mermaid-svg-vg4BByo4v4rxfgu5 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vg4BByo4v4rxfgu5 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-vg4BByo4v4rxfgu5 g.classGroup text .title{font-weight:bolder}#mermaid-svg-vg4BByo4v4rxfgu5 g.clickable{cursor:pointer}#mermaid-svg-vg4BByo4v4rxfgu5 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-vg4BByo4v4rxfgu5 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-vg4BByo4v4rxfgu5 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-vg4BByo4v4rxfgu5 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-vg4BByo4v4rxfgu5 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-vg4BByo4v4rxfgu5 .dashed-line{stroke-dasharray:3}#mermaid-svg-vg4BByo4v4rxfgu5 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-vg4BByo4v4rxfgu5 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-vg4BByo4v4rxfgu5 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-vg4BByo4v4rxfgu5 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-vg4BByo4v4rxfgu5 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-vg4BByo4v4rxfgu5 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-vg4BByo4v4rxfgu5 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-vg4BByo4v4rxfgu5 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-vg4BByo4v4rxfgu5 .commit-id,#mermaid-svg-vg4BByo4v4rxfgu5 .commit-msg,#mermaid-svg-vg4BByo4v4rxfgu5 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vg4BByo4v4rxfgu5 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vg4BByo4v4rxfgu5 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vg4BByo4v4rxfgu5 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vg4BByo4v4rxfgu5 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-vg4BByo4v4rxfgu5 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-vg4BByo4v4rxfgu5 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-vg4BByo4v4rxfgu5 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-vg4BByo4v4rxfgu5 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-vg4BByo4v4rxfgu5 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-vg4BByo4v4rxfgu5 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-vg4BByo4v4rxfgu5 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-vg4BByo4v4rxfgu5 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-vg4BByo4v4rxfgu5 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-vg4BByo4v4rxfgu5 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-vg4BByo4v4rxfgu5 .edgeLabel text{fill:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-vg4BByo4v4rxfgu5 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-vg4BByo4v4rxfgu5 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-vg4BByo4v4rxfgu5 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-vg4BByo4v4rxfgu5 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-vg4BByo4v4rxfgu5 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-vg4BByo4v4rxfgu5 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-vg4BByo4v4rxfgu5 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-vg4BByo4v4rxfgu5 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-vg4BByo4v4rxfgu5 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-vg4BByo4v4rxfgu5 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-vg4BByo4v4rxfgu5 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-vg4BByo4v4rxfgu5 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-vg4BByo4v4rxfgu5 .note-edge{stroke-dasharray:5}#mermaid-svg-vg4BByo4v4rxfgu5 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-vg4BByo4v4rxfgu5 .error-icon{fill:#522}#mermaid-svg-vg4BByo4v4rxfgu5 .error-text{fill:#522;stroke:#522}#mermaid-svg-vg4BByo4v4rxfgu5 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-vg4BByo4v4rxfgu5 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-vg4BByo4v4rxfgu5 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-vg4BByo4v4rxfgu5 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-vg4BByo4v4rxfgu5 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-vg4BByo4v4rxfgu5 .marker{fill:#333}#mermaid-svg-vg4BByo4v4rxfgu5 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-vg4BByo4v4rxfgu5 {color: rgba(0, 0, 0, 0.75);font: ;}

PCIe初始化并行状态迁移
收到初始化完成消息
主处理器复位
主处理器PCIe未初始化
主处理器PCIe已初始化
收到初始化完成消息
收到从处理器复位消息
从处理器PCIe未初始化
从处理器PCIe已初始化

汇总的状态迁移过程如下所示。

#mermaid-svg-6X2wHJTTYsknh9SP .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-6X2wHJTTYsknh9SP .label text{fill:#333}#mermaid-svg-6X2wHJTTYsknh9SP .node rect,#mermaid-svg-6X2wHJTTYsknh9SP .node circle,#mermaid-svg-6X2wHJTTYsknh9SP .node ellipse,#mermaid-svg-6X2wHJTTYsknh9SP .node polygon,#mermaid-svg-6X2wHJTTYsknh9SP .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-6X2wHJTTYsknh9SP .node .label{text-align:center;fill:#333}#mermaid-svg-6X2wHJTTYsknh9SP .node.clickable{cursor:pointer}#mermaid-svg-6X2wHJTTYsknh9SP .arrowheadPath{fill:#333}#mermaid-svg-6X2wHJTTYsknh9SP .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-6X2wHJTTYsknh9SP .flowchart-link{stroke:#333;fill:none}#mermaid-svg-6X2wHJTTYsknh9SP .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-6X2wHJTTYsknh9SP .edgeLabel rect{opacity:0.9}#mermaid-svg-6X2wHJTTYsknh9SP .edgeLabel span{color:#333}#mermaid-svg-6X2wHJTTYsknh9SP .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-6X2wHJTTYsknh9SP .cluster text{fill:#333}#mermaid-svg-6X2wHJTTYsknh9SP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-6X2wHJTTYsknh9SP .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-6X2wHJTTYsknh9SP text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-6X2wHJTTYsknh9SP .actor-line{stroke:grey}#mermaid-svg-6X2wHJTTYsknh9SP .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-6X2wHJTTYsknh9SP .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-6X2wHJTTYsknh9SP #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-6X2wHJTTYsknh9SP .sequenceNumber{fill:#fff}#mermaid-svg-6X2wHJTTYsknh9SP #sequencenumber{fill:#333}#mermaid-svg-6X2wHJTTYsknh9SP #crosshead path{fill:#333;stroke:#333}#mermaid-svg-6X2wHJTTYsknh9SP .messageText{fill:#333;stroke:#333}#mermaid-svg-6X2wHJTTYsknh9SP .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-6X2wHJTTYsknh9SP .labelText,#mermaid-svg-6X2wHJTTYsknh9SP .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-6X2wHJTTYsknh9SP .loopText,#mermaid-svg-6X2wHJTTYsknh9SP .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-6X2wHJTTYsknh9SP .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-6X2wHJTTYsknh9SP .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-6X2wHJTTYsknh9SP .noteText,#mermaid-svg-6X2wHJTTYsknh9SP .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-6X2wHJTTYsknh9SP .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-6X2wHJTTYsknh9SP .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-6X2wHJTTYsknh9SP .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-6X2wHJTTYsknh9SP .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6X2wHJTTYsknh9SP .section{stroke:none;opacity:0.2}#mermaid-svg-6X2wHJTTYsknh9SP .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-6X2wHJTTYsknh9SP .section2{fill:#fff400}#mermaid-svg-6X2wHJTTYsknh9SP .section1,#mermaid-svg-6X2wHJTTYsknh9SP .section3{fill:#fff;opacity:0.2}#mermaid-svg-6X2wHJTTYsknh9SP .sectionTitle0{fill:#333}#mermaid-svg-6X2wHJTTYsknh9SP .sectionTitle1{fill:#333}#mermaid-svg-6X2wHJTTYsknh9SP .sectionTitle2{fill:#333}#mermaid-svg-6X2wHJTTYsknh9SP .sectionTitle3{fill:#333}#mermaid-svg-6X2wHJTTYsknh9SP .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6X2wHJTTYsknh9SP .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-6X2wHJTTYsknh9SP .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6X2wHJTTYsknh9SP .grid path{stroke-width:0}#mermaid-svg-6X2wHJTTYsknh9SP .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-6X2wHJTTYsknh9SP .task{stroke-width:2}#mermaid-svg-6X2wHJTTYsknh9SP .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6X2wHJTTYsknh9SP .taskText:not([font-size]){font-size:11px}#mermaid-svg-6X2wHJTTYsknh9SP .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6X2wHJTTYsknh9SP .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-6X2wHJTTYsknh9SP .task.clickable{cursor:pointer}#mermaid-svg-6X2wHJTTYsknh9SP .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-6X2wHJTTYsknh9SP .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-6X2wHJTTYsknh9SP .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-6X2wHJTTYsknh9SP .taskText0,#mermaid-svg-6X2wHJTTYsknh9SP .taskText1,#mermaid-svg-6X2wHJTTYsknh9SP .taskText2,#mermaid-svg-6X2wHJTTYsknh9SP .taskText3{fill:#fff}#mermaid-svg-6X2wHJTTYsknh9SP .task0,#mermaid-svg-6X2wHJTTYsknh9SP .task1,#mermaid-svg-6X2wHJTTYsknh9SP .task2,#mermaid-svg-6X2wHJTTYsknh9SP .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-6X2wHJTTYsknh9SP .taskTextOutside0,#mermaid-svg-6X2wHJTTYsknh9SP .taskTextOutside2{fill:#000}#mermaid-svg-6X2wHJTTYsknh9SP .taskTextOutside1,#mermaid-svg-6X2wHJTTYsknh9SP .taskTextOutside3{fill:#000}#mermaid-svg-6X2wHJTTYsknh9SP .active0,#mermaid-svg-6X2wHJTTYsknh9SP .active1,#mermaid-svg-6X2wHJTTYsknh9SP .active2,#mermaid-svg-6X2wHJTTYsknh9SP .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-6X2wHJTTYsknh9SP .activeText0,#mermaid-svg-6X2wHJTTYsknh9SP .activeText1,#mermaid-svg-6X2wHJTTYsknh9SP .activeText2,#mermaid-svg-6X2wHJTTYsknh9SP .activeText3{fill:#000 !important}#mermaid-svg-6X2wHJTTYsknh9SP .done0,#mermaid-svg-6X2wHJTTYsknh9SP .done1,#mermaid-svg-6X2wHJTTYsknh9SP .done2,#mermaid-svg-6X2wHJTTYsknh9SP .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-6X2wHJTTYsknh9SP .doneText0,#mermaid-svg-6X2wHJTTYsknh9SP .doneText1,#mermaid-svg-6X2wHJTTYsknh9SP .doneText2,#mermaid-svg-6X2wHJTTYsknh9SP .doneText3{fill:#000 !important}#mermaid-svg-6X2wHJTTYsknh9SP .crit0,#mermaid-svg-6X2wHJTTYsknh9SP .crit1,#mermaid-svg-6X2wHJTTYsknh9SP .crit2,#mermaid-svg-6X2wHJTTYsknh9SP .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-6X2wHJTTYsknh9SP .activeCrit0,#mermaid-svg-6X2wHJTTYsknh9SP .activeCrit1,#mermaid-svg-6X2wHJTTYsknh9SP .activeCrit2,#mermaid-svg-6X2wHJTTYsknh9SP .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-6X2wHJTTYsknh9SP .doneCrit0,#mermaid-svg-6X2wHJTTYsknh9SP .doneCrit1,#mermaid-svg-6X2wHJTTYsknh9SP .doneCrit2,#mermaid-svg-6X2wHJTTYsknh9SP .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-6X2wHJTTYsknh9SP .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-6X2wHJTTYsknh9SP .milestoneText{font-style:italic}#mermaid-svg-6X2wHJTTYsknh9SP .doneCritText0,#mermaid-svg-6X2wHJTTYsknh9SP .doneCritText1,#mermaid-svg-6X2wHJTTYsknh9SP .doneCritText2,#mermaid-svg-6X2wHJTTYsknh9SP .doneCritText3{fill:#000 !important}#mermaid-svg-6X2wHJTTYsknh9SP .activeCritText0,#mermaid-svg-6X2wHJTTYsknh9SP .activeCritText1,#mermaid-svg-6X2wHJTTYsknh9SP .activeCritText2,#mermaid-svg-6X2wHJTTYsknh9SP .activeCritText3{fill:#000 !important}#mermaid-svg-6X2wHJTTYsknh9SP .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6X2wHJTTYsknh9SP g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-6X2wHJTTYsknh9SP g.classGroup text .title{font-weight:bolder}#mermaid-svg-6X2wHJTTYsknh9SP g.clickable{cursor:pointer}#mermaid-svg-6X2wHJTTYsknh9SP g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-6X2wHJTTYsknh9SP g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-6X2wHJTTYsknh9SP .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-6X2wHJTTYsknh9SP .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-6X2wHJTTYsknh9SP .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-6X2wHJTTYsknh9SP .dashed-line{stroke-dasharray:3}#mermaid-svg-6X2wHJTTYsknh9SP #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-6X2wHJTTYsknh9SP #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-6X2wHJTTYsknh9SP #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-6X2wHJTTYsknh9SP #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-6X2wHJTTYsknh9SP #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-6X2wHJTTYsknh9SP #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-6X2wHJTTYsknh9SP #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-6X2wHJTTYsknh9SP #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-6X2wHJTTYsknh9SP .commit-id,#mermaid-svg-6X2wHJTTYsknh9SP .commit-msg,#mermaid-svg-6X2wHJTTYsknh9SP .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6X2wHJTTYsknh9SP .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6X2wHJTTYsknh9SP .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6X2wHJTTYsknh9SP g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6X2wHJTTYsknh9SP g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-6X2wHJTTYsknh9SP g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-6X2wHJTTYsknh9SP g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-6X2wHJTTYsknh9SP g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-6X2wHJTTYsknh9SP g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-6X2wHJTTYsknh9SP .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-6X2wHJTTYsknh9SP .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-6X2wHJTTYsknh9SP .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-6X2wHJTTYsknh9SP .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-6X2wHJTTYsknh9SP .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-6X2wHJTTYsknh9SP .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-6X2wHJTTYsknh9SP .edgeLabel text{fill:#333}#mermaid-svg-6X2wHJTTYsknh9SP .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6X2wHJTTYsknh9SP .node circle.state-start{fill:black;stroke:black}#mermaid-svg-6X2wHJTTYsknh9SP .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-6X2wHJTTYsknh9SP #statediagram-barbEnd{fill:#9370db}#mermaid-svg-6X2wHJTTYsknh9SP .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-6X2wHJTTYsknh9SP .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-6X2wHJTTYsknh9SP .statediagram-state .divider{stroke:#9370db}#mermaid-svg-6X2wHJTTYsknh9SP .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-6X2wHJTTYsknh9SP .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-6X2wHJTTYsknh9SP .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-6X2wHJTTYsknh9SP .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-6X2wHJTTYsknh9SP .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-6X2wHJTTYsknh9SP .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-6X2wHJTTYsknh9SP .note-edge{stroke-dasharray:5}#mermaid-svg-6X2wHJTTYsknh9SP .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-6X2wHJTTYsknh9SP .error-icon{fill:#522}#mermaid-svg-6X2wHJTTYsknh9SP .error-text{fill:#522;stroke:#522}#mermaid-svg-6X2wHJTTYsknh9SP .edge-thickness-normal{stroke-width:2px}#mermaid-svg-6X2wHJTTYsknh9SP .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-6X2wHJTTYsknh9SP .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-6X2wHJTTYsknh9SP .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-6X2wHJTTYsknh9SP .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-6X2wHJTTYsknh9SP .marker{fill:#333}#mermaid-svg-6X2wHJTTYsknh9SP .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-6X2wHJTTYsknh9SP {color: rgba(0, 0, 0, 0.75);font: ;}

PCIe初始化整体状态迁移
非最后一个PCIe初始化完成消息到来
最后一个PCIe初始化完成消息到来
主处理器复位/从处理器复位消息到来
PCIe部分初始化完成
PCIe全部初始化完成

对照正确的状态迁移过程,果然发现了问题——从处理器的PCIe初始化状态机出现了问题。

错误的状态转换如下图所示。

#mermaid-svg-Jy6DdS6WNu1tuUsi .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .label text{fill:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .node rect,#mermaid-svg-Jy6DdS6WNu1tuUsi .node circle,#mermaid-svg-Jy6DdS6WNu1tuUsi .node ellipse,#mermaid-svg-Jy6DdS6WNu1tuUsi .node polygon,#mermaid-svg-Jy6DdS6WNu1tuUsi .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Jy6DdS6WNu1tuUsi .node .label{text-align:center;fill:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .node.clickable{cursor:pointer}#mermaid-svg-Jy6DdS6WNu1tuUsi .arrowheadPath{fill:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-Jy6DdS6WNu1tuUsi .flowchart-link{stroke:#333;fill:none}#mermaid-svg-Jy6DdS6WNu1tuUsi .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-Jy6DdS6WNu1tuUsi .edgeLabel rect{opacity:0.9}#mermaid-svg-Jy6DdS6WNu1tuUsi .edgeLabel span{color:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-Jy6DdS6WNu1tuUsi .cluster text{fill:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-Jy6DdS6WNu1tuUsi .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Jy6DdS6WNu1tuUsi text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-Jy6DdS6WNu1tuUsi .actor-line{stroke:grey}#mermaid-svg-Jy6DdS6WNu1tuUsi .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .sequenceNumber{fill:#fff}#mermaid-svg-Jy6DdS6WNu1tuUsi #sequencenumber{fill:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi #crosshead path{fill:#333;stroke:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .messageText{fill:#333;stroke:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Jy6DdS6WNu1tuUsi .labelText,#mermaid-svg-Jy6DdS6WNu1tuUsi .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-Jy6DdS6WNu1tuUsi .loopText,#mermaid-svg-Jy6DdS6WNu1tuUsi .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-Jy6DdS6WNu1tuUsi .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-Jy6DdS6WNu1tuUsi .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Jy6DdS6WNu1tuUsi .noteText,#mermaid-svg-Jy6DdS6WNu1tuUsi .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-Jy6DdS6WNu1tuUsi .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-Jy6DdS6WNu1tuUsi .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-Jy6DdS6WNu1tuUsi .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-Jy6DdS6WNu1tuUsi .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Jy6DdS6WNu1tuUsi .section{stroke:none;opacity:0.2}#mermaid-svg-Jy6DdS6WNu1tuUsi .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-Jy6DdS6WNu1tuUsi .section2{fill:#fff400}#mermaid-svg-Jy6DdS6WNu1tuUsi .section1,#mermaid-svg-Jy6DdS6WNu1tuUsi .section3{fill:#fff;opacity:0.2}#mermaid-svg-Jy6DdS6WNu1tuUsi .sectionTitle0{fill:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .sectionTitle1{fill:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .sectionTitle2{fill:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .sectionTitle3{fill:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Jy6DdS6WNu1tuUsi .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-Jy6DdS6WNu1tuUsi .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Jy6DdS6WNu1tuUsi .grid path{stroke-width:0}#mermaid-svg-Jy6DdS6WNu1tuUsi .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-Jy6DdS6WNu1tuUsi .task{stroke-width:2}#mermaid-svg-Jy6DdS6WNu1tuUsi .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Jy6DdS6WNu1tuUsi .taskText:not([font-size]){font-size:11px}#mermaid-svg-Jy6DdS6WNu1tuUsi .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Jy6DdS6WNu1tuUsi .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-Jy6DdS6WNu1tuUsi .task.clickable{cursor:pointer}#mermaid-svg-Jy6DdS6WNu1tuUsi .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Jy6DdS6WNu1tuUsi .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Jy6DdS6WNu1tuUsi .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Jy6DdS6WNu1tuUsi .taskText0,#mermaid-svg-Jy6DdS6WNu1tuUsi .taskText1,#mermaid-svg-Jy6DdS6WNu1tuUsi .taskText2,#mermaid-svg-Jy6DdS6WNu1tuUsi .taskText3{fill:#fff}#mermaid-svg-Jy6DdS6WNu1tuUsi .task0,#mermaid-svg-Jy6DdS6WNu1tuUsi .task1,#mermaid-svg-Jy6DdS6WNu1tuUsi .task2,#mermaid-svg-Jy6DdS6WNu1tuUsi .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-Jy6DdS6WNu1tuUsi .taskTextOutside0,#mermaid-svg-Jy6DdS6WNu1tuUsi .taskTextOutside2{fill:#000}#mermaid-svg-Jy6DdS6WNu1tuUsi .taskTextOutside1,#mermaid-svg-Jy6DdS6WNu1tuUsi .taskTextOutside3{fill:#000}#mermaid-svg-Jy6DdS6WNu1tuUsi .active0,#mermaid-svg-Jy6DdS6WNu1tuUsi .active1,#mermaid-svg-Jy6DdS6WNu1tuUsi .active2,#mermaid-svg-Jy6DdS6WNu1tuUsi .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-Jy6DdS6WNu1tuUsi .activeText0,#mermaid-svg-Jy6DdS6WNu1tuUsi .activeText1,#mermaid-svg-Jy6DdS6WNu1tuUsi .activeText2,#mermaid-svg-Jy6DdS6WNu1tuUsi .activeText3{fill:#000 !important}#mermaid-svg-Jy6DdS6WNu1tuUsi .done0,#mermaid-svg-Jy6DdS6WNu1tuUsi .done1,#mermaid-svg-Jy6DdS6WNu1tuUsi .done2,#mermaid-svg-Jy6DdS6WNu1tuUsi .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-Jy6DdS6WNu1tuUsi .doneText0,#mermaid-svg-Jy6DdS6WNu1tuUsi .doneText1,#mermaid-svg-Jy6DdS6WNu1tuUsi .doneText2,#mermaid-svg-Jy6DdS6WNu1tuUsi .doneText3{fill:#000 !important}#mermaid-svg-Jy6DdS6WNu1tuUsi .crit0,#mermaid-svg-Jy6DdS6WNu1tuUsi .crit1,#mermaid-svg-Jy6DdS6WNu1tuUsi .crit2,#mermaid-svg-Jy6DdS6WNu1tuUsi .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-Jy6DdS6WNu1tuUsi .activeCrit0,#mermaid-svg-Jy6DdS6WNu1tuUsi .activeCrit1,#mermaid-svg-Jy6DdS6WNu1tuUsi .activeCrit2,#mermaid-svg-Jy6DdS6WNu1tuUsi .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-Jy6DdS6WNu1tuUsi .doneCrit0,#mermaid-svg-Jy6DdS6WNu1tuUsi .doneCrit1,#mermaid-svg-Jy6DdS6WNu1tuUsi .doneCrit2,#mermaid-svg-Jy6DdS6WNu1tuUsi .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-Jy6DdS6WNu1tuUsi .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-Jy6DdS6WNu1tuUsi .milestoneText{font-style:italic}#mermaid-svg-Jy6DdS6WNu1tuUsi .doneCritText0,#mermaid-svg-Jy6DdS6WNu1tuUsi .doneCritText1,#mermaid-svg-Jy6DdS6WNu1tuUsi .doneCritText2,#mermaid-svg-Jy6DdS6WNu1tuUsi .doneCritText3{fill:#000 !important}#mermaid-svg-Jy6DdS6WNu1tuUsi .activeCritText0,#mermaid-svg-Jy6DdS6WNu1tuUsi .activeCritText1,#mermaid-svg-Jy6DdS6WNu1tuUsi .activeCritText2,#mermaid-svg-Jy6DdS6WNu1tuUsi .activeCritText3{fill:#000 !important}#mermaid-svg-Jy6DdS6WNu1tuUsi .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Jy6DdS6WNu1tuUsi g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-Jy6DdS6WNu1tuUsi g.classGroup text .title{font-weight:bolder}#mermaid-svg-Jy6DdS6WNu1tuUsi g.clickable{cursor:pointer}#mermaid-svg-Jy6DdS6WNu1tuUsi g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Jy6DdS6WNu1tuUsi g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Jy6DdS6WNu1tuUsi .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-Jy6DdS6WNu1tuUsi .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-Jy6DdS6WNu1tuUsi .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Jy6DdS6WNu1tuUsi .dashed-line{stroke-dasharray:3}#mermaid-svg-Jy6DdS6WNu1tuUsi #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Jy6DdS6WNu1tuUsi #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Jy6DdS6WNu1tuUsi #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Jy6DdS6WNu1tuUsi #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Jy6DdS6WNu1tuUsi #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Jy6DdS6WNu1tuUsi #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Jy6DdS6WNu1tuUsi #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Jy6DdS6WNu1tuUsi #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Jy6DdS6WNu1tuUsi .commit-id,#mermaid-svg-Jy6DdS6WNu1tuUsi .commit-msg,#mermaid-svg-Jy6DdS6WNu1tuUsi .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Jy6DdS6WNu1tuUsi .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Jy6DdS6WNu1tuUsi .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Jy6DdS6WNu1tuUsi g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Jy6DdS6WNu1tuUsi g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-Jy6DdS6WNu1tuUsi g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-Jy6DdS6WNu1tuUsi g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Jy6DdS6WNu1tuUsi g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Jy6DdS6WNu1tuUsi .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Jy6DdS6WNu1tuUsi .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-Jy6DdS6WNu1tuUsi .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-Jy6DdS6WNu1tuUsi .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Jy6DdS6WNu1tuUsi .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-Jy6DdS6WNu1tuUsi .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-Jy6DdS6WNu1tuUsi .edgeLabel text{fill:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Jy6DdS6WNu1tuUsi .node circle.state-start{fill:black;stroke:black}#mermaid-svg-Jy6DdS6WNu1tuUsi .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-Jy6DdS6WNu1tuUsi #statediagram-barbEnd{fill:#9370db}#mermaid-svg-Jy6DdS6WNu1tuUsi .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Jy6DdS6WNu1tuUsi .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-Jy6DdS6WNu1tuUsi .statediagram-state .divider{stroke:#9370db}#mermaid-svg-Jy6DdS6WNu1tuUsi .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-Jy6DdS6WNu1tuUsi .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-Jy6DdS6WNu1tuUsi .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-Jy6DdS6WNu1tuUsi .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-Jy6DdS6WNu1tuUsi .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-Jy6DdS6WNu1tuUsi .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-Jy6DdS6WNu1tuUsi .note-edge{stroke-dasharray:5}#mermaid-svg-Jy6DdS6WNu1tuUsi .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-Jy6DdS6WNu1tuUsi .error-icon{fill:#522}#mermaid-svg-Jy6DdS6WNu1tuUsi .error-text{fill:#522;stroke:#522}#mermaid-svg-Jy6DdS6WNu1tuUsi .edge-thickness-normal{stroke-width:2px}#mermaid-svg-Jy6DdS6WNu1tuUsi .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-Jy6DdS6WNu1tuUsi .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-Jy6DdS6WNu1tuUsi .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-Jy6DdS6WNu1tuUsi .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-Jy6DdS6WNu1tuUsi .marker{fill:#333}#mermaid-svg-Jy6DdS6WNu1tuUsi .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-Jy6DdS6WNu1tuUsi {color: rgba(0, 0, 0, 0.75);font: ;}

从处理器PCIe初始化错误状态迁移
收到初始化完成消息
【注】这条转换丢失
从处理器的PCIe未初始化
从处理器的PCIe已初始化

定位发现错误的静态Flag变量使用导致了从处理器PCIe设备初始化的状态迁移出现错误——缺失了一个状态转换流程。这会导致什么问题呢?反正这个转换一般也不会发生啊,初始化完了就跑着完事儿了呗。

但是BUG通常不会出现,不代表永远不会出现。我们使用的从处理器恰恰就有个毛病——极低概率的出现自动复位。此时,主处理器发现与从处理器的心跳丢失,会重新走一遍PCIe设备的初始化流程。但是,但是,问题就出现了——从处理器的PCIe状态还是已经初始化化完成,而真实的状态是可能初始化完成了,也可能还没有初始化完成——主处理器已经无法准确掌握从处理器PCIe初始化的状态了。

从而,主处理器上汇总的状态迁移也跟随出现了问题,如下图所示。

#mermaid-svg-fpPZuIHPUe1WruxG .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-fpPZuIHPUe1WruxG .label text{fill:#333}#mermaid-svg-fpPZuIHPUe1WruxG .node rect,#mermaid-svg-fpPZuIHPUe1WruxG .node circle,#mermaid-svg-fpPZuIHPUe1WruxG .node ellipse,#mermaid-svg-fpPZuIHPUe1WruxG .node polygon,#mermaid-svg-fpPZuIHPUe1WruxG .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-fpPZuIHPUe1WruxG .node .label{text-align:center;fill:#333}#mermaid-svg-fpPZuIHPUe1WruxG .node.clickable{cursor:pointer}#mermaid-svg-fpPZuIHPUe1WruxG .arrowheadPath{fill:#333}#mermaid-svg-fpPZuIHPUe1WruxG .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-fpPZuIHPUe1WruxG .flowchart-link{stroke:#333;fill:none}#mermaid-svg-fpPZuIHPUe1WruxG .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-fpPZuIHPUe1WruxG .edgeLabel rect{opacity:0.9}#mermaid-svg-fpPZuIHPUe1WruxG .edgeLabel span{color:#333}#mermaid-svg-fpPZuIHPUe1WruxG .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-fpPZuIHPUe1WruxG .cluster text{fill:#333}#mermaid-svg-fpPZuIHPUe1WruxG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-fpPZuIHPUe1WruxG .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-fpPZuIHPUe1WruxG text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-fpPZuIHPUe1WruxG .actor-line{stroke:grey}#mermaid-svg-fpPZuIHPUe1WruxG .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-fpPZuIHPUe1WruxG .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-fpPZuIHPUe1WruxG #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-fpPZuIHPUe1WruxG .sequenceNumber{fill:#fff}#mermaid-svg-fpPZuIHPUe1WruxG #sequencenumber{fill:#333}#mermaid-svg-fpPZuIHPUe1WruxG #crosshead path{fill:#333;stroke:#333}#mermaid-svg-fpPZuIHPUe1WruxG .messageText{fill:#333;stroke:#333}#mermaid-svg-fpPZuIHPUe1WruxG .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-fpPZuIHPUe1WruxG .labelText,#mermaid-svg-fpPZuIHPUe1WruxG .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-fpPZuIHPUe1WruxG .loopText,#mermaid-svg-fpPZuIHPUe1WruxG .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-fpPZuIHPUe1WruxG .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-fpPZuIHPUe1WruxG .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-fpPZuIHPUe1WruxG .noteText,#mermaid-svg-fpPZuIHPUe1WruxG .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-fpPZuIHPUe1WruxG .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-fpPZuIHPUe1WruxG .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-fpPZuIHPUe1WruxG .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-fpPZuIHPUe1WruxG .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fpPZuIHPUe1WruxG .section{stroke:none;opacity:0.2}#mermaid-svg-fpPZuIHPUe1WruxG .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-fpPZuIHPUe1WruxG .section2{fill:#fff400}#mermaid-svg-fpPZuIHPUe1WruxG .section1,#mermaid-svg-fpPZuIHPUe1WruxG .section3{fill:#fff;opacity:0.2}#mermaid-svg-fpPZuIHPUe1WruxG .sectionTitle0{fill:#333}#mermaid-svg-fpPZuIHPUe1WruxG .sectionTitle1{fill:#333}#mermaid-svg-fpPZuIHPUe1WruxG .sectionTitle2{fill:#333}#mermaid-svg-fpPZuIHPUe1WruxG .sectionTitle3{fill:#333}#mermaid-svg-fpPZuIHPUe1WruxG .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fpPZuIHPUe1WruxG .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-fpPZuIHPUe1WruxG .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fpPZuIHPUe1WruxG .grid path{stroke-width:0}#mermaid-svg-fpPZuIHPUe1WruxG .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-fpPZuIHPUe1WruxG .task{stroke-width:2}#mermaid-svg-fpPZuIHPUe1WruxG .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fpPZuIHPUe1WruxG .taskText:not([font-size]){font-size:11px}#mermaid-svg-fpPZuIHPUe1WruxG .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fpPZuIHPUe1WruxG .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-fpPZuIHPUe1WruxG .task.clickable{cursor:pointer}#mermaid-svg-fpPZuIHPUe1WruxG .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-fpPZuIHPUe1WruxG .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-fpPZuIHPUe1WruxG .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-fpPZuIHPUe1WruxG .taskText0,#mermaid-svg-fpPZuIHPUe1WruxG .taskText1,#mermaid-svg-fpPZuIHPUe1WruxG .taskText2,#mermaid-svg-fpPZuIHPUe1WruxG .taskText3{fill:#fff}#mermaid-svg-fpPZuIHPUe1WruxG .task0,#mermaid-svg-fpPZuIHPUe1WruxG .task1,#mermaid-svg-fpPZuIHPUe1WruxG .task2,#mermaid-svg-fpPZuIHPUe1WruxG .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-fpPZuIHPUe1WruxG .taskTextOutside0,#mermaid-svg-fpPZuIHPUe1WruxG .taskTextOutside2{fill:#000}#mermaid-svg-fpPZuIHPUe1WruxG .taskTextOutside1,#mermaid-svg-fpPZuIHPUe1WruxG .taskTextOutside3{fill:#000}#mermaid-svg-fpPZuIHPUe1WruxG .active0,#mermaid-svg-fpPZuIHPUe1WruxG .active1,#mermaid-svg-fpPZuIHPUe1WruxG .active2,#mermaid-svg-fpPZuIHPUe1WruxG .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-fpPZuIHPUe1WruxG .activeText0,#mermaid-svg-fpPZuIHPUe1WruxG .activeText1,#mermaid-svg-fpPZuIHPUe1WruxG .activeText2,#mermaid-svg-fpPZuIHPUe1WruxG .activeText3{fill:#000 !important}#mermaid-svg-fpPZuIHPUe1WruxG .done0,#mermaid-svg-fpPZuIHPUe1WruxG .done1,#mermaid-svg-fpPZuIHPUe1WruxG .done2,#mermaid-svg-fpPZuIHPUe1WruxG .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-fpPZuIHPUe1WruxG .doneText0,#mermaid-svg-fpPZuIHPUe1WruxG .doneText1,#mermaid-svg-fpPZuIHPUe1WruxG .doneText2,#mermaid-svg-fpPZuIHPUe1WruxG .doneText3{fill:#000 !important}#mermaid-svg-fpPZuIHPUe1WruxG .crit0,#mermaid-svg-fpPZuIHPUe1WruxG .crit1,#mermaid-svg-fpPZuIHPUe1WruxG .crit2,#mermaid-svg-fpPZuIHPUe1WruxG .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-fpPZuIHPUe1WruxG .activeCrit0,#mermaid-svg-fpPZuIHPUe1WruxG .activeCrit1,#mermaid-svg-fpPZuIHPUe1WruxG .activeCrit2,#mermaid-svg-fpPZuIHPUe1WruxG .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-fpPZuIHPUe1WruxG .doneCrit0,#mermaid-svg-fpPZuIHPUe1WruxG .doneCrit1,#mermaid-svg-fpPZuIHPUe1WruxG .doneCrit2,#mermaid-svg-fpPZuIHPUe1WruxG .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-fpPZuIHPUe1WruxG .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-fpPZuIHPUe1WruxG .milestoneText{font-style:italic}#mermaid-svg-fpPZuIHPUe1WruxG .doneCritText0,#mermaid-svg-fpPZuIHPUe1WruxG .doneCritText1,#mermaid-svg-fpPZuIHPUe1WruxG .doneCritText2,#mermaid-svg-fpPZuIHPUe1WruxG .doneCritText3{fill:#000 !important}#mermaid-svg-fpPZuIHPUe1WruxG .activeCritText0,#mermaid-svg-fpPZuIHPUe1WruxG .activeCritText1,#mermaid-svg-fpPZuIHPUe1WruxG .activeCritText2,#mermaid-svg-fpPZuIHPUe1WruxG .activeCritText3{fill:#000 !important}#mermaid-svg-fpPZuIHPUe1WruxG .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fpPZuIHPUe1WruxG g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-fpPZuIHPUe1WruxG g.classGroup text .title{font-weight:bolder}#mermaid-svg-fpPZuIHPUe1WruxG g.clickable{cursor:pointer}#mermaid-svg-fpPZuIHPUe1WruxG g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-fpPZuIHPUe1WruxG g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-fpPZuIHPUe1WruxG .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-fpPZuIHPUe1WruxG .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-fpPZuIHPUe1WruxG .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-fpPZuIHPUe1WruxG .dashed-line{stroke-dasharray:3}#mermaid-svg-fpPZuIHPUe1WruxG #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-fpPZuIHPUe1WruxG #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-fpPZuIHPUe1WruxG #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-fpPZuIHPUe1WruxG #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-fpPZuIHPUe1WruxG #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-fpPZuIHPUe1WruxG #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-fpPZuIHPUe1WruxG #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-fpPZuIHPUe1WruxG #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-fpPZuIHPUe1WruxG .commit-id,#mermaid-svg-fpPZuIHPUe1WruxG .commit-msg,#mermaid-svg-fpPZuIHPUe1WruxG .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fpPZuIHPUe1WruxG .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fpPZuIHPUe1WruxG .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fpPZuIHPUe1WruxG g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fpPZuIHPUe1WruxG g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-fpPZuIHPUe1WruxG g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-fpPZuIHPUe1WruxG g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-fpPZuIHPUe1WruxG g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-fpPZuIHPUe1WruxG g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-fpPZuIHPUe1WruxG .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-fpPZuIHPUe1WruxG .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-fpPZuIHPUe1WruxG .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-fpPZuIHPUe1WruxG .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-fpPZuIHPUe1WruxG .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-fpPZuIHPUe1WruxG .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-fpPZuIHPUe1WruxG .edgeLabel text{fill:#333}#mermaid-svg-fpPZuIHPUe1WruxG .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-fpPZuIHPUe1WruxG .node circle.state-start{fill:black;stroke:black}#mermaid-svg-fpPZuIHPUe1WruxG .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-fpPZuIHPUe1WruxG #statediagram-barbEnd{fill:#9370db}#mermaid-svg-fpPZuIHPUe1WruxG .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-fpPZuIHPUe1WruxG .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-fpPZuIHPUe1WruxG .statediagram-state .divider{stroke:#9370db}#mermaid-svg-fpPZuIHPUe1WruxG .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-fpPZuIHPUe1WruxG .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-fpPZuIHPUe1WruxG .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-fpPZuIHPUe1WruxG .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-fpPZuIHPUe1WruxG .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-fpPZuIHPUe1WruxG .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-fpPZuIHPUe1WruxG .note-edge{stroke-dasharray:5}#mermaid-svg-fpPZuIHPUe1WruxG .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-fpPZuIHPUe1WruxG .error-icon{fill:#522}#mermaid-svg-fpPZuIHPUe1WruxG .error-text{fill:#522;stroke:#522}#mermaid-svg-fpPZuIHPUe1WruxG .edge-thickness-normal{stroke-width:2px}#mermaid-svg-fpPZuIHPUe1WruxG .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-fpPZuIHPUe1WruxG .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-fpPZuIHPUe1WruxG .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-fpPZuIHPUe1WruxG .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-fpPZuIHPUe1WruxG .marker{fill:#333}#mermaid-svg-fpPZuIHPUe1WruxG .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-fpPZuIHPUe1WruxG {color: rgba(0, 0, 0, 0.75);font: ;}

PCIe初始化整体状态迁移出现错误
非最后一个PCIe初始化完成消息到来
最后一个【主处理器】PCIe初始化完成消息到来
主处理器复位/从处理器复位消息到来
PCIe部分初始化完成
PCIe全部初始化完成

所以,从处理器异常复位之后,只要主处理器上的PCIe设备初始化完成后,主处理器根本就不会再理睬从处理器的PCIe初始化是否完成了,它此时就会认为所有的PCIe设备初始化已经完成,直接就发送Msg3了,但此时,PCIe有可能还没有初始化完成,因此就会出现文章开头提到的问题了。


至此,问题已经分析和定位清楚了,但是在编写代码时为什么会出现这样看似并不高级的失误呢?——是错用了静态Flag变量导致的。

错误代码如下。g_pcie_init_flag变量使用不恰当,因为这个变量编程者意在记录初始化次数,所以根本就没考虑到处理器有复位情况,即使考虑到了复位情况,那这个变量是清零还是不清零呢,是不是混用变量很尴尬?记录次数就记录次数,就不要再用作状态机变量,混用很危险 ,即使是最细节的变量使用也要遵循 职责单一设计原则

/*定义全局变量,记录主处理器和从处理各进程PCIe初始化次数*/
unsigned int g_pcie_init_flag[10] = {0}; /* 主处理器上的主进程(p0)消息处理代码 */
...
case PCIE_INIT_FNISH: /* 主处理器上的各进程和从处理器使用同一个消息号 */
{if(从处理器进程Id == pMsgHeader->srcProcId){/*就是这个变量使用不恰当,记录次数就记录次数;就不要再用作状态机变量(混用很危险)*/g_pcie_init_flag[从处理器进程索引]++; }if (pMsgHeader->srcProcId 属于 主处理器进程Id){/*主处理器上的进程使用这个变量还没有出问题的原因是主处理器复位之后该变量会自动清0。但是也不排除PCIe设备复位但是处理器不复位的情况在后续出现,所以这里也是雷区*/g_pcie_init_flag[主处理器进程索引]++; }if(g_pcie_init_flag[从处理器进程索引] >= 1 && g_pcie_init_flag[主处理器进程索引] >= 1){发送Msg3;}break;
}
...

3 问题解决

问题根因找到之后,解决起来就容易了。

PCIe初始化消息处理代码修改如下:

/*定义全局变量,记录主处理器和从处理各进程PCIe初始化次数*/
unsigned int g_pcie_init_times[10] = {0};
unsigned int g_pcie_init_state[10] = {0}; /* 主处理器上的主进程(p0)消息处理代码 */
...
case PCIE_INIT_FNISH: /* 主处理器上的各进程和从处理器使用同一个消息号 */
{if(从处理器进程Id == pMsgHeader->srcProcId){g_pcie_init_times[从处理器进程索引]++; g_pcie_init_state[从处理器进程索引] = 1;}if (pMsgHeader->srcProcId 属于 主处理器进程Id){g_pcie_init_times[主处理器进程索引]++; g_pcie_init_state[主处理器进程索引] = 1;}if(g_pcie_init_state[从处理器进程索引]  && g_pcie_init_state[主处理器进程索引]){触发发送Msg3的流程;}break;
}
...

增加从处理器异常复位流程处理逻辑如下:

/* 主处理器处理从处理器异常复位流程 */
if 从处理器心跳丢失 && 从处理器重新启动 /*主处理器会重新走一遍PCIe设备初始化流程*/
{g_pcie_init_state[从处理器进程索引] = 0; /* 补充丢失的状态迁移 */g_pcie_init_state[主处理器进程索引] = 0; /* 这里也同步给主进程的初始化状态清零(因为主处理器也会重新走一遍初始化流程)*/
}

4 复盘

状态机标识变量一定要随着状态迁移而变化,不变化的不要用来指示当前状态。

职责不同的变量不要混用,混用很危险 ,变量使用也要遵循 职责单一设计原则

借此问题将控制流程的变量使用方式总结如下:

  1. 事件标记和传递。函数内部进行事件传递,可以使用动态变量,也可以使用静态变量。这种情况下尽量将变量的生命周期控制的尽量短。
  2. 状态记录和标识。标识状态只能使用静态变量,否则函数第二次被调用时标识状态的内存已经被释放了。使用状态标识最最危险的一种情况是——实际状态已经改变,但是状态标识未跟随改变。

恭喜你又坚持看完了一篇博客,又进步了一点点!如果感觉还不错就点个赞再走吧,你的点赞和关注将是我持续输出的哒哒哒动力~~

随手记——静态Flag变量使用不规范导致的重大流程错误相关推荐

  1. 关于私有变量,静态私有变量

    有权访问私有变量和私有函数的公有方法称之为特权方法,对象上创建特权方法的方式有两种. 第一种:直接在构造函数中定义特权方法,基本模式如下 function MyObject(){var private ...

  2. 静态局部变量和静态全程变量static。

    1. 什么是static? static 是 C/C++ 中很常用的修饰符,它被用来控制变量的存储方式和可见性. 1.1 static 的引入 我们知道在函数内部定义的变量,当程序执行到它的定义处时, ...

  3. Mybatis使用时因jdbcType类型大小写书写不规范导致的异常

    Mybatis使用时因jdbcType类型大小写书写不规范导致的异常 参考文章: (1)Mybatis使用时因jdbcType类型大小写书写不规范导致的异常 (2)https://www.cnblog ...

  4. 【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )

    文章目录 总结 一.静态闭包变量 1.执行普通闭包变量 2.执行静态闭包变量 二. 在闭包中定义闭包 三. 完整代码示例 总结 在闭包中 , 打印 this , owner , delegate , ...

  5. Java(静态)变量和(静态)代码块的执行顺序

    为什么80%的码农都做不了架构师?>>>    本文讨论Java中(静态)变量.(静态)代码块的执行顺序 首先创建3个类: //1.Foo类,用于打印变量 public class ...

  6. PHP类的静态(static)方法和静态(static)变量使用介绍

    在php中,访问类的方法/变量有两种方法: 1. 创建对象$object = new Class(),然后使用"->"调用:$object->attribute/fun ...

  7. 夹具PHP,PHP类的静态(static)方法和静态(static)变量

    在php中,访问类的方法/变量有两种方法: 1. 创建对象$object = new Class(),然后使用"->"调用:$object->attribute/fun ...

  8. 【C语言】全局变量、本地变量、静态本地变量(书写规范代码,正确定义变量,防止未知错误)

    参考中国大学MOOC 浙江大学翁恺C语言程序设计在线课程 作用域:一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域. 生存期:从对象分配到内存开始, ...

  9. java c static,java-是否可以禁用静态最终变量的javac内联?

    java-是否可以禁用静态最终变量的javac内联? Java静态编译器(javac)内联一些静态最终变量,并将值直接带到常量池中. 考虑以下示例. A类定义了一些常量(公共静态最终变量): publ ...

最新文章

  1. 【代码笔记】Web-CSS-CSS 链接(link)
  2. LiveVideoStackCon讲师热身分享 ( 十二 ) —— 微博短视频高并发架构
  3. UFLDL教程:Exercise:PCA in 2D PCA and Whitening
  4. mysql文件_mysql 的各种文件详细说明
  5. MyBatis简单了解
  6. font-awesome在Vue项目中的使用(npm使用)
  7. 4python小项目---# 体脂率计算
  8. 8700k能装服务器系统吗6,i7 8700k能装win7吗?搭配b365主板装win7操作步骤
  9. 计算机ram代表,RAM是什么
  10. android源码编译1
  11. 微软的surface pro5充电指示灯亮,但充不进去电的原因
  12. 两个年月日怎么相减_(excle可以计算日期差值吗)excel表中,两个日期相减如何得出相差年月...
  13. 让你眼前一亮的3. Tomcat 性能调优 (值得收藏)
  14. docker安装redis及验证
  15. IT青年们如何突围?要接地气
  16. 菜鸟教程离线PDF下载地址整理
  17. 极大似然函数 matlab,科学网—matlab实现:基于极大似然估计的混合分布参数估计(LM洪峰流量) - 曾杭的博文...
  18. 三人抢答器-20151105
  19. 什么是U盘量产工具?
  20. Jav 入门篇(35)方法引用

热门文章

  1. 消防工程师 第二篇 建筑防火 6.1 安全疏散
  2. js移动端rem.js自适应布局代码
  3. kali Linux的 安装详细步骤
  4. xff_referer知识
  5. BurpSuite配置抓取HTTPS数据包
  6. oracle cosh 函数,oracle cosh exp floor in log等函数
  7. install - graph-tool
  8. 【linux kernel】一文总结initramfs的使用
  9. win7系统无法激活问题
  10. java实用教程第五版电子书,爱了爱了