加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 一、挂载FLASH
    • 二、配置分区
    • 三、下载软件包
    • 四、接口驱动移植
    • 五、测试用例
    • 六、运行
    • 七、结束语
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

RT-thread应用讲解——easyflash

07/09 14:34
3109
阅读需 9 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

在实际的应用中,我们经常需要使用片外flash来保存一些数据,比如设备的一些配置参数,但是如果每个数据都按固定地址和长度读写,就要先把所有数据的地址和长度都分配好,数据量大的话使用起来就很不方便,所以我们需要一个内存管理的应用。

easyflash是一款开源的轻量级嵌入式flash存储器库,方便开发者更加轻松的实现基于flash存储器的常见应用开发。

EasyFlash软件包:http://packages.rt-thread.org/detail.html?package=EasyFlash

一、挂载FLASH

首先我们要把这个片外flash挂载上。这个我之前的教程已经介绍过了,不知道的同学可以先看下我之前的博客:RT-thread应用讲解——norflash

二、配置分区

我们在实际的应用中片外flash可能会同时使用多个功能,比如OTA,easyflash、文件系统等,这个时候为了避免数据冲突,我们就要先把flash分成几个区域。

关于FLASH分区的内容,请参考我另外一篇博客。
RT-thread应用讲解——FLASH分区

提示:如果要把整个外置flash都作为easyflash的话可以不分区。

三、下载软件包

env的使用我就不多说了,已经说过很多次了,可以翻一下我之前的博客。

RT-thread官网上也有很详细的说明。

env使用方法:https://www.rt-thread.org/document/site/programming-manual/env/env/#bsp-menuconfig

打开easyflash软件包。

在这里插入图片描述

配置说明:
在这里插入图片描述

四、接口驱动移植

easyflash软件包不会直接把接口驱动加入到你的工程,因为考虑到每个人的使用情况可能不同,所以只给了一些demo作为参考。我们要把这个demo加到我们的工程里面,这样才是完整的。

1、移植驱动

驱动移植常用的方法有两种。

1:基于fal,有分区。
2:基于SFUD,不分区。

如果你的Flash驱动使用的是上面的其中一种,那么移植EasyFlash将会非常简单。

如果没有使用上面的驱动,请参考 EasyFlash 的 移植文档 进行移植。在 EasyFlash 官方仓库 下有很多 demo,也可以参考。

我这里举的例子的是第1种,基于fal分区,分区方法前面第二点已经讲过了,现在只要移植驱动即可。

第一步:在项目工程文件里面找到EasyFlash软件包下的ports文件夹,复制ef_fal_port.c文件。

在这里插入图片描述

第二步:把复制的ef_fal_port.c文件拷贝到EasyFlash软件包下的src文件夹。

在这里插入图片描述

提示:如果用第2种方法(基于SFUD),可以参考ports文件夹里面的README.md介绍的方法。

2、修改分区名

移植完驱动之后还要根据实际情况修改easyflash使用的分区名称。

打开src目录下的ef_fal_port.c文件,修改分区名。

示例如下:

/* EasyFlash partition name on FAL partition table */
#define FAL_EF_PART_NAME               "easyflash"  // 分区名为easyflash

提示:分区名必须是有效的分区,分区表在fal_cfg.h文件里面FAL_PART_TABLE定义。

3、重新生成工程

在env输入下面的命令,重新生成新的工程。

提示:会使用env的话应该都知道这个操作,不多说了。

scons --target=mdk5

五、测试用例

驱动移植好之后就可以正常运行easyflash了,这个时候可以写一个简单的测试用例来测试数据是否可以正常读写。

参考示例如下:

#include <rtdevice.h>
#include <rtthread.h>
#include <easyflash.h>

#define DBG_TAG "env"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

uint32_t i_boot_times = NULL;
static void env_boot(void);

int env_init(void)
{
    fal_init();

    if(easyflash_init() == EF_NO_ERR)
    {
        /* 演示环境变量功能 */
        env_boot();
    }
}
INIT_ENV_EXPORT(env_init);

static void env_boot(void)
{
    char *c_old_boot_times, c_new_boot_times[11] = {0};

    /* 从环境变量中获取启动次数 */
    c_old_boot_times = ef_get_env("boot_times");
    /* 获取启动次数是否失败 */
    if(c_old_boot_times == RT_NULL)
        c_old_boot_times[0] = '0';

    i_boot_times = atol(c_old_boot_times);
    /* 启动次数加 1 */
    i_boot_times++;
    LOG_D("===============================================");
    LOG_D("The system now boot %d times", i_boot_times);
    LOG_D("===============================================");
    /* 数字转字符串 */
    sprintf(c_new_boot_times, "%d", i_boot_times);
    /* 保存开机次数的值 */
    ef_set_env("boot_times", c_new_boot_times);
    ef_save_env();
}

这个示例记录了设备的重启次数,每次启动的时候会先读取上一次启动的记录,并加1,然后再把启动次数保存到easyflash里面。

六、运行

正常运行的日志如下:

在这里插入图片描述

可以输入以下命令来查看已保存的环境变量。

printenv

在这里插入图片描述

可以输入以下命令来清除已保存的环境变量。

resetenv

七、结束语

好了,关于easyflash的介绍就到这里,如果还有什么问题,欢迎在评论区留言。如果这篇文章能够帮到你,就给我点个赞吧,如果想了解更多RT-thread和单片机的内容,可以关注一下博主,后续我还会继续分享更多的经验给大家。

教程相关源码:https://pan.baidu.com/s/1N2D8dM31deKIqNqaIQfPiA
提取码:7nsx

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
3294-15SURC/S400-A6 1 Everlight Electronics Co Ltd Single Color LED, Brilliant Red, Water Clear, T-1, 3mm, ROHS COMPLIANT PACKAGE-2
暂无数据 查看
KSZ9893RNXC 1 Microchip Technology Inc Ethernet Transceiver

ECAD模型

下载ECAD模型
$7.84 查看
LTC6990IS6#TRMPBF 1 Analog Devices Inc TimerBlox: Voltage Controlled Silicon Oscillator

ECAD模型

下载ECAD模型
$5.58 查看

相关推荐

电子产业图谱