非易失存储

更新时间:2024-01-17 09:28:10下载pdf

SDK 提供非易失存储,用于应用层参数存储。

  • 如果是一次性可编程(OTP)芯片,其存储为 256 字节的 EEPROM。
  • 如果是 Flash 芯片,SDK 层使用 4 KB 的 Flash 存储区域,执行 256 字节增量存储,模仿 EEPROM 效果。

概述

概念介绍

概念 说明
非易失存储 设备掉电之后不会丢失的存储。
增量式存储 由于 Flash 存储每次写入之前需要擦除的特点,当 Flash 资源比较多或者为了考虑存储效率和稳定性的情况下,会采用在新的区域写入的方式,实现信息存储。
例如,应用层总共需要存储的所有变量 256 字节。
  • 非增量存储利用 1 块 256 字节的区域,每次写入之前进行擦除,之后再写。
  • 增量存储占用 256*16 字节的 16 个块,第 1 个区域写过了就写在第 2 个,以此类推,当全部写满时进行一次擦除。

功能描述

对 256 字节的 EEPROM 进行抽象的操作 API。尤其,当实际芯片没有 EEPROM 时,底层利用 256*16 字节进行模拟 EEPROM 实现。

这意味着上层最好只用来存储一些短信息,例如灯的开关状态等,不适合存储大量信息。

数据结构

无对外数据结构,用户无需关注。

接口说明

函数 OPERATE_RET hal_storage_256_read_bytes
(UINT16_T offset, UINT8_T* pdata, UINT8_T len)
-
作用 256 字节的非易失存储读取 -
入参 offset 256 字节 EEPROM 的访问偏移地址
-> pdata 读取的数据存放处
-> len 希望读取的数据长度

函数 OPERATE_RET hal_storage_256_write_bytes
(unsigned short offset, unsigned char* pdata,
unsigned char len)
-
作用 256 字节的非易失存储写入 -
入参 offset 256 字节 EEPROM 的访问偏移地址
-> pdata 待写入的数据
-> len 写入数据长度

offset 的要求如下:

  • HS256_USERoffset < 256
  • offset 必须是 8 的倍数

示例

基线对外 Demo:tuyaos_demo_beaconmesh_peripheral

void app_led_reset_run(beacon_dev_s *beacon_dev){
    static u8 reset_judge_time = 1;
    static u8 state = STATE_NOT_PAIRED;
    static u32 count_1s_time = 0;
    static u32 count_1s = 0;

    u8 cnt;

    if(beacon_dev->state == STATE_PAIRED){
        if(reset_judge_time != 0){//300ms~6S
            if(hal_clock_time_exceed(0,reset_judge_time*300000)){//300MS
                if(reset_judge_time == 1){
                    reset_judge_time = 20;
                    if(0 == hal_storage_256_read_bytes(HS256_USER, &cnt,1)){//success
                        if(cnt > RESET_MAX_CNT)cnt = 0;
                    }else{
                        cnt = 0;
                    }

                    cnt++;
                    if(cnt >= RESET_MAX_CNT){
                        cnt = 0;
                        ty_beacon2_node_reset(0,180000000);
                        //app_led_blink(0xFF);
                        reset_judge_time = 0;
                    }
                    hal_storage_256_write_bytes(HS256_USER, &cnt,1);
                }else if(reset_judge_time == 20){
                    reset_judge_time = 0;
                    cnt = 0;
                    hal_storage_256_write_bytes(HS256_USER, &cnt,1);
                }
            }
        }
    }
}

使用用户区第 1 偏移的 1 字节,存储在短时间内的上电次数,做三次设备重新上下电重置的逻辑。

功能测试

前置条件

打开 Log。

操作步骤

  1. 编写读写代码,查看写入后读出是否正确。
  2. 编写读写代码,查看写入后,断电再上电读取是否正确。
  3. 编写读写代码,进行 10 万次读写,是否正常。

支持与帮助

在开发过程遇到问题,您可以登录 TuyaOS 开发者论坛 TuyaOS-蓝牙设备开发 版块进行沟通咨询。

咨询前建议首先查阅 官方资料 或参考已有帖子,并认真阅读 发帖规范