Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
关于finsh中操作文件系统会死机的现象。
发布于 2012-05-03 14:59:00 浏览:2885
订阅该版
下面是我在finsh中的一个函数代码: ``` void copyusb(void) { struct statfs statfsbuf; int length; char *fullpath; char spipath[40] = {' '}; char *pSpiPath; struct stat stat; struct dfs_fd fd; //struct dfs_fd fdtemp; struct dirent dirent; /* 是否存在文件系统文件系统*/ if (statfs("/",&statfsbuf) == 0) { /*usb分区是否存在*/ if (statfs("/usb",&statfsbuf) != 0) { rt_kprintf("usb不存在文件系统! "); return ; } } else { rt_kprintf("spi不存在文件系统! "); return ; } /* 是否存在文件夹,不存在就创建*/ /*看看U盘是否存在文件夹,如果不存在就创建*/ if (dfs_file_open(&fd, "/bg", DFS_O_DIRECTORY) == 0) { dfs_file_close(&fd); } else { if ( mkdir("/bg", 0) != 0) { return ; } } if (dfs_file_open(&fd, "/pic", DFS_O_DIRECTORY) == 0) { dfs_file_close(&fd); } else { if (mkdir("/pic", 0) != 0) { return; } } if (dfs_file_open(&fd, "/btn", DFS_O_DIRECTORY) == 0) { dfs_file_close(&fd); } else { if (mkdir("/btn", 0) != 0) { return ; } } if (dfs_file_open(&fd, "/font", DFS_O_DIRECTORY) == 0) { dfs_file_close(&fd); } else { if (mkdir("/font", 0) != 0) { return ; } } rt_kprintf("开始拷贝优盘的数据,请不要进行任何操作... "); /*看是否存在config.txt文件*/ copy("/usb/config/config.txt", "/config.txt"); /* 打开背景图片文件夹*/ if (dfs_file_open(&fd, "/usb/bg", DFS_O_DIRECTORY) == 0) { rt_kprintf("进入 USB BG文件夹. "); do { /*先将结构体清零*/ rt_memset(&dirent, 0, sizeof(struct dirent)); /*读取文件夹的文件*/ length = dfs_file_getdents(&fd, &dirent, sizeof(struct dirent)); //fdtemp = fd; if (length > 0) { rt_memset(&stat, 0, sizeof(struct stat)); /* 获取文件名称*/ fullpath = dfs_normalize_path("/usb/bg", dirent.d_name); if (fullpath == RT_NULL) break; if (dfs_file_stat(fullpath, &stat) == 0) { /* 判断是不是我们需要拷贝的文件*/ if (rt_strstr(dirent.d_name, ".png") != RT_NULL || rt_strstr(dirent.d_name, ".PNG") != RT_NULL) { /*生成动态的文件名*/ pSpiPath = (char *)spipath; rt_memcpy(pSpiPath, "/bg/",sizeof("/bg/")); pSpiPath += sizeof("/bg/") - 1; rt_memcpy(pSpiPath, dirent.d_name, sizeof(dirent.d_name)); pSpiPath += sizeof(dirent.d_name) - 1; *pSpiPath = ' '; /*拷贝文件*/ // rt_kprintf("%s ",spipath); copy(fullpath,spipath); rt_kprintf("拷贝文件%s... ", fullpath); } } else rt_kprintf("文件%s已经损坏. ", dirent.d_name); if (fullpath != RT_NULL) { rt_free(fullpath); } } }while (length > 0); dfs_file_close(&fd); } else { rt_kprintf("优盘不存在/bg文件夹... "); } /* 打开btn文件夹*/ if (dfs_file_open(&fd, "/usb/btn", DFS_O_DIRECTORY) == 0) { rt_kprintf("进入优盘BTN文件夹. "); do { /*先将结构体清零*/ rt_memset(&dirent, 0, sizeof(struct dirent)); /*读取文件夹的文件*/ length = dfs_file_getdents(&fd, &dirent, sizeof(struct dirent)); if (length > 0) { rt_memset(&stat, 0, sizeof(struct stat)); /* 获取文件名称*/ fullpath = dfs_normalize_path("/usb/btn", dirent.d_name); if (fullpath == RT_NULL) break; if (dfs_file_stat(fullpath, &stat) == 0) { /* 判断是不是我们需要拷贝的文件*/ if (rt_strstr(dirent.d_name, ".png") != RT_NULL || rt_strstr(dirent.d_name, ".PNG") != RT_NULL) { /*生成动态的文件名*/ pSpiPath = (char *)spipath; rt_memcpy(pSpiPath, "/btn/",sizeof("/btn/")); pSpiPath += sizeof("/btn/") - 1; rt_memcpy(pSpiPath, dirent.d_name, sizeof(dirent.d_name)); pSpiPath += sizeof(dirent.d_name); *pSpiPath = ' ' - 1; /*拷贝文件*/ // rt_kprintf("%s ",spipath); copy(fullpath,spipath); rt_kprintf("拷贝文件%s... ", fullpath); } } else rt_kprintf("文件%s已经损坏. ", dirent.d_name); rt_free(fullpath); } }while (length > 0); dfs_file_close(&fd); } else { rt_kprintf("优盘不存在/btn文件夹... "); } /* 打开btn文件夹*/ if (dfs_file_open(&fd, "/usb/font", DFS_O_DIRECTORY) == 0) { rt_kprintf("进入优盘FONT文件夹. "); do { /*先将结构体清零*/ rt_memset(&dirent, 0, sizeof(struct dirent)); /*读取文件夹的文件*/ length = dfs_file_getdents(&fd, &dirent, sizeof(struct dirent)); if (length > 0) { rt_memset(&stat, 0, sizeof(struct stat)); /* 获取文件名称*/ fullpath = dfs_normalize_path("/usb/font", dirent.d_name); if (fullpath == RT_NULL) break; if (dfs_file_stat(fullpath, &stat) == 0) { /* 判断是不是我们需要拷贝的文件*/ if (rt_strstr(dirent.d_name, ".dat") != RT_NULL || rt_strstr(dirent.d_name, ".DAT") != RT_NULL) { /*生成动态的文件名*/ pSpiPath = (char *)spipath; rt_memcpy(pSpiPath, "/font/",sizeof("/font/")); pSpiPath += sizeof("/font/") - 1; rt_memcpy(pSpiPath, dirent.d_name, sizeof(dirent.d_name)); pSpiPath += sizeof(dirent.d_name); *pSpiPath = ' ' - 1; /*拷贝文件*/ // rt_kprintf("%s ",spipath); copy(fullpath,spipath); rt_kprintf("拷贝文件%s... ", fullpath); } } else rt_kprintf("文件%s已经损坏. ", dirent.d_name); rt_free(fullpath); } }while (length > 0); dfs_file_close(&fd); } else { rt_kprintf("优盘不存在/font文件夹... "); } /* 打开btn文件夹*/ if (dfs_file_open(&fd, "/usb/pic", DFS_O_DIRECTORY) == 0) { rt_kprintf("进入优盘PIC文件夹. "); do { /*先将结构体清零*/ rt_memset(&dirent, 0, sizeof(struct dirent)); /*读取文件夹的文件*/ length = dfs_file_getdents(&fd, &dirent, sizeof(struct dirent)); if (length > 0) { rt_memset(&stat, 0, sizeof(struct stat)); /* 获取文件名称*/ fullpath = dfs_normalize_path("/usb/pic", dirent.d_name); if (fullpath == RT_NULL) break; if (dfs_file_stat(fullpath, &stat) == 0) { /* 判断是不是我们需要拷贝的文件*/ if (rt_strstr(dirent.d_name, ".png") != RT_NULL || rt_strstr(dirent.d_name, ".PNG") != RT_NULL) { /*生成动态的文件名*/ pSpiPath = (char *)spipath; rt_memcpy(pSpiPath, "/pic/",sizeof("/pic/")); pSpiPath += sizeof("/pic/") - 1; rt_memcpy(pSpiPath, dirent.d_name, sizeof(dirent.d_name)); pSpiPath += sizeof(dirent.d_name); *pSpiPath = ' ' - 1; /*拷贝文件*/ // rt_kprintf("%s ",spipath); copy(fullpath,spipath); rt_kprintf("拷贝文件%s... ", fullpath); } } else rt_kprintf("文件%s已经损坏. ", dirent.d_name); rt_free(fullpath); } }while (length > 0); dfs_file_close(&fd); } else { rt_kprintf("优盘不存在/pic文件夹... "); } rt_kprintf("拷贝操作完成... "); } #ifdef RT_USING_FINSH #include <finsh.h> FINSH_FUNCTION_EXPORT(copyusb, copy usb file to spi); FINSH_FUNCTION_EXPORT(copyspi, copy spi file to usb); #endif ``` 这段代码本来都是没问题的,一部分从ls命令中拷贝出来的。 问题在于,当我用finsh执行这个函数这后,如果里面没有运行到 if (dfs_file_open(&fd, path, DFS_O_DIRECTORY) == 0)里面的时候,函数能正常退出,如果运行到里面, 当整个函数运行完,到最后就会死机。 进入优盘PIC文件夹. 拷贝文件/usb/pic/1.PNG... 拷贝文件/usb/pic/2.PNG... 拷贝文件/usb/pic/3.PNG... 拷贝文件/usb/pic/4.PNG... 拷贝文件/usb/pic/5.PNG... 拷贝文件/usb/pic/6.PNG... 拷贝操作完成... psr: 0x20000000 pc: 0x00000000 lr: 0x00004b8d r12: 0x00004b57 r03: 0x00000011 r02: 0x40010000 r01: 0x0000000a r00: 0x00000011 hard fault on thread: tshell thread pri status sp stack size max used left tick error -------- ---- ------- ---------- ---------- ---------- ---------- --- rtgui 0x0f suspend 0x00000178 0x00000800 0x00000178 0x00000005 000 tidle 0x1f ready 0x00000040 0x00000100 0x00000050 0x00000001 000 tshell 0x14 ready 0x00000338 0x00000800 0x000003c0 0x00000009 000 led 0x0b suspend 0x00000058 0x00000200 0x00000058 0x00000001 000 发现并不是栈溢出,会是什么 原因造成的呢, 我看了下代码,应该没问题才对的。
查看更多
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
2.9k
关于作者
xiao苦
这家伙很懒,什么也没写!
提问
57
回答
244
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
profinet从站主线error open adapt
2
2024 RT-Thread睿赛德开发者大会共探商业共赢的开源生态
3
rt-thread 小内存算法源码分析
4
env中添加lvgl软件包后,keil编译包--c99错误
5
【NXP-MCXA153】 定时器驱动移植
热门标签
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在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
Debug
中断
编译报错
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
20
个答案
3
次被采纳
红枫
8
个答案
2
次被采纳
踩姑娘的小蘑菇
7
个答案
2
次被采纳
三世执戟
7
个答案
1
次被采纳
张世争
6
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
12
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部