VSF aio示例程序中,文件系统功能的测试方法

说明:此部分代码目前还为公开,本文提供给拿到代码,准备做文件系统的人参考。

VSF最新代码里,增加了一个aio示例,把VSF里的各个功能都整合到一个项目中,当然,这样对MCU的资源要求也比较高,目前使用新塘的NUC442测试,以后会换为新塘的NUC480系列。

示例代码的usrapp.c里的usrapp_init_thread中,有一段代码用于安装文件系统。目前实现了2个文件系统,底层驱动分别是fakefat32_fs_op和vsffat_op,也就是fakefat32里的2个接口实现的文件系统,对应的内容完全一样。fakefat32_fs_op是通过vsfile_memfs接口来操作文件,而vsffat_op是通过fat文件系统驱动来操作。这2个文件系统分别安装在/msc_root和/msc_mal_root中。代码如下:

    caller_pt->sm = pt->sm;
    caller_pt->state = 0;
    vsfsm_pt_entry(pt);
    err = vsfile_addfile(caller_pt, evt, NULL, "msc_root", VSFILE_ATTR_DIRECTORY);
    if (err) return err;

    caller_pt->state = 0;
    vsfsm_pt_entry(pt);
    err = vsfile_getfile(caller_pt, evt, NULL, "/msc_root", &app->fs.file);
    if (err) return err;

    caller_pt->state = 0;
    caller_pt->user_data = &app->mal.fakefat32;
    vsfsm_pt_entry(pt);
    err = vsfile_mount(caller_pt, evt, (struct vsfile_fsop_t *)&fakefat32_fs_op, app->fs.file);
    if (err) return err;

    caller_pt->state = 0;
    vsfsm_pt_entry(pt);
    err = vsfile_close(caller_pt, evt, app->fs.file);
    if (err) return err;

    caller_pt->state = 0;
    vsfsm_pt_entry(pt);
    err = vsfile_addfile(caller_pt, evt, NULL, "msc_mal_root", VSFILE_ATTR_DIRECTORY);
    if (err) return err;

    caller_pt->state = 0;
    vsfsm_pt_entry(pt);
    err = vsfile_getfile(caller_pt, evt, NULL, "/msc_mal_root", &app->fs.file);
    if (err) return err;

    usrapp.fs.fat_mal.size =
        usrapp.mal.fakefat32.sector_number * usrapp.mal.fakefat32.sector_size;
    caller_pt->state = 0;
    caller_pt->user_data = &app->fs.fat_mal.mal;
    vsfsm_pt_entry(pt);
    err = vsfmal_init(caller_pt, evt);
    if (err) return err;

    caller_pt->state = 0;
    caller_pt->user_data = &app->fs.fat;
    vsfsm_pt_entry(pt);
    err = vsfile_mount(caller_pt, evt, (struct vsfile_fsop_t *)&vsffat_op, app->fs.file);
    if (err) return err;

    caller_pt->state = 0;
    vsfsm_pt_entry(pt);
    err = vsfile_close(caller_pt, evt, app->fs.file);
    if (err) return err;

实质上,以上代码只是建立虚拟目录,打开目录,安装文件系统,关闭目录。

对于文件系统的测试方法有2个,1个是通过telnet登陆命令行界面后,使用ls、cd、cat、pwd等命令访问。目前NUC442由于USBD接口的硬件BUG,所以不能稳定使用RNDIS来实现,需要外接一个ECM协议的USB网卡(比如r8152),然后会自动分配IP地址,可以从串口的dmesg中,看到IP地址,就可以使用putty来连接telnet接口了(使用raw模式)。dmesg串口日志如下:

cdc_ecm: vid0BDA pid8152 interface0
cdc_ecm: MAC is 00:E0:4C:36:21:32
cdc_ecm_event: NETWORK_CONNECTION Connected
......一些dhcp报文
dhcpc: 192.168.1.141

putty中,“Connect type”使用Raw,“Host Name(or IP Address)”填入设备分配到的IP地址,参照上面的日志,应该是192.168.1.141,Port使用23,点击“Open”了之后,就会出现命令行串口,然后使用命令“cat /msc_mal_root/Driver/Windows/VSFCDC.inf”,就会执行文件系统的操作了,当然也可以用cd和ls命令。命令行如下:

vsfshell 0.1 beta by SimonQian
    https://github.com/versaloon/vsf
    Using "help" for more information
>>>cat /msc_mal_root/Driver/Windows/VSFCDC.inf
[Version]
Signature="$Windows NT$"
Class=Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
Provider=%PRVDR%
CatalogFile=VSFCDC.cat
......文件的其他内容
>>>ls
DIR(0):msc_mal_root
DIR(0):msc_root
>>>cd msc_mal_root
>>>ls
DIR(0):Driver
DIR(0):HttpRoot
>>>pwd
msc_mal_root
>>>cd Driver
>>>ls
DIR(0):.
DIR(0):..
DIR(0):Windows
>>>cd Windows
>>>ls
DIR(0):.
DIR(0):..
FIL(1558):VSFCDC.inf
>>>cat VSFCDC.inf
[Version]
Signature="$Windows NT$"
Class=Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
......文件的其他内容

另外还有一种简单的方法,在usrapp_init_thread中,使能以下代码:

#if 1
    {
        static uint8_t buf[2048];
        static uint32_t rsize;

        caller_pt->state = 0;
        vsfsm_pt_entry(pt);
        err = vsfile_getfile(caller_pt, evt, NULL, "/msc_mal_root/Driver/Windows/VSFCDC.inf", &app->fs.file);
        if (err) return err;

        caller_pt->state = 0;
        vsfsm_pt_entry(pt);
        err = vsfile_read(caller_pt, evt, app->fs.file, 0,
                    app->fs.file->size, buf, &rsize);
        if (err) return err;

        caller_pt->state = 0;
        vsfsm_pt_entry(pt);
        err = vsfile_close(caller_pt, evt, app->fs.file);
        if (err) return err;
    }
#endif

相当于fopen、fread和fclose。这样就不需要外部接USB网卡,直接就可以调试了。

aio示例代码中,文件系统相关的结构如图,仅供参考:


fullsizerender.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,126评论 9 467
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,413评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,591评论 18 139
  • 以下是《疯狂Java讲义》中的一些知识,如有错误,烦请指正。 Java8增强的包装类 自动装箱就是把一个基本类型的...
    hainingwyx阅读 389评论 0 0
  • 当孩子在慢慢长大的过程中,他会有一个阶段是既想依赖又想独立。有的孩子会有很强的依赖性,比如他始终粘在爸妈或者老师的...
    梅子的江湖阅读 252评论 0 0