全部文档
OneOS简介 硬件支持 快速开发指南 编译构造工具 API参考文档 高级语言 用户编程手册 OnePos定位 应用笔记 FAQ

RAMDISK


简介

RAMDISK即虚拟内存盘,它是通过软件将一部分内存(RAM)模拟为磁盘(DISK)来使用。相对于直接的硬盘文件访问来说,它可以极大的提高文件访问速度。但是RAM的易失性也意味着当关闭电源后这部分数据将会丢失,所以一般用来存储临时文件。RAMDSIK有以下特点:

  • 使用RAM模拟成块设备,访问速度快,且可以频繁读写,但是掉电消失。

  • 任何在磁盘上面可以运行的文件系统,都可以在RAMDISK上面运行。例如在本操作系统中,可以在RAMDISK上面运行CUTEFS、FATFS等(在RAMDISK上面运行FATFS时,为满足FATFS的基本条件,RAMDSIK至少需要512byte per block * 192 block)。


API列表

接口 说明
ramdisk_dev_init 静态初始化RAMDISK,需要使用者给出RAMDISK的地址空间
ramdisk_dev_deinit 反初始化RAMDISK,与ramdisk_dev_init()配合使用
ramdisk_dev_create 动态创建并初始化RAMDISK,RAMDISK的地址空间由该接口动态申请
ramdisk_dev_destroy 销毁RAMDISK,并释放对应的内存空间,与ramdisk_dev_create()配合使用

ramdisk_dev_init

该函数用于静态初始化RAMDISK,需要使用者给出具体的RAMDISK的地址空间,函数原型如下:

os_err_t ramdisk_dev_init(ramdisk_dev_t *ram_dev, void *addr, const char *name, os_uint32_t size, os_uint32_t block_size);
参数 说明
ram_dev RAMDISK句柄,由使用者提供
addr RAMDISK的起始地址,由使用者提供
name RAMDISK设备名字
size RAMDISK总的空间大小
block_size RAMDISK每个块的大小

ramdisk_dev_deinit

该函数用于反初始化RAMDISK,与ramdisk_dev_init()配合使用,函数原型如下:

void ramdisk_dev_deinit(ramdisk_dev_t* ram_dev);
参数 说明
ram_dev RAMDISK句柄,为ramdisk_dev_init()时使用的句柄
返回 说明

ramdisk_dev_create

该函数用于动态创建并初始化RAMDISK,RAMDISK的地址空间由该接口动态申请,函数原型如下:

ramdisk_dev_t *ramdisk_dev_create(const char *name, os_uint32_t size, os_uint32_t block_size);
参数 说明
name RAMDISK设备名字
size RAMDISK总的空间大小
block_size RAMDISK每个块的大小
返回 说明
非OS_NULL 创建成功
OS_NULL 创建失败

ramdisk_dev_destroy

该函数用于销毁RAMDISK,并释放对应的内存空间,与ramdisk_dev_create()配合使用,函数原型如下:

void ramdisk_dev_destroy(ramdisk_dev_t *ram_dev);
参数 说明
ram_dev RAMDISK句柄,为ramdisk_dev_create()时返回的句柄
返回 说明

使用示例

在RAMDISK上运行CUTEFS

本示例演示了RAMDISK的静态初始化和反初始化,并配合CUTEFS文件系统使用,示例代码如下:

#include <oneos_config.h>
#include <os_dbg.h>
#include <shell.h>
#include <os_errno.h>
#include <ramdisk.h>
#include <vfs_posix.h>

#define TEST_TAG            "TEST"

#define RAMDISK_NAME        "ramdisk0"
#define RAMDISK_SIZE        (25*1024)
#define RAMDISK_BLK_SIZE    512

char ramdisk_addr[RAMDISK_SIZE];
struct ramdisk_device ramdisk_dev;

static void test_ramdisk_init(void)
{
    if(OS_EOK != ramdisk_dev_init(&ramdisk_dev, &ramdisk_addr, RAMDISK_NAME, RAMDISK_SIZE, RAMDISK_BLK_SIZE))
    {
        LOG_E(TEST_TAG, "ramdisk init failed.");
        return;
    }
    LOG_W(TEST_TAG, "ramdisk init success.");

    if (0 != vfs_mount(RAMDISK_NAME, "/", "cute", 0, 0))
    {
        LOG_E(TEST_TAG, "cutefs mount failed.");
        return;
    }
    LOG_W(TEST_TAG, "cutefs mount success.");
}
SH_CMD_EXPORT(ramdisk_init, test_ramdisk_init, "test init ramdisk");

