将数据存储在RAM中

2019-04-14 16:50发布

在一些应用场景下,需要在单片机复位后保存一些数据 。在实现这一目标之前,需要对单片机的启动过程有一个粗略的了解。1.    单片机启动方式1.1    冷启动    单片机的冷启动指的是单片机的上电启动,即单片机在掉电状态下的上电启动。此时单片机RAM中的数据是随机的,可能是0x00或是0xFF,具体与芯片特性有关。
1.2热启动    单片机的热启动指的是单片机在上电状态下,由于看门狗复位、外部复位电路复位等硬件复位,或是软件复位等原因导致的单片机重新启动。热启动时,RAM区的数据是可以被保留的。
2.    数据存储方式2.1    存储到非易失存储区域中    如果需要在冷启动时获取前次存储的数据,那么这个数据只能被存储在EEPROM、Flash等非易失存储介质中。如果需要存储在内部flash中,需要对flash区域的分配有一个充分的了解,避免覆盖掉其他内容。
2.2    存储在RAM中    由于写flash或是EEPROM时存在的读写速度慢、扇区读写寿命有限等问题,在仅仅需要在热启动场景下保存的数据,就可以存储在RAM中。
    需要将数据存储在RAM中时,需要保证启动时RAM区不被重新初始化。如果使用keil,keil会为每款CPU提供一个startup.s的汇编启动代码,用户可以修改其启动过程或是通过如下设置,使指定RAM区域不被初始化:

    指定某一RAM区No Init后,还需要利用__attribute__将要存储的变量指定存储在这一区域:
static uint32_t m_magic_code  __attribute__( ( at( 0x20003FF0), zero_init) );
    这时候查看.map可以看到以下字样:
    下次上电,直接读取该值即可。    这里需要注意的是,凡是存储在no init区域的数据,需要保证其在使用前都是确认过其有效性的。