因项目需要,将一块2MB 的spi flash 注册为块设备。
现需要将一个数据段写至该flash某地址,假设为 buf[32],写入flash 自0x180000开始的地址。
本人依次进行了如下操作:
1、调用IO设备模型的rt_device_find、rt_device_open接口依次查找并打开设备;
2、调用rt_device_write接口进行写操作;
发现写入时,调用了rt_sfud_write接口, 并在sfud_erase_write操作之前,将逻辑地址addr(0x180000)和要写入的逻辑长度size“32字节”转换为了“物理偏移地址”和“物理长度”(均乘以 4096),从而造成实际地址和写入长度不对,进而引起错误。
那么请问:
1、根据i/o设备模型,操作块设备读写时rt_device_write接口的输入参数写入偏移地址、写入长度分别应该是逻辑地址和逻辑长度?
2、逻辑地址可理解, 逻辑长度得是我实际写入字节数对应的1个擦除单元4096字节的向上取证整数倍?(PS:这样的设计感觉有点不合理呀)
关键是io设备模型这样操作不太合理呀
rt_device_write最终调用的这个函数rt_sfud_write
是说这个函数不合理吗?
看代码
rt_sfud_read
也是这么处理的,IO设备模型里面应该就是这么考虑的@sync 是的
rt_device_write最终调用rt_sfud_write
@sync rt_sfud_read这么处理无可厚非。
但是对于直接操作的块设备 调用rt_device_write来写的话, 按照IO设备模型的通用写接口rt_device_write的定义,其输入参数 size应该指代的是对于设备的最小写单元的大小吗
rt_device_write 里面看这一句rt_size_t phy_size = size * rtt_dev->geometry.bytes_per_sector;
需要传入size不就是扇区的数量吗?
@sync 你说的是rt_sfud_write接口吧
是的,rt_device_write 最终还是调用rt_sfud_write
@sync 是在rt_sfud_write中做的rt_size_t phy_size = size * rtt_dev->geometry.bytes_per_sector
也就是说rt_device_write 接口的传参size不是实际大小(bytes),而是块设备的块的数量(设备的最小操作单元的大小)。
我现在的困惑就是 这个size是作为实际字节长度合适,还是作为具体设备的最小操作单元合适
这有啥困惑的?IO设备模型里面必须传入扇区数量,如果直接使用sfud则可以传入实际大小,在不改动原始文件的前提下,只能是按照现有函数的要求来做
@sync 那就意味着使用rt_device_write前,开发者必须要知道所写的目标设备(不仅局限于spi flash)的读写最小单位属性,把想要写的实际字节长度转换为读写最小单位倍数的形式?
@sync
也就是说,开发者使用rt_device_write 接口之前,必须得知道所操作设备(不仅限于spi flash)的最小写入单位, 并把实际想写入的字节长度转换为最小写入单位的整数倍作为size传参传入?
这对开发者使用这个接口要求有点高啊
@XNXH_6023 可以换个角度看问题, rtthread并没有限制开发者如何来操作flash,使用 rt_device_write 可以,使用sfud也是可以的,加载文件系统后再用也是可以的,不用文件系统使用flashDB也可以的,看开发者自己选择了