最近尝试在RTthread下挂文件系统,平台是GD的M4核32450ZI。
用了官方例程里gd32450z-eval下的工程。
调试完成flash驱动后,可以看到flah IS25LPXX已经挂载
但是文件系统初始化是失败的。
通过打印找到失败的原因。
定位到代码
发现flash写入前检查的mutex 被清0了。
通过调试把问题定位到 sfud.c的sfud_err page256_or_1_byte_write函数
这个cmd_data的地址从0x200009DC到0x20000AE1,
而被清0的mutex地址在0x20000AA4,
地址区重叠了,为什么?
尝试将static去掉,程序正常了,文件系统挂载成功。
恢复static继续查找问题,最后定位到drv_spi.c
由于配置时只配置了RT_USING_SPI3 ,导致spi_bus结构体数组的长度仅为1,
此时去操作spi_bus[3],必然造成了越界,从而出现问题。
这里选择粗暴的解决办法,直接将
static struct rt_spi_bus spi_bus[ARR_LEN(spis)];
改为
static struct rt_spi_bus spi_bus[5];
重新编译运行后 mkfs IS25LPX
文件系统正常挂载。