当前位置: 首页 > news >正文

FileX和ThreadX精简版

FILEX精简版

  • 合并函数级源文件到整个类级源文件

原版Filex和Threadx是每个函数一个文件,(我能想到的好处是方便做单元测试,也可能功能安全认证方便点?)这样在windows环境下编译速度会提高一些(编译一个c/cpp文件都会创建一个gcc进程,win下创建进程开销略大),链接时也不会看到一长串的obj文件。
2025-10-11_162646

  • 文件时间戳改为C库函数提供的API

FAT类文件系统时间戳的注意事项:
1:秒的位宽只有5bit,因此1LSB=2秒。
2:年的位宽为7bit,基准点是1980,localtime_r返回的年份基准点是1900,算出真实年份后需要判断下时间是否早于1980年,防止减成负数。
tm_new.tm_year += 1900
if(tm_new.tm_year < FX_BASE_YEAR) {
tm_new.tm_year = FX_BASE_YEAR;
}
(tm_new.tm_year - FX_BASE_YEAR) << FX_YEAR_SHIFT
3:使用C库中的time相关函数需要自行实现C库依赖的桩函数(localtime_r, asctime_r这些),对接到自己芯片平台的RTC驱动,这部分可以参考RTThread用newlib的实现。

// fx_system.c
VOID _fx_system_time_update(VOID) {time_t now;struct tm tm_new;/* get current time */now = time(NULL);/* converts calendar time into local time. */localtime_r(&now, &tm_new);tm_new.tm_year += 1900;tm_new.tm_mon++;if(tm_new.tm_year < FX_BASE_YEAR) {tm_new.tm_year = FX_BASE_YEAR;}/* Set the system date.  */_fx_system_date =  ((tm_new.tm_year - FX_BASE_YEAR) << FX_YEAR_SHIFT) |(tm_new.tm_mon << FX_MONTH_SHIFT) | tm_new.tm_mday;/* Set the new system time.  */_fx_system_time  =  (tm_new.tm_hour << FX_HOUR_SHIFT) |(tm_new.tm_min << FX_MINUTE_SHIFT) | (tm_new.tm_sec / 2);
}
  • 修改互斥锁为CMSIS API的实现

原版Filex使用的是自家ThreadX的互斥锁实现,这里换成了CMSIS API标准的实现,CMSIS API有很多不同操作系统的封装层,底层可以是FreeRTOS,RTX等,自由度更高一些。

// fx_api.h
typedef struct FX_MEDIA_STRUCT {
// ...
#ifndef FX_SINGLE_THREADosMutexId_t            fx_media_protect;
#endif
// ...
}

引用互斥锁进行资源保护在fx_port.h中的宏函数FX_PROTECT和FX_UNPROTECT

// fx_port.h
#if defined(FX_SINGLE_THREAD) || defined(FX_STANDALONE_ENABLE)
#define FX_PROTECT                   
#define FX_UNPROTECT
#else
#define FX_PROTECT                      if (media_ptr -> fx_media_id != FX_MEDIA_ID) return(FX_MEDIA_NOT_OPEN); \else if (osMutexAcquire(media_ptr->fx_media_protect, osWaitForever) != osOK) return(FX_MEDIA_NOT_OPEN);
#define FX_UNPROTECT                    osMutexRelease(media_ptr->fx_media_protect);
#endif
  • 存储器驱动移植

文件系统需要依赖存储介质驱动接口进行数据持久化
FILEX只需要实现一个函数原型:void fx_sdcard_driver(FX_MEDIA *media),函数名称任意,入参FX_MEDIA指针,在fx_media_open传入函数指针即可。
驱动函数中判断media->fx_media_driver_request的不同类型进行操作分发:

FX_DRIVER_READ 读取扇区
数据缓冲区指针media->fx_media_driver_buffer和文件读写位置和长度相关,不能保证是4字节对齐,如果SDIO驱动中使用DMA传输,由于大部分芯片SDIO的DMA控制器要求地址指针4字节对齐,因此不能直接将这个缓冲区指针传给DMA控制器。先判断fx_media_driver_buffer是否在4字节边界,不对齐的情况需要先读到本地缓冲区,再复制给media->fx_media_driver_buffer。
单次读取扇区数量media->fx_media_driver_sectors的最大值由配置文件fx_user.h的FX_MAX_SECTOR_CACHE宏指定,假设FX_MAX_SECTOR_CACHE=2,那么最大的DMA本地缓冲区的大小也是固定的1KB。

FX_DRIVER_WRITE 写扇区
和读扇区一样,需要对fx_media_driver_buffer对齐情况进行检查,满足对齐要求可以直接将指针传给DMA控制器,不满足仍需要读到本地缓冲区再拷贝一遍。

FX_DRIVER_INIT 初始化
只会在fx_media_open时调用一次

FX_DRIVER_RELEASE_SECTORS 释放扇区
SD/TF卡模拟的是512字节/扇区的块设备,写入前不需要擦除,但这里也可以调用SD卡的擦除扇区指令,告诉SD卡主控该扇区废弃,主动做垃圾回收。

FX_DRIVER_BOOT_WRITE 写引导扇区
实际上就是将MBR主引导程序和分区表写到存储器的第0扇区。

本地下载:
https://files.cnblogs.com/files/blogs/575121/filex_v6.4.1_lite.zip
GitHub仓库:

http://www.rkmt.cn/news/19165.html

相关文章:

  • ue4素材场景 - MKT
  • 阅读《构建之法》的思考与问题
  • 2025年9月22日优雅草蜻蜓I通讯水银版4.1.9版本正式发布-完成所有服务升级版本重构升级-修复大量漏洞-优化启动步骤-卓伊凡|bigniu|麻子|贝贝| - 指南
  • count down 84 days - 详解
  • AWS自然语言处理技术实战指南
  • 10.12~10.18随笔
  • 面向对象的题目
  • [HZOI] CSP-S模拟29
  • 二三阶行列式
  • CHAR与VARCHAR深度解析:MySQL字符类型选择指南与性能对比
  • vivo霸榜背后:以技术打赢用户保卫战
  • securityCTF 2025 pwn方向题解
  • 02020507 EF Core高级07-悲观并发控制、乐观并发控制、EF Core连接MySQL、RowVersion
  • 完整教程:游标查询在对话历史场景下的独特优势
  • [论文笔记] A Contemporary Survey of Large Language Model Assisted Program Analysis
  • C语言入门教程 | 第一讲:C语言零基础入门教程:第一个代码到变量运算详解
  • 【AI算力架构设计分析】1000PetaOps 算力云计算系统设计方案(大模型训练推理专项版)
  • 未来计划
  • NOIP2023
  • 概率论习题
  • 2025上海经侦律师TOP5榜单:专业法律服务与高效解决方案
  • 概率论部分习题
  • 完整教程:《机器学习与深度学习》入门
  • 「解题报告」蓝桥杯2013省AB 错误票据
  • 时时想起 寸步难行 叩问自己 无人回应 若我离去 若我死去 枯萎于这幽暗的井底 长眠不醒
  • 完整教程:计算机毕业设计免费领源码-教师教学进度管理及建议系统的设计与实现
  • 战略、运营、经营三循环:企业卓越绩效的密码 - 智慧园区
  • tcpdump 使用详解 - 教程
  • 2025农机带实力厂家推荐:浙江三星胶带,品质卓越供货无忧!
  • 2025风机盘管优质厂家推荐:洛卡尔环境科技,高效节能首选!