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…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 (TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
