Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
easyflash
easyflash 写入多条log保存到flash成功,读取多条失败
发布于 2025-04-11 12:45:37 浏览:39
订阅该版
在VScode开发软件上,基于GD32F103VC移植完成了RT_Thread Nano 3.0.3后,领导突然要求在W25Q16JV芯片里面保存日志。 我第一时间想到了easyflash,因为很多人都在推,所以我就用了。 按照教程,我只需要log保存功能,使能EF_USING_LOG,ENV跟IAP暂时不需要,所以全部屏蔽了。 ```c #ifndef EF_CFG_H_ #define EF_CFG_H_ /* using ENV function, default is NG (Next Generation) mode start from V4.0 */ // #define EF_USING_ENV #ifdef EF_USING_ENV /* Auto update ENV to latest default when current ENV version number is changed. */ /* #define EF_ENV_AUTO_UPDATE */ /** * ENV version number defined by user. * Please change it when your firmware add a new ENV to default_env_set. */ #define EF_ENV_VER_NUM /* @note you must define it for a value, such as 0 */ /* MCU Endian Configuration, default is Little Endian Order. */ /* #define EF_BIG_ENDIAN */ #endif /* EF_USING_ENV */ /* using IAP function */ /* #define EF_USING_IAP */ /* using save log function */ #define EF_USING_LOG /* The minimum size of flash erasure. May be a flash sector size. */ #define EF_ERASE_MIN_SIZE 4096 /* @note you must define it for a value */ /* the flash write granularity, unit: bit * only support 1(nor flash)/ 8(stm32f4)/ 32(stm32f1) */ #define EF_WRITE_GRAN 1 /* @note you must define it for a value */ /* * * This all Backup Area Flash storage index. All used flash area configure is under here. * |----------------------------| Storage Size * | Environment variables area | ENV area size @see ENV_AREA_SIZE * |----------------------------| * | Saved log area | Log area size @see LOG_AREA_SIZE * |----------------------------| * |(IAP)Downloaded application | IAP already downloaded application, unfixed size * |----------------------------| * * @note all area sizes must be aligned with EF_ERASE_MIN_SIZE * * The EasyFlash add the NG (Next Generation) mode start from V4.0. All old mode before V4.0, called LEGACY mode. * * - NG (Next Generation) mode is default mode from V4.0. It's easy to settings, only defined the ENV_AREA_SIZE. * - The LEGACY mode has been DEPRECATED. It is NOT RECOMMENDED to continue using. * Beacuse it will use ram to buffer the ENV and spend more flash erase times. * If you want use it please using the V3.X version. */ /* backup area start address */ #define EF_START_ADDR (0) /* @note you must define it for a value */ /* ENV area size. It's at least one empty sector for GC. So it's definition must more then or equal 2 flash sector size. */ // #define ENV_AREA_SIZE (2 * EF_ERASE_MIN_SIZE) /* @note you must define it for a value if you used ENV */ /* saved log area size */ #define LOG_AREA_SIZE (200 * EF_ERASE_MIN_SIZE) /* @note you must define it for a value if you used log */ // 不大于512个sector,W25Q16JV共有32个block,每个block有16个sector,每个sector有4096大小 /* print debug information of flash */ // #define PRINT_DEBUG #endif /* EF_CFG_H_ */ ``` 然后在ef_port.c里面移植实现了ef_port_read,ef_port_write,ef_port_erase,ef_port_init等函数,单独测试都没有问题。 我使用的easyflash通过API读取,提示EasyFlash V4.1.99 is initialize success. 直接使用ef_port_write写一条log,ef_port_read读一条log,都没有问题。 但是使用ef_port_write写多条log,ef_port_read读多条log,一直只显示最初的log,后面的全部都不见了。 ```c //要写入到W25Q16的字符串数组 const uint8_t TEXT_Buffer[]={"CFdino SPI TEST"}; const uint8_t TEXT_Buffer1[]={"CF dino SPI TEST111"}; const uint8_t TEXT_Buffer2[]={"CF dino SPI TEST222"}; const uint8_t TEXT_Buffer3[]={"CF dino SPI TEST333"}; #define SIZE sizeof(TEXT_Buffer) #define SIZE1 sizeof(TEXT_Buffer1) #define SIZE2 sizeof(TEXT_Buffer2) #define SIZE3 sizeof(TEXT_Buffer3) ef_log_clean(); rt_thread_delay(5000); rt_kprintf("\rstart write\r\n"); ID = ef_log_write((uint32_t*)TEXT_Buffer,SIZE); // 写入log rt_kprintf("\rTEXT_Buffer:%d\r\n",ID); rt_thread_delay(5); ID = ef_log_write((uint32_t*)TEXT_Buffer1,SIZE1); // 写入log rt_thread_delay(5); rt_kprintf("\rTEXT_Buffer1:%d\r\n",ID); ID = ef_log_write((uint32_t*)TEXT_Buffer2,SIZE2); // 写入log rt_thread_delay(5); rt_kprintf("\rTEXT_Buffer2:%d\r\n",ID); ID = ef_log_write((uint32_t*)TEXT_Buffer3,SIZE3); // 写入log rt_thread_delay(5); rt_kprintf("\rTEXT_Buffer3:%d\r\n",ID); ef_log_read(0,(uint32_t*)datatemp,SIZE); //从倒数第0个索引处开始,读出SIZE个字节 rt_thread_delay(500); rt_kprintf("index0 data1:%s\r\n",datatemp); ef_log_read(1,(uint32_t*)datatemp,SIZE1); //从倒数第1个索引处开始,读出SIZE个字节 // rt_thread_delay(500); rt_kprintf("index1 data2:%s\r\n",datatemp); ef_log_read(2,(uint32_t*)datatemp,SIZE2); //从倒数第2个索引处开始,读出SIZE个字节 rt_thread_delay(500); rt_kprintf("index2 data3:%s\r\n",datatemp); ef_log_read(3,(uint32_t*)datatemp,SIZE3); //从倒数第3个索引处开始,读出SIZE个字节 rt_thread_delay(500); rt_kprintf("index3 data4:%s\r\n",datatemp); ``` 结果读出来的 index0 datatemp1:CFdino SPI TEST ```c index0 data1:CFdino SPI TEST index1 data2:Fdino SPI TEST index2 data3:dino SPI TEST index3 data4:ino SPI TEST ``` 我以为是写入失败,然后通过ef_log_get_used_size去拿了一下保存的日志长度。12+16+20+20+20 = 88. 长度没有问题。然后通过ef_log_read(0,(uint32_t*)datatemp,88);去读取88个长度,结果还是读出来CFdino SPI TEST,后面的全部没有了。 然后通过ef_port.c里面的ef_port_read去读88个,结果也是CFdino SPI TEST。 通过自己实现的w25q16_read函数去读88个长度,结果也是CFdino SPI TEST。 ```c void W25QXX_Read(uint8_t *pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { uint16_t i; FLASH_CS_RESET; // 使能器件 spi_transfer(0x03); // 发送读取命令 spi_transfer((uint8_t)((ReadAddr) >> 16)); // 发送24bit地址 spi_transfer((uint8_t)((ReadAddr) >> 8)); spi_transfer((uint8_t)ReadAddr); for (i = 0; i < NumByteToRead; i++) { pBuffer[i] = spi_transfer(0XFF); // 循环读数 } FLASH_CS_SET; } ``` 请问如何才能正常读取多条log。
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
39
关于作者
zhczlzhang
这家伙很懒,什么也没写!
提问
2
回答
0
被采纳
0
关注TA
发私信
相关问题
1
easyflash 用来存储 传感器定时采样的数据适不适合?
2
easyflash存放于fat文件系统中,但是会擦除文件系统
3
EasyFlash移植失败,硬件发生错误?
4
easyflash demo擦写完数据后再上电就挂了?
5
easyflash初始化env无法自动写入默认环境变量?
6
有在STM32L4上用easyflash的么?请教个问题
7
[已解决] easyflash 使用内部 flash 无法保存参数
8
FAL 上的FlashDB、EasyFlash、EasyLogger调试经历
9
easyflash存储问题
10
easyflash可以用来存储300个小文件且能够按照日期分类检索吗?
推荐文章
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
RT-Thread 屏蔽在线软件包的方法
2
RT-Thread OS应用开发实战线上师资培训通知
3
【ci】【github】【bsp】RT-Thread仓库的CI自动编译测试
4
免费解锁MCU超能力!4月AIoT实战培训三城巡演
5
rt-thread主仓 BSP瘦身指南
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
cubemx
ESP8266
WIZnet_W5500
UART
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
GD32
定时器
ADC
flashDB
编译报错
socket
中断
rt_mq_消息队列_msg_queue
keil_MDK
Debug
SFUD
msh
ulog
C++_cpp
at_device
本月问答贡献
聚散无由
4
个答案
3
次被采纳
RTT_逍遥
4
个答案
2
次被采纳
踩姑娘的小蘑菇
6
个答案
1
次被采纳
a1012112796
4
个答案
1
次被采纳
YZRD
3
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
7
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部