Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
romfs
在内存中挂载romfs
发布于 2021-09-29 15:17:20 浏览:1736
订阅该版
[tocm] # 简单说明 - 最近为了方便测试工作,在内存中挂载了romfs,以前使用romfs.c编译进源码的方法,在我使用的平台不是很方便,主要是存放代码的区域大小固定了,把romfs.c一起编译就超过了限制。 # 准备工作 - C语言的基础 - 链接器脚本语法 - 基本的编译原理 - rt-thread fal工具包的知识 - rt-thread sfud工具包的知识 - flash读写的原理 # GOGO 1. 修改gcc的lds脚本,增加romfs数组存放的段,这样是为了这个数组的地址尽量固定,MDK的设置这里不讲,主要是我好久没玩了,都忘了怎么操作,哈哈。 ```c /* .data section which is used for initialized data */ .data : { . = ALIGN(4); /* This is used by the startup in order to initialize the .data secion */ _sdata = . ; *(.romfs_text) *(.romfs_text*) *(.data) *(.data.*) *(.gnu.linkonce.d*) PROVIDE(__dtors_start__ = .); KEEP(*(SORT(.dtors.*))) KEEP(*(.dtors)) PROVIDE(__dtors_end__ = .); . = ALIGN(4); /* This is used by the startup in order to initialize the .data secion */ _edata = . ; } ``` 上面的脚本是在data段的前面增加一个romfs_text段,这个段后面用来存放romfs.bin的二进制文件。 2. 在C语言中声明一个数组,段指定为.romfs_text,这样这个数组就会排到data段的前面,就不会经常变来变去。 * gcc 语法 ```c static rt_uint8_t romfs_bin[0x00abf000] __attribute__((aligned(4), __section__(".romfs_text")));; ``` * mdk语法 ``` 请使用搜索引擎 ``` 数组需要>=romfs.bin的大小,这里的0x00abf000是我的fal分区的大小,这个分区用来烧录romfs.bin的二进制文件。 3. 从flash中拷贝romfs到内存并挂载。 ```c static rt_uint8_t romfs_bin[0x00abf000] __attribute__((aligned(4), __section__(".romfs_text")));; int mnt_init(void) { rt_device_t dev_id; rt_uint32_t *romfs_u32 = (rt_uint32_t *)&romfs_bin; fal_mtd_nor_device_create("romfs"); //将存放romfs.bin二进制文件的分区设置成块设备 rt_memset(&romfs_bin, 0, sizeof(romfs_bin)); if ((dev_id = rt_device_find("romfs")) == RT_NULL) { return -1; } rt_device_open(dev_id, RT_DEVICE_OFLAG_RDWR); rt_device_read(dev_id, 0, romfs_bin, sizeof(romfs_bin)); //读取romfs分区的内容 rt_kprintf("romfs_bin addr:0x%08x\n", &romfs_bin); //打印一下romfs_bin数组的实际地址,后面会用到 if (dfs_mount(RT_NULL, "/", "rom", 0, &romfs_bin) == 0) { rt_kprintf("Mount \"rootfs\" on \"/\" success\n"); } else { rt_kprintf("Mount \"rootfs\" on \"/\" fail\n"); return -1; } rt_kprintf("file system initialization done!\n"); return 0; } INIT_ENV_EXPORT(mnt_init); ``` 4. 生成romfs.bin * 常规的方式是生成romfs.c是和源码一起编译,因为我所用的平台代码都在内存中运行,flash不支持XIP方式,所以需要生成bin文件拷贝到内存中使用。 在rt-thread源码的tools中执行,以下命令 ```python python mkromfs.py --binary --addr 0xc0074000 root romfs.bin ``` * 参数说明 - --binary:生成二进制文件 - --addr:后面跟的是文件系统存放的地址,这个地址是一个绝对地址,也就是上面那个数组的打印出来的地址,地址不对,启动时可能会崩溃,我知道smart上一定会崩溃的。 - root: 需要打包的文件目录 - romfs.bin: 输出的二进制文件名 5. 烧录romfs.bin * 我这里是通过特定的工具烧录到指定的flash地址,使用到了fal的分区功能,分区名字叫做romfs,这个根据具体的平台来搞就行。 6. 重启
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
小鳄鱼
rt-thread脑残粉
文章
8
回答
45
被采纳
7
关注TA
发私信
相关文章
1
romfs无法执行df命令
2
外部flash的分区可以挂载为只读文件系统吗
3
TFTP PUT失败
4
STM32F407-atk可以ROMF支持吗?
5
webnet软件包请求文件无响应
6
兼容python3的romfs.py脚本无法生成bin文件
7
关于文件系统romfs的问题
8
求版主能给我一个ROMFS的例子
9
romfs挂载,没有按照预期创建指定目录
推荐文章
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组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部