STM32F407移植OpenHarmony笔记7
继上一篇笔记,成功启动了liteos_m内核,可以创建线程了,也能看到shell控制台了。
今天研究文件系统,让控制台相关文件命令如mkdir和ls能工作。
liteos_m内核支持fatfs和littlefs两个文件系统,
fatfs适用于SD卡,
littlefs适用于NORFLASH,如W25Qxx系列。
我的板子上刚好有W25Q64,试试接入littlefs文件系统。
基于之前的研究经验,进入make menuconfig看看文件系统相关选项,先把它选上:

当启用文件系统后,LOS_KernelInit会调用OsVfsInit进行初始化,
OsVfsInit又会调用LfsInit初始化littlefs,并把littlefs注册到vfs的类型列表。
那我们怎么使用它呢,怎么让littlefs读写我们的SPIFLASH呢?
经过调查,我们需要使用mount函数,进行挂载操作来绑定文件系统和FLASH设备。
那就在bsp目录新建littlefs.c,参考代码:
#include <stdio.h>
#include "spiflash.h"
#include "lfs.h"
#include "los_fs.h"static int LittlefsRead(int partition, UINT32 *offset, void *buf, UINT32 size)
{spiflash_read(*offset, buf, size);return LFS_ERR_OK;
}static int LittlefsProg(int partition, UINT32 *offset, const void *buf, UINT32 size)
{spiflash_write(*offset, buf, size);return LFS_ERR_OK;
}static int LittlefsErase(int partition, UINT32 offset, UINT32 size)
{spiflash_erase(offset, size);return LFS_ERR_OK;
}static void LittlefsPartiton(void)
{int lens[1]={1024*1024};int addr[1]={0};LOS_DiskPartition("flash0", "littlefs", lens, addr, 1);
}static void LittlefsMount(void)
{int ret;struct PartitionCfg lfs_cfg;lfs_cfg.readFunc = LittlefsRead;lfs_cfg.writeFunc = LittlefsProg;lfs_cfg.eraseFunc = LittlefsErase;lfs_cfg.readSize = 64;lfs_cfg.writeSize = 256;lfs_cfg.blockSize = 4096;lfs_cfg.blockCount = 256;lfs_cfg.cacheSize = 4096;lfs_cfg.partNo = 0;lfs_cfg.lookaheadSize = 64;lfs_cfg.blockCycles = 100;ret = mount(NULL, "/flash", "littlefs", 0, &lfs_cfg);printf("LittlefsInit ret=%d\n", ret);
}int LittlefsInit(void)
{printf("LittlefsInit enter\n");spiflash_init();printf("SPIFLASH flash id=0x%x\n", spiflash_read_id());LittlefsPartiton();LittlefsMount();return LFS_ERR_OK;
}
LittlefsInit函数是初始化文件系统函数,在main里面完成LOS_KernelInit之后再调用。
spiflash_init是我们实现的W25QXX的驱动,W25QXX使用的是STM32F407的SPI接口。
使用HAL库完成SPI驱动,并用SPI读写W25QXX的部分就不在这里过多介绍了。
只要实现spiflash的init(初始化),read(读),write(写),erase(擦除)这4个函数就行。
LittlefsPartiton这个函数是定义1个磁盘分区,不然mount会失败。
具体原因是liteos_m适配的代码lfs_adapter.c里面,littlefs_block_xxx函数要用LfsGetStartAddr来寻找分区超始地址。LfsGetStartAddr会查找我们定义的分区表。
LittlefsMount函数则是调用mount函数,挂载littlefs分区,最后1个参数指定FLASH驱动参数。
mount函数最终会调用lfs_adapter.c里面的LfsMount函数。
LfsMount函数的最后1个参数会被LfsConfigAdapter((struct PartitionCfg *)data, cfg)转换为struct lfs_config结构传递给lfs_mount函数。
其它几个函数则就对FLASH读写操作进行封装就行了。
mount的第2个参数是挂载路径,可以自定义,但是用"/"我这里测试不行,只能是"/xxx"目录。
写完代码,按照之前的方法修改BUILD.gn,一切顺利的话编译通过。
下载到板子,可以看到LittlefsInit ret=0的日志。
敲ls命令,会报错,但是cd /flash切换目录后就没有问题了。

