Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
关于easyflash的宏定义问题
发布于 2019-01-18 09:32:55 浏览:3438
订阅该版
你好: 我导入了fal抽象层,easyflash、ulog、ulog_easyflash插件,并且实现了接口,fal中创建了一个2K大小的eeprom(STM32L系列自带的,支持字节擦除)。编译没有问题,但在在下载打印的时候,不理停留的断言的意思,断言如下(位于ef_env.c 131行) ``` EF_ASSERT(ENV_USER_SETTING_SIZE == ENV_AREA_SIZE);```然后宏定义如下 ``` #define PKG_EASYFLASH_ENV_SETTING_SIZE 2048 #define ENV_USER_SETTING_SIZE (PKG_EASYFLASH_ENV_SETTING_SIZE) #define PKG_EASYFLASH_ERASE_GRAN 1 #define EF_ERASE_MIN_SIZE PKG_EASYFLASH_ERASE_GRAN #define ENV_AREA_SIZE (1 * EF_ERASE_MIN_SIZE) ```其中宏PKG_EASYFLASH_ENV_SETTING_SIZE 应该是ENV的尺寸,我填写eeprom的大小2K,PKG_EASYFLASH_ERASE_GRAN 是最小擦除粒度,可以字节擦除,则填写1bytes 请问为什么要求这两个值相等呢? 然后我只能将其填写成一样的均是2K大小,遇到第二个断言, ```(LOG_AREA_SIZE % EF_ERASE_MIN_SIZE == 0) ``` 要求log空间大小能被最小擦除粒度大小整除(LOG_AREA_SIZE % EF_ERASE_MIN_SIZE == 0),这个断言能够理解,之前将最小擦除粒度改为2K,然后分配给log的宏#define PKG_EASYFLASH_LOG_AREA_SIZE 1024 就不行了,于是将其改成2048进行第三次尝试 这次的断言如下 ```(LOG_AREA_SIZE / EF_ERASE_MIN_SIZE >= 2) has assert failed at ef_log_init.```这次又要求给日志的空间至少是最小擦除粒度的2倍以上,也不理解为啥需要这样的要求呢? 于是最后修改成 ```#define PKG_USING_EASYFLASH #define PKG_EASYFLASH_ENV #define PKG_EASYFLASH_ENV_USING_NORMAL #define PKG_EASYFLASH_ENV_SETTING_SIZE 256 #define PKG_EASYFLASH_LOG #define PKG_EASYFLASH_LOG_AREA_SIZE 1024 #define PKG_EASYFLASH_ERASE_GRAN 256 #define PKG_EASYFLASH_START_ADDR 0 #define PKG_EASYFLASH_DEBUG #define PKG_USING_EASYFLASH_V321 ```[easyflash](https://github.com/armink-rtt-pkgs/EasyFlash)按照这里面readme的配置,第一个断言都没法通过额。能帮我讲解一下第一个和第三个断言和这个参数应该怎么配置合理么
查看更多
7
个回答
默认排序
按发布时间排序
yaomo718
2019-01-18
这家伙很懒,什么也没写!
这个easyflash是为flash准备的,我没有在EEPROM上用过,所以只能给点建议。 因为flash的最小擦除粒度比较大,所以ENV_AREA_SIZE 默认设置为 (1 * EF_ERASE_MIN_SIZE),按照你的设置,应该改为 (2048 * EF_ERASE_MIN_SIZE)才对。
armink
2019-01-19
这家伙很懒,什么也没写!
[https://github.com/armink-rtt-pkgs/EasyFlash/blob/master/docs/zh/port.md#55-%E5%A4%87%E4%BB%BD%E5%8C%BA](https://github.com/armink-rtt-pkgs/EasyFlash/blob/master/docs/zh/port.md#55-%E5%A4%87%E4%BB%BD%E5%8C%BA) 这里有些 EasyFlash 的文档,不知道你看过没有。 日志区要求是两个扇区以上大小想的主要还是交替写入,否则1个扇区满了以后就得执行擦除操作,那么所有日志都会丢失。
hbaokw
2019-08-24
这家伙很懒,什么也没写!
>https://github.com/armink-rtt-pkgs/EasyFlash/blob/master/docs/zh/port.md#55-%E5%A4%87%E4%BB%BD%E5%8C ... --- Hi armink, 请教一个Easyflash参数配置问题,目前我这边MCU的SPI Flash驱动必须按照256字节的单位写入(MCU驱动库还调整不了)。 所欲关于Flash写入粒度,目前只支持下面说明的值: 操作方法:修改EF_WRITE_GRAN宏对应值即可,单位:bit,仅支持:1/8/32/64 这部分如果按照256字节一次的写入,有可能可以自行调整吗? 谢谢!
armink
2019-08-25
这家伙很懒,什么也没写!
>Hi armink, > >请教一个Easyflash参数配置问题,目前我这边MCU的SPI Flash驱动必须按照256字节的单位写入(M ... --- 写入 1bit 或 1byte 时,256bytes 剩余空间试试都写入 0xFF ,然后下次还能继续写入吗?
hbaokw
2019-09-08
这家伙很懒,什么也没写!
>写入 1bit 或 1byte 时,256bytes 剩余空间试试都写入 0xFF ,然后下次还能继续写入吗? ... --- Hi armink, 我们后面使用了RAM模拟的方式以及SPI FRAM模式来测试Easyflash功能,一切都正常,暂时不使用内部只能支持单次256BYTE写入的FLASH来保存KV数据了。 另外调试过程中发现了点问题在ef_load_env()函数中,如果读取的SECTOR信息不对(也就是第一次初始化过程中),每次仅仅发现第一个SECTOR信息不对,然后就返回了,进不到ef_env_set_default()这个函数里,后面发现在read_sector_meta_data()里面sector的信息并没有赋值完成,就通过下面条件返回了,这样因为sector的内存在栈上,里面的数据并不全是0x0或者0xFF,可能造成后续流程判断条件出错: if (sector->magic != SECTOR_MAGIC_WORD) { sector->check_ok = false; return EF_ENV_INIT_FAILED; } 这里我是把条件判断在sector赋值完成后,在进行magic判断,初始化时每次就可以判断出所有的sector没有初始化完成,然后进入ef_env_set_default()流程。 sector->addr = addr; sector->magic = sec_hdr.magic; sector->check_ok = true; /* get other sector meta data */ sector->combined = sec_hdr.combined; sector->status.store = (sector_store_status_t) get_status(sec_hdr.status_table.store, SECTOR_STORE_STATUS_NUM); sector->status.dirty = (sector_dirty_status_t) get_status(sec_hdr.status_table.dirty, SECTOR_DIRTY_STATUS_NUM); /* check magic word 20190908:Henry move here*/ if (sector->magic != SECTOR_MAGIC_WORD) { sector->check_ok = false; return EF_ENV_INIT_FAILED; } 另外在ef_load_env()函数中应该注释掉ef_port_env_lock()以及ef_port_env_unlock(),不然一旦进入ef_env_set_default(),信号量会连续take两次,然后锁住。 目前使用SPI FRAM使用Easyflash4.0一切正常,感谢您的项目,非常好的设计。
hbaokw
2019-09-08
这家伙很懒,什么也没写!
>Hi armink, > >我们后面使用了RAM模拟的方式以及SPI FRAM模式来测试Easyflash功能,一切都正常,暂时不使用 ... --- Hi, 在ef_load_env(void)函数里直接初始化下sector内存值会更简洁了: memset(§or, 0, sizeof(struct sector_meta_data)); 这样就不需要动read_sector_meta_data()函数中的内容。
armink
2019-09-09
这家伙很懒,什么也没写!
>Hi armink, > >我们后面使用了RAM模拟的方式以及SPI FRAM模式来测试Easyflash功能,一切都正常,暂时不使用 ... --- 不错,分析的挺深入的。 1、ef_env_set_default 逻辑现在是这样的 只有 **全部扇区** magic 都不对,才会恢复默认,否则只是会格式化扇区。这样对于用户来说更加安全,避免只坏了一个扇区,其余的数据都出现丢失。不太清楚这样做对你的平台会有什么影响 2、中间的一段 ef_load_env 代码逻辑描述没太看懂,跟最新版好像不太一样,确认下是使用的哪个版本呢? 3、ef_load_env 里的 ef_env_set_default 确实存在 take 两次的问题,我这边用的 mutex 所以没有出现问题,这块代码已经更正,可以试试最新版
撰写答案
登录
注册新账号
关注者
0
被浏览
3.4k
关于作者
lissettecarlr
这家伙很懒,什么也没写!
提问
12
回答
14
被采纳
0
关注TA
发私信
相关问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【请投票】嵌入式大赛Top10排名等你来选!
2
【24嵌入式设计大赛】HPM5300-EVK 网络测速仪
3
RT-Thread Nano 上线ST CubeMX
4
Nordic移植笔记: RT_Thread v5.1.0(基于Nordic nRF52840的ble_app_hids_mouse工程)
5
RT-Thread PWM设备无输出解决办法
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
flash
packages_软件包
cubemx
PWM
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
socket
flashDB
中断
GD32
Debug
编译报错
msh
keil_MDK
C++_cpp
rt_mq_消息队列_msg_queue
ulog
at_device
SFUD
本月问答贡献
出出啊
1515
个答案
342
次被采纳
小小李sunny
1438
个答案
289
次被采纳
张世争
785
个答案
168
次被采纳
crystal266
546
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
6
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部