在聊到复位的时候总会区分两个概念:硬复位和软复位。
硬复位就是通常所说的复位,是通过硬件电路或者特殊的硬件信号来触发的复位过程。当拉低外部复位信号时硬复位被触发,复位线会直接影响系统的硬件电路与寄存器,将系统的内部状态恢复到一个已知的初始状态。
硬复位通常是由外部的控制电路或者特定的硬件引脚来触发,例如按下一个复位按钮或者通过特定的电路逻辑条件。
软复位是通过软件的程序代码或者寄存器配置等方式触发的复位过程。当软复位被触发时,系统一般需要执行特定的步骤来响应软复位需求,确认进入待复位状态后才会进入复位流程,将系统的内部状态恢复到一个已知的初始状态。软复位通常是在程序执行中的某个特定条件下发生,例如检测到一个错误或者需要重新初始化系统时。
硬复位一般是整芯片甚至芯片组复位,这个过程可以说是比较简单粗暴的。而软复位一般是芯片的部分系统进行复位重启,有时也称为快速复位、动态复位、配置复位,大多是通过一系列的流程来完成的。
本篇中就聊一聊典型的系统软复位流程。
1.触发软复位启动条件。这一般是系统内部或SOC出现了致命的错误比如任务执行超时、总线数据错误或安全机制报错等,上位的MCU或者CPU判断需要对该系统进行软复位操作以恢复功能;
2.停止下发任务。判断需要对系统软复位后,应当从任务层停止下发新的任务,避免系统错误进一步的蔓延影响其他进程;
3.下达软复位请求。请求可能通过配置系统的寄存器或者从控制接口下发使能信号;
4.系统接收到软复位的请求后,需要做出一系列的处理。这时一般有两种方向选择,一种是主动停止工作,比如停止执行接下来的取指、在指令或者卷积层边界停止进一步的计算;另一种是被动停止工作,也就是内部逻辑不停止工作,而通过系统边界的模块响应软复位,进而对内部通路进行阻塞或者假握手假接收等行为使内部被动停止工作。
5.系统边界的模块监听所有通路,等待所有已经发出的请求全部收回应答(典型的比如AW请求收回Bresp,AR请求收回Rdata),这样做的目的是避免本系统的复位对SOC或其他系统产生影响,也避免对解除复位后的本系统产生影响(如未收全,本系统复位解除后总线返回了一笔复位前的Bresp,那本系统直接就乱了);
6.边界的模块收全所有应有的返回信息后,或者未能收全但是到达超时阈值后,系统进入待复位状态;
7.此时如果本系统仍然保留着访问DDR和sram的备份通路,那么上位机可以通过配置寄存器去间接访问内存和寄存器进行保留现场。如果没有规划该功能,则略过这一步骤;
8.上位机配置复位保护寄存器使能复位保护电路,避免系统复位过程中有毛刺或者使能信号扩散到总线或其他系统;
9.上位机配置对系统进行时钟降配或者关断时钟等操作,这个是可选操作,一般来说如果复位保护做的比较严格,这里不对时钟进行处理也没关系;
10.配置复位或拉低系统的复位信号,持续一段时间,这个时间没有太严格的要求,按毫秒计时也没有关系,少的话也得几十拍确保系统内所有寄存器都完成了复位;
11.复位已经完成,之后配置解复位或拉高系统的复位信号,解除系统的复位状态,之后等待一段时间等内部电路稳定下来;
12.配置时钟恢复工作频率或恢复时钟,可选;
13.配置复位保护寄存器解除复位保护,恢复总线连接;
14.可以再等待一段时间后,重新下任务或恢复现场,重启系统完成。
软复位的流程没有特别严格的规定,通常是根据芯片的需求而规划,上面所述也只是经验之谈。不过大抵都遵循停任务 - 收应答 - 断连接 - 复位 - 解复位 - 重连接 - 下任务的思路。
全部0条评论
快来发表一下你的评论吧 !