DSP

DSP的冷启动vs热启动

2019-07-13 11:17发布

第一次写博客,应该会有一些瑕疵,后续不断改进吧。以前只是分享别人的东西,现在希望把自己掌握知识分享给大家,希望能坚持下去~~
  1. 什么是处理器的冷启动 vs 热启动?
    冷启动:是处理器的一种启动方式,就是切断处理器的供电电源,重新启动,一旦冷启动,内存的东西全部丢失。
    热启动:热启动通常是由于系统复位造成的系统重启,如硬件看门狗复位、软件看门狗复位、内存越界访问造成的重启等。
  2. 为什么要区分冷启动 vs 热启动?意义何在?
    冷启动的主要工作及此时系统设计目标。通常情况下,对于嵌入式系统而言,冷启动需要对系统整体进行初始配置,包括但不限于硬件寄存器配置、软件变量初始化、上电自检(内存、NVRAM、通信总线、AD、IO……)、记录产品上电信息(上电次数、上电自检结果……)等,产品设计的第一目标是保证系统初次上电拥有一个良好的初始状态。即使有问题也要争取在初始阶段暴漏,而禁止产品“带病”运行。当然,执行这些操作需要耗费一定的启动时间,这是系统设计需要必须付出的代价。
    热启动通常是由于复位造成的系统重启、软件的重新运行,如硬件看门狗、软件看门狗等造成的复位。针对热启动,产品设计的第一目标是尽快使系统恢复到热启动之前的状态,并保持产品处于受控状态。因此,部分冷启动时所做的设计操作可能不需要或者也不允许再次进行,否则可能造成不必要的系统异常发生。这里举一个AD电压采集问题的简单例子,用以说明为什么要区分冷启动和热启动。
    (1)如果冷启动时电压采集变量初始化为0,热启动时电压采集变量也初始化为0。这样可能会产生以下的问题:物理连接的电压始终没有变化(如保持28VDC),仅仅由于处理器的复位造成采集的电压值产生跳变28VDC—>0—>28VDC。
    (2)冷启动时电压采集变量初始化为0,热启动时电压采集变量初始化为启动前的状态。这样就可以避免上述电压采样值的跳变问题。
    上述问题的解决方法可能不知一种,比如滤波、将数据记录在FLASH中等等,但实际应用情况可能比较复杂(比如电压数据记在FLASH中,那么是否需要实时记录电压数据?——耗费系统时间;产品下电后,第二次启动是否会误读该数据?),在此不展开讨论。
  3. 冷启动、热启动的区分方法有哪些?
    区分方法一:利用处理器内部RAM物理特性,采用软件编程方法
    实现原理:处理器内部RAM保存的数据掉电丢失,处理器复位时数据不会丢失,利用该特点进行冷启动、热启动的区分。
    实现步骤:(不能插入流程图,只能写伪代码了……)
void main (void) { // 1.硬件初始化 HardwareInit(); // 2.获取启动方式:冷启动vs热启动 const int StartupPasswordArray[] = "Magic Number"; int GetArray[] = ReadMemory("指定的未使用的内存地址"); if(GetArray!= StartupPasswordArray) { WriteMemory("指定的未使用的内存地址", StartupPasswordArray); return "冷启动"; } else { return "热启动"; } ...... } 优点:不需要额外的硬件资源,即可区分冷启动和热启动,实现方法简单。
缺点:可靠性取决于Magic Number的复杂度,在实际应用中,设置了32位长度数据,经实际应用暂未发现问题。
区分方法二:借助CPLD或者FPGA等逻辑器件实现
实现原理:在逻辑器件内部建立CPU可以读写的地址空间(例如Address = 0xA0000000),通过该地址空间的数值区分冷启动VS热启动。 编写CPLD逻辑实现,产品冷启动时Address 地址上锁存的数据为InitValue = 0x1111;热启动该值保持不变。
实现步骤: const unsigned int InitValue = 0x1111; // 默认逻辑地址数据 int SystemStartupMode = 0; // 系统启动方式定义 void main(void) { // 1.硬件初始化 HardwareInit(); // 2.判定系统启动方式:冷启动VS热启动 unsigned int StartupValue = ReadCpldMemory(Address); if(InitValue == StartupValue ) { SystemStartupMode = "冷启动"; WriteCpldMemory(Address, InitValue*2); } else { SystemStartupMode = "热启动"; } ....... } 优点:区分处理器的冷启动、热启动更加安全、可靠。
缺点:需要CPLD或者FPGA外围器件支持。 仅供参考,希望大家多多交流。