944|3

2531

帖子

0

资源

纯净的硅(高级)

【中科蓝讯AB32VG1 RISC-V板“碰上”RTT测评】四:挂载文件系统,读取SD卡 [复制链接]

本帖最后由 数码小叶 于 2021-5-9 21:10 编辑

照例是新建一个工程

Snipaste_2021-04-12_09-38-13.jpg

 

在硬件驱动配置里打开SD卡

Snipaste_2021-04-12_09-42-46.jpg

 

SD卡配置打开后,默认会开启DFS、Fatfs、 POSIX组件

Snipaste_2021-04-12_09-44-23.jpg

 

保存配置,编译一下,报错rt_hw_us_delay未定义

Snipaste_2021-04-12_09-56-21.jpg

 

根据给的资料自己添加是不可能的,不像STM32那样,可以自己去配置,那就只能稍微改造下了,将us延时屏蔽,ms延时+1,误差就是1个ms以下

Snipaste_2021-04-12_10-11-23.jpg

 

这样再次编译就没有错误了,试着下载到开发板上。

 

下载完成后,没任何反应,才意识到,跳线帽忘记了

 

Snipaste_2021-04-12_10-27-10.jpg

 

再次上电,已经可以输出SD卡的信息

Snipaste_2021-04-12_10-22-31.jpg

 

此时就可以对SD卡进行操作了,可以直接在串口下也可以在程序中进行,就是Downloader不支持中文输入,最好不要有中文目录了

 

Snipaste_2021-04-12_10-45-37.jpg

 

在串口中操作已经ok,那就再来在代码中操作一下,新建一个text文本文件

    int fd, size;
    char s[] = "RT-Thread Programmer!", buffer[80];

    rt_kprintf("Write string %s to test.txt.\n", s);

    fd = open("/text.txt", O_WRONLY | O_CREAT);
    if (fd>= 0)
    {
        write(fd, s, sizeof(s));
        close(fd);
        rt_kprintf("Write done.\n");
    }

    fd = open("/text.txt", O_RDONLY);
    if (fd>= 0)
    {
        size = read(fd, buffer, sizeof(buffer));
        close(fd);
        rt_kprintf("Read from file test.txt : %s \n", buffer);
        if (size < 0)
            return ;
    }
  }

 

首先新建一个text.txt文件,如果存在则直接打开,不存在则新建一个,然后往text.txt写入一个字符串,再将这个字符串读取出来

代码下进去无任何效果,从代码来看,应该是打开失败了,因为不支持在线调试以及仿真,所以只能修改下代码,增加打开失败的执行语句

    else
    {
        rt_kprintf("Open failed!\n");
    }

Snipaste_2021-04-12_15-41-41.jpg

 

确实确实是打开失败的原因,那就很容易猜到这个出错的原因是盘符挂载失败造成的,但是上面通过串口操作,一切是正常的,继续往下寻找原因

 

在挂载sd卡的代码上,有这么一段

rt_thread_mdelay(500);
if(rt_device_find("sd0") != RT_NULL)
{
    if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK)
            

 

这里就造成了一个时间先后的顺序问题,有两个解决办法,自己去挂载,去掉这个自动挂载,这个自动挂载,实际是在rtthread的自动初始化阶段里的第六个阶段app_init阶段进行的。

第二个办法就是等它挂载成功后,再去进行操作,第一个操作过于简单,就选择第二种方法吧,等它挂载完再去操作。

这就需要一个信号量了

    rt_sem_t sem_mount =RT_NULL;
    sem_mount = rt_sem_create("sem_mount", 0, RT_IPC_FLAG_FIFO);
    if (sem_mount == RT_NULL)
    {
        rt_kprintf("create dynamic semaphore failed.\n");
    }
    else
    {
        rt_kprintf("create dynamic semaphore ok.\n");
    }

 

当SD卡挂载成功后,便会释放一个信号量sem_mount,这样就可以进行我们的操作了,包括读写操作,重命名文件、文件夹,新建文件夹等

但是过程总是伴随着新的error出现的

Snipaste_2021-04-12_14-27-03.jpg

中间省去一堆操作,最后发现简单改下main线程栈大小就行了

rt_thread_t tid;

#ifdef RT_USING_HEAP
    tid = rt_thread_create("main", main_thread_entry, RT_NULL,
                           RT_MAIN_THREAD_STACK_SIZE, RT_MAIN_THREAD_PRIORITY, 20);
    RT_ASSERT(tid != RT_NULL);
#else
    rt_err_t result;

    tid = &main_thread;
    result = rt_thread_init(tid, "main", main_thread_entry, RT_NULL,
                            main_stack, sizeof(main_stack), RT_MAIN_THREAD_PRIORITY, 20);
    RT_ASSERT(result == RT_EOK);

Snipaste_2021-04-12_14-27-21.jpg

 

 

修改之后,一切操作OK

Snipaste_2021-04-12_15-32-27.jpg

 

对于这个片子,没有任何调试手段的多线程,找bug的原因真的很耗时

赞赏

1

查看全部赞赏


回复

1758

帖子

0

资源

纯净的硅(高级)

感谢分享这么多经验

不支持在线调试以及仿真也是很多不便,

增加了调试难度

 


回复

2万

帖子

71

资源

管理员

可以问问厂商 FAE有啥好办法吗?@nmg @okhxyyo

个人签名

不管是哪年,都要加油!继续为中国电子行业做出小小的贡献吧! 扣扣 1206973913


回复

2023

帖子

3

资源

版主

不错不错,一看就是非常有经验的大佬!


回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

最新文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表