Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
bug
FAL
SFUD
RT_NAME_MAX引发的惨案
发布于 2021-01-13 11:20:49 浏览:2163
订阅该版
背景: **ART-Pi** 板载了两颗 `FLASH`. (SPI FLASH 16M)(QSPI FLASH 8M) 于是就尝试了 `SFUD` 和 `FAL` 一起使用,在使用过程中发现了`RT_NAME_MAX` 导致的 `FLASH` 容量识别错误的问题。 现象: 先看测试代码 ```c extern rt_spi_flash_device_t rt_sfud_flash_probe(const char *spi_flash_dev_name, const char *spi_dev_name); extern int fal_init(void); const struct fal_flash_dev *flash_dev = NULL; rt_hw_spi_device_attach("spi1", "spi10", GPIOA, GPIO_PIN_4); /* initialize SPI Flash device */ if (RT_NULL == rt_sfud_flash_probe("norflash0", "spi10")) { rt_kprintf("sfud error!!\r\n"); return -RT_ERROR; }; stm32_qspi_bus_attach_device("qspi1", "qspi10", RT_NULL, 4, w25qxx_enter_qspi_mode, RT_NULL); if (RT_NULL == rt_sfud_flash_probe("norflash1", "qspi10")) { return -RT_ERROR; } fal_init(); flash_dev = fal_flash_device_find("norflash0"); rt_kprintf("spi_flash_dev %x \r\n", flash_dev->len); flash_dev = fal_flash_device_find("norflash1"); rt_kprintf("qspi_flash_dev %x \r\n", flash_dev->len); ``` 输出结果: ``` spi_flash_dev 1000000 qspi_flash_dev 1000000 ``` 问题: 容量不一致的 `FLASH` 结果显示了一样的容量。 修改代码: ```c stm32_qspi_bus_attach_device("qspi1", "qspi10", RT_NULL, 4, w25qxx_enter_qspi_mode, RT_NULL); if (RT_NULL == rt_sfud_flash_probe("norflash1", "qspi10")) { return -RT_ERROR; } rt_hw_spi_device_attach("spi1", "spi10", GPIOA, GPIO_PIN_4); /* initialize SPI Flash device */ if (RT_NULL == rt_sfud_flash_probe("norflash0", "spi10")) { rt_kprintf("sfud error!!\r\n"); return -RT_ERROR; }; fal_init(); ``` 调整初始化顺序 输出结果: ``` spi_flash_dev 800000 qspi_flash_dev 800000 ``` 可得结论: 谁先初始化探测到的容量就是谁的。 解决办法: ```c #define RT_NAME_MAX 9 ``` 问题原因: 1. `FAL` 软件包默认设置的设备名字是 `norflash0`,长度为 9 2. `SFUD` 中回调用`rt_device_register` 注册设备,这里会注册两次设备,因为`RT_NAME_MAX = 8` 会导致第二个设备无法正确注册,会返回错误。但是依然会`return rtt_dev;`,更安全的做法时对 `rt_device_register`的返回值做出判断。 3. 在`fal_flash_sfud_port.c`中使用到了 `sfud_dev = rt_sfud_flash_find_by_dev_name(FAL_USING_NOR_FLASH_DEV_NAME);` 为了省事,对 `QSPI FLASH`的操作直接拷贝了这个文件的代码进行修改。 `rt_sfud_flash_find_by_dev_name` 中使用到了 `rt_device_find`,那么`RT_NAME_MAX = 8` 所以只能查找到 `norflash` 字符串被截断了。
查看更多
caihaitao
2021-01-13
这家伙很懒,什么也没写!
在大点的项目中长度为8是不够的,建议将RT_NAME_MAX宏设置为16
3
个回答
默认排序
按发布时间排序
liuduanfei
2021-01-13
这家伙很懒,什么也没写!
名字这个问题确实,很多时候长度8不够用的。。。
dingwave_2000
2021-02-02
这家伙很懒,什么也没写!
之前添加传感器也遇到这样的问题,加一个可以,加两个怎么都不行,后来发现名称长了,在注册的时候相当于两个设备名称一样,导致第二个传感器注册失败,后修改短点的名称就好了,这个问题确实是一个坑,建议RT_NAME_MAX改成16比较合理。
撰写答案
登录
注册新账号
关注者
0
被浏览
2.2k
关于作者
whj467467222
开源,分享,交流,共同进步
提问
29
回答
1222
被采纳
149
关注TA
发私信
相关问题
1
【分享】如何使用 SFUD 库来操作 SPI Flash 设备
2
SFUD怎么使用
3
请教大家一下关于 SFUD 的的问题
4
移植sfud
5
使用SFUD操作FLASH
6
env使用easyflash不是3.2.4版本,而且没有type插件?
7
新增了W25X32设备成功,无法格式化
8
easyflash随着数据存储量增加,耗费时间加长
9
关于SFDP的问题
10
spi nand flash 能使用SFUD驱动吗
推荐文章
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组件
最新文章
1
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
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
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
7
次点赞
xiaorui
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部