SPI

SPI FLASH挂载的问题

发布于 2015-09-23 14:28:35
使用的SPI FLASH 型号为 W25Q32BV

终端打印显示 W25Q32BV detection

当输入以下命令后,系统就没反应了,终端再输入任何指令都没有反应了。这大概是哪方面的原因呢?

finsh>>mkfs("elm","flash0")

查看更多

关注者
0
被浏览
3.6k
12 个回答
pigeon0411
pigeon0411 2015-09-23
在程序中加了这段代码:
if (dfs_mount("flash0", "/", "elm", 0, 0) == 0) //进入这个函数后,没有返回。假死在里面了,但此时FINSH是正常工作的。
{
rt_kprintf("flash0 mount to /.\n");
}
else
rt_kprintf("flash0 mount to / failed.\n");

//进入这个dfs_mount("flash0", "/", "elm", 0, 0) 函数后,没有返回。假死在里面了,但此时FINSH是正常工作的。
pigeon0411
pigeon0411 2015-09-23
再跟进去,

void dfs_lock(void)
{
rt_err_t result;

result = rt_mutex_take(&fslock, RT_WAITING_FOREVER); //发现死在了这个地方
if (result != RT_EOK)
{
RT_ASSERT(0);
}
}
aozima
aozima 2015-09-23
拒绝白嫖,拒绝键盘侠!
这里就是持有一个互斥量,代码没有问题。

那么检查这个代码是否是在系统启动之后调用的,且不能在中断里面调用。
或文件系统是否有初始化。
在finsh中list_mutex就可以检查。
pigeon0411
pigeon0411 2015-09-23
这里就是持有一个互斥量,代码没有问题。

那么检查这个代码是否是在系统启动之后调用的,且不能在中断里面调用。
或文件系统是否有初始化。
在finsh中list_mutex就可以检查。



msh >list_mutex
mutex owner hold suspend thread
-------- -------- ---- --------------
msh >
msh >


没有检查到任何mutex。

这个代码是在 void rt_init_thread_entry(void* parameter) 这个函数中调用的。

void rt_init_thread_entry(void* parameter)
{
extern void rt_platform_init(void);
extern void rt_components_board_init(void);
extern void rt_components_init(void);

rt_int32_t cnt;


/* 系统组件*/
rt_platform_init();
rt_components_board_init();
rt_components_init();

#ifdef RT_USING_SPI_FLASH

if (dfs_mount("flash0", "/", "elm", 0, 0) == 0)
{
rt_kprintf("flash0 mount to /.
");
}
else
rt_kprintf("flash0 mount to / failed.
");
#endif

while(1) //从终端打印信息看,没有输出下面的信息。用硬件仿真也可以看到卡在上面,运行不到这里。
{
rt_thread_delay(100);

rt_kprintf("rt_init_thread_entry is running... times:%d
",cnt++);

}

}
pigeon0411
pigeon0411 2015-09-23
msh >list_thread
thread pri status sp stack size max used left tick error
-------- ---- ------- ---------- ---------- ---------- ---------- ---
tidle 0x1f ready 0x00000040 0x00000400 0x00000058 0x00000011 000
tshell 0x14 ready 0x00000090 0x00001000 0x00000140 0x00000007 000
init 0x0a init 0x00000040 0x00000800 0x00000040 0x00000014 000
msh >
aozima
aozima 2015-09-23
拒绝白嫖,拒绝键盘侠!
关于宏 INIT_APP_EXPORT 的问题
确保DFS及 elm FAT有成功初始化。

另外,贴子理好一点,看的人会多一点。
pigeon0411
pigeon0411 2015-09-23
关于宏 INIT_APP_EXPORT 的问题
确保DFS及 elm FAT有成功初始化。

另外,贴子理好一点,看的人会多一点。



确实是因为没有将桩中的函数编译进去。在MDK中加入了 --keep __rt_init*,就可以把初始化代码编译进去了。
解决办法 : http://www.rt-thread.org/phpBB3/topic2867-20.html

程序可以正常运行了,不过FLASH加载还没有搞定,下面是提示信息: 求解决


| /
- RT - Thread Operating System
/ | 2.0.1 build Sep 23 2015
2006 - 2015 Copyright by rt-thread team
W25Q32BV detection
flash0 mount to / failed.
msh >
pigeon0411
pigeon0411 2015-09-23
另外还有个问题,类似 INIT_APP_EXPORT 这样的宏是否可以被 多次使用,用来初始化多个不同的函数 ?
aozima
aozima 2015-09-23
拒绝白嫖,拒绝键盘侠!
可以跟入失败的地方。

挂载前需要格式化,如果从末格式化的话。

如果只能用一次,还不如直接调用好了。
pigeon0411
pigeon0411 2015-09-23
可以跟入失败的地方。

挂载前需要格式化,如果从末格式化的话。

如果只能用一次,还不如直接调用好了。



非常感谢这么快速有效的回复 。问题已经解决:

finsh>>mkfs("elm","flash0")
0, 0x00000000
finsh>>
finsh>>
| />>reset()
- RT - Thread Operating System
/ | 2.0.1 build Sep 23 2015
2006 - 2015 Copyright by rt-thread team
W25Q32BV detection
flash0 mount to /.
finsh>>


对RTT越来越喜欢了。
bernard
bernard 2015-09-23
这个有些门槛,这个没什么好的办法,因为硬件是多种多样,这也注定了问题收敛不了。

要入门最简单的办法是使用我们提供的硬件开发板、评估板,但这部分用户又不一定买账,所以我们也没辙

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友