栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

FAL:Flash 抽象层的使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

FAL:Flash 抽象层的使用

FAL:Flash 抽象层的使用 FAL:Flash 抽象层的使用

官方链接: http://packages.rt-thread.org/detail.html?package=fal.
FAL (Flash Abstraction Layer) Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API (框架图如下所示),并具有以下特性(https://github.com/RT-Thread-packages/fal/blob/master/README_ZH.md):

  1. 支持静态可配置的分区表,并可关联多个 Flash 设备;
  2. 分区表支持 自动装载 。避免在多固件项目,分区表被多次定义的问题;
  3. 代码精简,对操作系统 无依赖 ,可运行于裸机平台,比如对资源有一定要求的 Bootloader;
  4. 统一的操作接口。保证了文件系统、OTA、NVM(例如:EasyFlash) 等对 Flash 有一定依赖的组件,底层 Flash 驱动的可重用性;
  5. 自带基于 Finsh/MSH 的测试命令,可以通过 Shell 按字节寻址的方式操作(读写擦) Flash 或分区,方便开发者进行调试、测试;

还是很好理解的,就是一个中间层,把Flash硬件设备理想化未可操作的对象,这样就不需要管理下层的操作对象是SPI-FLASH还是EEPROM或者片内FLASH了

移植
  1. fal的移植是建立在SFUD的底层驱动上的,所以如果没还没移植好SFUD,看上一篇文章

  2. 一样先下源码。Gitee仓库:https://gitee.com/RT-Thread-Mirror/fal/blob/master/docs/fal_api.md.

  3. 导入工程之后是这样样子的

  4. 注意一下,因为我使用的是SPI-FLASH所以使用fal_flash_sfud_port.c这个.C文件,如果是片内flash请选其他啊,不过一般这个用的多吧

  5. 跟着套路先改fal_cfg.h文件

#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_

#define FAL_DEBUG 1					//启动打印
#define FAL_PART_HAS_TABLE_CFG		//启动设备表
#define FAL_USING_SFUD_PORT			//使用sfud通用串行flash


extern struct fal_flash_dev nor_flash0;


#define FAL_FLASH_DEV_TABLE                                          
{                                                                    
    &nor_flash0,                                                     
}


#ifdef FAL_PART_HAS_TABLE_CFG

#define FAL_PART_TABLE                                                                 
{                                                                                      
    {FAL_PART_MAGIC_WORD,  "fdb_tsdb1",       "norflash0",           0, 1024*1024, 0}, 
    {FAL_PART_MAGIC_WORD,  "fdb_kvdb1",       "norflash0",   1024*1024, 1024*1024, 0}, 
}
#endif 

#endif 

  1. 中间层的主要作用就是把,底层的物理接口抽象化,这里就是把W25Q64抽象成了2个对象,这里称位分区表
  2. FAL_PART_TABLE就是我们定义的分区表了,后期的擦,读,写都是针对分区表来操作的
  3. 自己搞了一个demo试了下
#define FAL_DEMO_TEST_BUFFER_SIZE	128
static uint8_t fal_demo_test_buf[FAL_DEMO_TEST_BUFFER_SIZE];
static void fal_demo(char* partition_name, uint8_t *data,size_t size)
{
	int i,result;
	const struct fal_partition *demo_partition;
	
	//获取分区表指针
	demo_partition = fal_partition_find(partition_name);
	
	//擦除测试
	result = fal_partition_erase( demo_partition,	//分区表名称,所以分区表一定不能重复了
								  0,				//擦除的起始地址
								  size				//擦除的字节长度
								);					//返回接收的实际数量
	if ( result >= 0 ) {
		printf("Fal Erase The partition "fdb_tsdb1" is success...n");
	} else {
		printf("Fal Erase The partition "fdb_tsdb1" is false!!!n");
	}
	
	//写入前赋下初始值
	for(i=0;i= 0 ) {
		printf("Fal write The partition "fdb_tsdb1" is success...n");
	} else {
		printf("Fal write The partition "fdb_tsdb1" is false!!!n");
	}
	
	
	//读取测试
	result = fal_partition_read(demo_partition,		//分区表名称,所以分区表一定不能重复了
								0, 					//在分区表中的地址便宜,注意是分区表
								data,				//接收地址
								size				//接收长度
								);					//返回接收的实际数量
	if ( result >= 0 ) {
		printf("Fal Read The partition "fdb_tsdb1" is success...n");
	} else {
		printf("Fal Read The partition "fdb_tsdb1" is false!!!n");
	}

  1. 这里偷懒了,日志打印的不是很全啊
总结
  1. 关键就是分区表,只要搞清楚了分区表,其他的就都清楚了
  2. 我们是单独使用的fal中间层,没有和Rt-Thread一起使用,没问题可以的
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1006401.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号