需要读写文件的话,#include<fnctl.h>使用open,read,write,close函数就可以了。
相关文章:
STM32F407移植OpenHarmony笔记7
继上一篇笔记,成功启动了liteos_m内核,可以创建线程了,也能看到shell控制台了。 今天研究文件系统,让控制台相关文件命令如mkdir和ls能工作。 liteos_m内核支持fatfs和littlefs两个文件系统, fatfs适用于SD卡ÿ…...
cortexM c语言和汇编嵌套编程
编程环境是:stm32cubeIde 原因:很多操作需要使用底层来做,比如中断时的上下文数据保存。也就是说用到汇编来实现。 疑问:c语言怎么才能跟汇编很好的兼容在一起呢?必将是我下一步的必经探索之路了。 一、C语言和汇编…...
国外传输大文件必选工具
企业在全球范围内的业务拓展带来了前所未有的机遇,同时也带来了跨国文件传输的挑战。大文件的高效、安全传输成为了企业亟需解决的问题。本文将深入探讨传统传输方式的局限性,云存储服务的便捷与挑战,以及专用文件传输软件的创新,…...
Redis渗透SSRF的利用
Redis是什么? Redis是NoSQL数据库之一,它使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库。默认端口是:6379 工具安装 下载地址: http://download.redis.io/redis-stable.tar.gz然…...
【深度学习】基于PyTorch架构神经网络学习总结(基础概念基本网络搭建)
神经网络整体架构 类似于人体的神经元 神经网络工作原来为层次结构,一层一层的变换数据。如上述示例有4层,1层输入层、2层隐藏层、1层输出层神经元:数据的量或矩阵的大小,如上述示例中输入层中有三个神经元代表输入数据有3个特征…...
专业排版设计软件:QuarkXPress 2024 for mac中文激活版
QuarkXPress 2024 for Mac是一款功能强大、易于使用、高质量输出的专业排版软件。无论您是出版业的专家还是初学者,都可以通过QuarkXPress 2024轻松创建出令人惊叹的出版物。 软件下载:QuarkXPress 2024 for mac中文激活版下载 QuarkXPress 2023 for Mac…...
3593 蓝桥杯 查找最大元素 简单
3593 蓝桥杯 查找最大元素 简单 // C风格解法1,通过率100%,多组数据处理样式//str "abcdefgfedcba" //abcdefg(max)fedcba//str "xxxxx" //x(max)x(max)x(max)x(max)x(max)#include<bits/stdc.h>const int N 1e2 10;char …...
Postgresql数据库存储过程中的事务处理
在PostgreSQL中,事务处理是一种保证数据库操作要么完全成功,要么完全失败的机制,确保数据库的完整性和一致性。事务通过一系列的数据库操作组成,这些操作作为一个整体执行,它们要么全部成功,要么全部失败。…...
Redis——缓存的持久化
1、持久化机制 Redis的所有数据都保存在内存中,如果没有配置持久化功能,Redis重启后数据就会全部丢失,所以需要开启Redis的持久化功能,将数据保存到磁盘上,这样当Redis重启后,可以从磁盘中恢复数据。Redis…...
kafka-splunk数据通路实践
目的: 鉴于目前网络上没有完整的kafka数据投递至splunk教程,通过本文操作步骤,您将实现kafka数据投递至splunk日志系统 实现思路: 创建kafka集群部署splunk,设置HTTP事件收集器部署connector服务创建connector任务&a…...
C语言第十九弹---指针(三)
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 指针 1、数组名的理解 2、使用指针访问数组 3、⼀维数组传参的本质 4、冒泡排序 5、二级指针 6、指针数组 7、指针数组模拟二维数组 总结 1、数组名的理解…...
TCP/IP LWIP FPGA 笔记
参考资料: 正点原子 LwIP 之 网络接口 netif(ethernetif.c、netif.c)-CSDN博客 IPv4/IPv6、DHCP、网关、路由_ipv6有网关的概念吗-CSDN博客 TCP/IP TCP/IP 协议中文名为传输控制协议/因特网互联协议,又名网络通讯协议…...
2024年海外优青项目申报指南
国家自然科学基金优秀青年科学基金(海外)项目(简称“海外优青项目”),一直备受海外优秀青年学者(包括博士后研究人员)关注,被看作是回国发展最为重要的资助项目之一。知识人网小编现…...
threejs之常用贴图
在三维图形和游戏开发中,高光贴图、凹凸贴图、法线贴图和环境光遮蔽贴图是常用的技术,用于增加虚拟物体表面的细节和真实感,而无需增加更多的几何体。这些技术可以帮助开发者和艺术家创造出既详细又性能高效的场景。 高光贴图(Sp…...
Unity类银河恶魔城学习记录3-1 EnemyStateMachine源代码 P47
Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Enemy.cs using System.Collections; using System.Collections.Generic;…...
使用webstorm调试vue 2 项目
学习目标: 使用webstorm调试vue 2 项目 笔者环境: npm 6.14.12 webstorm 2023.1 vue 2 学习内容: 例如: 正常启动npm 项目 配置javaScruot dubug 配置你的项目地址就好 使用dubug运行你配置的调式页 问题 如果进入了js页无…...
深度学习缝模块怎么描述创新点?(附写作模板+涨点论文)
深度学习缝了别的模块怎么描述创新点、怎么讲故事写成一篇优质论文? 简单框架:描述自己这个领域,该领域出现了什么问题,你用了什么方法解决,你的方法有了多大的性能提升。 其中,重点讲清楚这两点…...
html,css,js速成
准备:vscode配好c,python,vue环境,并下载live server插件。 1. html hypertext markup language(超文本标记语言) 1. 基础语法 一个html元素由开始标签,填充文本,结束标签构成。 常见标签说明<b>…...
《Docker极简教程》--Docker基础--基础知识(一)
在这篇文章中我们先大致的了解以下Docker的基本概念,在后续的文章中我们会详细的讲解这些概念以及使用。 一、容器(Container) 1.1 容器的定义和特点 容器的定义 容器是一种轻量级、可移植的软件打包技术,用于打包应用及其依赖项和运行环境,…...
Web html和css
目录 1 前言2 HTML2.1 元素(Element)2.1.1 块级元素和内联(行级)元素2.1.2 空元素 2.2 html页面的文档结构2.3 常见标签使用2.3.1 注释2.3.2 标题2.3.3 段落2.3.4 列表2.3.5 超链接2.3.6 图片2.3.7 内联(行级)标签2.3.8 换行 2.4 属性2.4.1 布尔属性 2.5 实体引用2.6 空格2.7 D…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...
高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
PLC入门【4】基本指令2(SET RST)
04 基本指令2 PLC编程第四课基本指令(2) 1、运用上接课所学的基本指令完成个简单的实例编程。 2、学习SET--置位指令 3、RST--复位指令 打开软件(FX-TRN-BEG-C),从 文件 - 主画面,“B: 让我们学习基本的”- “B-3.控制优先程序”。 点击“梯形图编辑”…...