static void test_ramdisk_deinit(void)
{
    LOG_W(TEST_TAG, "filesystem unmount, and ramdisk deinit.");
    vfs_unmount("/");
    ramdisk_dev_deinit(&ramdisk_dev);
}
SH_CMD_EXPORT(ramdisk_deinit, test_ramdisk_deinit, "test deinit ramdisk");

运行结果如下:

sh />ramdisk_init
W/RAMDISK tshell: create ramdisk device:ramdisk0 successfully
W/TEST tshell: ramdisk init success.
I/VFS_FS tshell: Mount cute to /
W/TEST tshell: cutefs mount success.
sh />
sh />ls
Directory /:
sh />
sh />echo 111 test1.txt
sh />ls
Directory /:
test1.txt           3
sh />cat test1.txt
111
sh />ramdisk_deinit
W/TEST tshell: filesystem unmount, and ramdisk deinit.
sh />
sh />ls
No such directory
sh />

在RAMDISK上运行FATFS

本示例演示了RAMDISK的动态初始化和销毁,并配合FATFS文件系统使用(实际使用FATFS时,每个BLOCK的大小可以是512、 1024、2048 或者4096 bytes,BLOCK的个数至少为192个),示例代码如下:

#include <oneos_config.h>
#include <os_dbg.h>
#include <shell.h>
#include <os_errno.h>
#include <ramdisk.h>
#include <vfs_posix.h>

#define TEST_FS_TAG         "TEST_FS"

#define RAMDISK_NAME        "ramdisk0"
#define RAMDISK_BLK_SIZE    512
#define RAMDISK_BLK_NUM     192

static ramdisk_dev_t *ram_dev = OS_NULL;
static void test_create_ramdisk(void)
{
    ram_dev = ramdisk_dev_create(RAMDISK_NAME, RAMDISK_BLK_SIZE * RAMDISK_BLK_NUM, RAMDISK_BLK_SIZE);
    if (!ram_dev)
    {
        LOG_E(TEST_FS_TAG, "create ramdisk failed.");
        return;
    }

    LOG_W(TEST_FS_TAG, "create ramdisk successful.");
}

static void test_destroy_ramdisk(void)
{
    if (ram_dev)
    {
        ramdisk_dev_destroy(ram_dev);
        LOG_W(TEST_FS_TAG, "destroy ramdisk!");
    }
}

static void test_mount_fatfs_on_ramdisk(void)
{
    if (0 != vfs_mount(RAMDISK_NAME, "/", "fat", 0, 0))
    {
        LOG_E(TEST_FS_TAG, "mount fatfs failed.");
        return;
    }

    LOG_W(TEST_FS_TAG, "mount fatfs successful.");
}

static void test_unmount_fatfs_on_ramdisk(void)
{
    if (vfs_unmount("/") == 0)
    {
        LOG_W(TEST_FS_TAG, "fatfs File System unmount success!");
    }
    else
    {
        LOG_E(TEST_FS_TAG, "fatfs File System unmount failed!");
    }
}

void test_fs(os_int32_t argc, char **argv)
{
    if (argc == 1)
    {
        LOG_E(TEST_FS_TAG, "Usage: test_fs [cmd]");
    }
    else if (argc == 2)
    {
        if (strcmp(argv[1], "mount_fat_ram") == 0)
        {
            test_mount_fatfs_on_ramdisk();
        }
        if (strcmp(argv[1], "unmount_fat_ram") == 0)
        {
            test_unmount_fatfs_on_ramdisk();
        }
        if (strcmp(argv[1], "create_ramdisk") == 0)
        {
            test_create_ramdisk();
        }
        if (strcmp(argv[1], "destroy_ramdisk") == 0)
        {
            test_destroy_ramdisk();
        }
    }
}
SH_CMD_EXPORT(test_fs, test_fs, "test fs func");

运行结果如下:

sh />test_fs create_ramdisk
W/RAMDISK: create ramdisk device:ramdisk0 successfully
W/TEST_FS: create ramdisk successful.
sh />
sh />mkfs -t fat ramdisk0
sh />
sh />test_fs mount_fat_ram
I/VFS_FS: Mount fat to /
W/TEST_FS: mount fatfs successful.
sh />
sh />ls
Directory /:
sh />
sh />echo 111 test1.txt
sh />ls
Directory /:
test1.txt           3
sh />cat test1.txt
111
sh />test_fs unmount_fat_ram
W/TEST_FS: fatfs File System unmount success!
sh />
sh />test_fs destroy_ramdisk
W/TEST_FS: destroy ramdisk!

results matching ""

    No results matching ""

    返回顶部