导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    如何给R128在FreeRTOS下配置/data目录

    A Series
    1
    1
    1038
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • zznzzn
      zznzzn LV 6 最后由 编辑

      在调试音频、usb等模块时,会发现SDK的根目录下没有/data该目录,导致无法存储所需要的文件,这就是因为/data目录没有配置好的原因。

      1、选上配置

      首先需要选上的配置:
      运行mrtos_menuconfig,选上COMPONENT_LITTLEFS

      -> System components
          -> thirdparty components
              [*] LittleFS Filesystem
      

      选上littlefs只是支持了这个功能,另外还需要对分区进行配置。

      2、确认分区表

      通过命令cconfigs,跳转到方案配置目录,找到文件sys_partition.fex

      这里需要注意,目录下可能会有多个分区文件,带着不同后缀的,比如说nor,xip等等的,因此需要确认用的是哪一个分区表,以免修改不生效

      在方案已经编译完成之后,运行

      pack
      

      命令对方案进行打包,通过打包时打印出来的log信息,可以提取到用的是哪一个分区表,如下:

      download1FileByUrl.png

      如图片,可以确认到打包示例中调用的分区表。

      3、修改分区表

      在分区表中加入以下配置代码:

      [partition]
          name         = UDISK
          downloadfile = "data_udisk.fex"
          user_type    = 0x8100
      

      通过上述的代码,在打包固件调用的pack_img.sh脚本中,通过函数

      function make_data_image()
      

      会创建对应的分区。

      4、挂载目录

      分区已经建好的话,剩下就是通过littlefs将区分挂载到目录下了。

      在方案的main.c函数中(这里只是举个例子,在系统启动时挂载目录即可,但是需要注意要在flash初始化完成之后才能挂载)

      在main.c中,添加以下代码:

      littlefs_mount("/dev/UDISK", "/data", true);
      

      /dev/UDISK就是分区名字,由分区表产生的。
      /data则是创建目录的名字及路径。

      通过以上步骤,即可为方案新建一个/data目录,可以用于保存一些程序所需要用到的文件。

      5、保存文件到data目录下

      1.在SDK编译环境中存放文件
      可以在编译时,所需要的文件放到UDISK分区。

      存放文件到UDISK分区方法为:

      直接将文件拷贝到编译环境对应的路径下:

      {root_dir}/board/芯片名/方案名/data/UDISK
      

      在SDK打包时就会将UDISK目录下的文件全部打包生成udisk的镜像,最终打包到image里。

      在烧录时,就会udisk的镜像烧录到对应的分区里。系统启动,挂载分区之后,就直接可以通过/data目录访问到对应的文件了。

      2.通过代码读写文件
      FreeRTOS SDK中,通过fopen fwrite fread等POSIX接口,即可操作UDISK分区(/data目录)的文件。

      以下做个示例:

      static int save_to_file(void *str, void *start, int length)
      {
              FILE *fp = NULL;
      
              fp = fopen(str, "wb+"); //save more frames
              if (!fp) {
                      printf(" Open %s error\n", (char *)str);
      
                      return -1;
              }
      
              if (fwrite(start, length, 1, fp)) {
                      fclose(fp);
      
                      return 0;
              } else {
                      printf(" Write file fail (%s)\n", strerror(errno));
                      fclose(fp);
      
                      return -1;
              }
      
              return 0;
      }
      
      • str: 路径名,若为/data目录的话,比如说写入一个a.txt,str可以定义为 /data/a.txt
      • start:所需要写入的数据起始地址
      • length:所需要写的数据的长度。
      1 条回复 最后回复 回复 引用 分享 1
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策