谷动谷力

标题: 基于RTThread的DFS文件系统组件使用笔记 [打印本页]

作者: sunsili    时间: 2022-11-29 15:05
标题: 基于RTThread的DFS文件系统组件使用笔记
基于RTThread的DFS文件系统组件使用笔记

简单介绍了一下DFS代码框架和如何在RTThread平台上使用DFS分布式文件系统。工作比较忙先把目前整理的发出来,希望对小伙伴们有帮助,也希望玩过的朋友一起讨论指正。等空闲下来再继续细化深入分析一下。甚至看看能不能挂载个网络文件系统玩玩。

DFS分布式文件系统框架如下:
主要特点:


DFS虚拟文件系统文件目录如下:

关键文件简单介绍如下(详见具体的API手册):



dfs以fatfs系统挂载sdcard相关代码调用时序图:

大致按照从底层到顶层的初始化过程:
sdio硬件外设初始化(自动):
mmcsd设备初始化(自动):
fatfs文件系统初始化(自动):
dfs文件系统初始化(自动):
sdcard检测线程,检测是否有sdcard或mmccard插入到sd卡槽并进行卡识别:
sdcard挂载到dfs系统(用户调用):
具体使用过程

如上所述,其实在RTThread平台上使用DFS文件系统挂载SD卡已经很简单了,大致分一下几步:
1、用CubeMX生成SDIO的最底层外设初始化代码HAL_SD_MspInit(),复制到board.c
生成代码如下(复制到board.c):
SD_HandleTypeDef hsd;

DMA_HandleTypeDef hdma_sdio_rx;

DMA_HandleTypeDef hdma_sdio_tx;

/**

* @brief SD MSP Initialization

* This function configures the hardware resources used in this example

* @param hsd: SD handle pointer

* @retval None

*/

void HAL_SD_MspInit(SD_HandleTypeDef* hsd)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if(hsd->Instance==SDIO)

  {

  /* USER CODE BEGIN SDIO_MspInit 0 */

  /* USER CODE END SDIO_MspInit 0 */

    /* Peripheral clock enable */

    __HAL_RCC_SDIO_CLK_ENABLE();

    __HAL_RCC_GPIOC_CLK_ENABLE();

    __HAL_RCC_GPIOD_CLK_ENABLE();

    /**SDIO GPIO Configuration

    PC8     ------> SDIO_D0

    PC9     ------> SDIO_D1
    PC10     ------> SDIO_D2

    PC11     ------> SDIO_D3

    PC12     ------> SDIO_CK

    PD2     ------> SDIO_CMD

    */

    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11

                          |GPIO_PIN_12;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;

    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_2;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;

    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

    /* SDIO DMA Init */

    /* SDIO_RX Init */

    hdma_sdio_rx.Instance = DMA2_Stream3;

    hdma_sdio_rx.Init.Channel = DMA_CHANNEL_4;

    hdma_sdio_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;

    hdma_sdio_rx.Init.PeriphInc = DMA_PINC_DISABLE;

    hdma_sdio_rx.Init.MemInc = DMA_MINC_ENABLE;

    hdma_sdio_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;

    hdma_sdio_rx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;

    hdma_sdio_rx.Init.Mode = DMA_PFCTRL;

    hdma_sdio_rx.Init.Priority = DMA_PRIORITY_LOW;

    hdma_sdio_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;

    hdma_sdio_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;

    hdma_sdio_rx.Init.MemBurst = DMA_MBURST_INC4;

    hdma_sdio_rx.Init.PeriphBurst = DMA_PBURST_INC4;

    if (HAL_DMA_Init(&hdma_sdio_rx) != HAL_OK)

    {

      Error_Handler();

    }

    __HAL_LINKDMA(hsd,hdmarx,hdma_sdio_rx);

    /* SDIO_TX Init */

    hdma_sdio_tx.Instance = DMA2_Stream6;

    hdma_sdio_tx.Init.Channel = DMA_CHANNEL_4;

    hdma_sdio_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;

    hdma_sdio_tx.Init.PeriphInc = DMA_PINC_DISABLE;

    hdma_sdio_tx.Init.MemInc = DMA_MINC_ENABLE;

    hdma_sdio_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;

    hdma_sdio_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;

    hdma_sdio_tx.Init.Mode = DMA_PFCTRL;

    hdma_sdio_tx.Init.Priority = DMA_PRIORITY_LOW;

    hdma_sdio_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;

    hdma_sdio_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;

    hdma_sdio_tx.Init.MemBurst = DMA_MBURST_INC4;

    hdma_sdio_tx.Init.PeriphBurst = DMA_PBURST_INC4;

    if (HAL_DMA_Init(&hdma_sdio_tx) != HAL_OK)

    {

      Error_Handler();

    }

    __HAL_LINKDMA(hsd,hdmatx,hdma_sdio_tx);

    /* SDIO interrupt Init */

    HAL_NVIC_SetPriority(SDIO_IRQn, 6, 0);

    HAL_NVIC_EnableIRQ(SDIO_IRQn);

  /* USER CODE BEGIN SDIO_MspInit 1 */

  /* USER CODE END SDIO_MspInit 1 */

  }
}

2、用RTThreadStudio配置DFS组件和Fatfs组件:
3、挂载设备到文件系统:
#define SDCardPath      "/sdcard0"

   void sdmnt(void)

{

     int sta;

     if(rt_device_find("sd0") != RT_NULL)

    {

        sta = dfs_mount("sd0", SDCardPath, "elm", 0, 0);

        if(sta == RT_EOK)

        {

            LOG_I("sd card mount to SDCardPath");

        }

        else {

            LOG_W("sd card mount to SDCardPath failed!");

        }
    }
}

MSH_CMD_EXPORT(sdmnt, mount the sd card to local filesystem);
4、挂载后就可以按照dfs_posix.c里面的通用接口进行调用使用了。当然,dfs已经实现了很多基于命令行的操作命令,比如“cd”,“ls”,“cat”等。使用方法基本和linux下差不太多,但功能上确实还是没那么强大,这也是很正常的,如果也做那么强大,岂不是又变成了和linux一个量级的系统了,失去了轻量级可抢占系统的意义了。
————————————————
版权声明:本文为RT-Thread论坛用户「吉利咕噜2022」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:
https://club.rt-thread.org/ask/article/ca44a91d66b137c9.html







欢迎光临 谷动谷力 (http://bbs.sunsili.com/) Powered by Discuz! X3.2