MS-RTOS 共享内存

更新时间:
2023-08-09
下载文档

MS-RTOS 共享内存

本章将介绍 MS-RTOS 共享内存的使用。

共享内存介绍

共享内存是 MS-RTOS 多个进程都能访问的内存。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率不够高而专门设计的。它往往与其他通信机制(如读写锁)配合使用,来实现进程间的同步和通信。

共享内存相关 API

下表展示了共享内存相关的 API 在两个权限空间下是否可用:

API用户空间内核空间
ms_shm_drv_register
ms_shm_dev_create

ms_shm_drv_register()

  • 描述 注册共享内存驱动

  • 函数原型

ms_err_t ms_shm_drv_register(void);
  • 参数

  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

ms_shm_dev_create()

  • 描述 创建共享内存设备

  • 函数原型

ms_err_t ms_shm_dev_create(const char *path, ms_addr_t base, ms_size_t size, 
                             ms_bool_t mpu_protect);
  • 参数
输入/输出参数描述
[in]path共享内存设备文件的路径
[in]base共享内存的基地址
[in]size共享内存的大小
[in]mpu_protect是否使用 MPU 进行保护
  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

    ms_shm_drv_register();
    ms_shm_dev_create("/dev/shm0", BSP_CFG_SHARED_RAM_BASE + 0 * 8192, 8192, MS_TRUE);
    ms_shm_dev_create("/dev/shm1", BSP_CFG_SHARED_RAM_BASE + 1 * 8192, 8192, MS_TRUE);
    ms_shm_dev_create("/dev/shm2", BSP_CFG_SHARED_RAM_BASE + 2 * 8192, 8192, MS_FALSE);
    ms_shm_dev_create("/dev/shm3", BSP_CFG_SHARED_RAM_BASE + 3 * 8192, 8192, MS_FLASE);

共享内存通信示例

写端进程打开共享内存设备文件,通过 ms_io_ioctl 获得共享内存的基地址和大小,并写入一个字符串:

#include <ms_rtos.h>
#include <string.h>

int main (int argc, char **argv)
{
    ms_addr_t base;
    ms_size_t size;
    ms_handle_t rwlockid;
    int shmfd;

    shmfd = ms_io_open("/dev/shm0", O_WRONLY, 0666);

    ms_io_ioctl(shmfd, MS_SHM_CMD_GET_BASE, &base);
    ms_io_ioctl(shmfd, MS_SHM_CMD_GET_SIZE, &size);
    ms_io_ioctl(shmfd, MS_SHM_CMD_GET_RW_LOCK_ID, &rwlockid);

    ms_rwlock_lock_write(rwlockid, MS_TIMEOUT_FOREVER);
    strcpy((void *)base, "hello");
    ms_rwlock_unlock(rwlockid);

    ms_io_close(shmfd);

    return  (0);
}

读端进程也打开该共享内存设备文件,通过 ms_io_ioctl 获得共享内存的基地址和大小,并通过 ms_printf 函数打印存储于该共享内存的字符串:

#include <ms_rtos.h>

int main (int argc, char **argv)
{
    ms_addr_t base;
    ms_size_t size;
    ms_handle_t rwlockid;
    int shmfd;

    shmfd = ms_io_open("/dev/shm0", O_RDONLY, 0666);

    ms_io_ioctl(shmfd, MS_SHM_CMD_GET_BASE, &base);
    ms_io_ioctl(shmfd, MS_SHM_CMD_GET_SIZE, &size);
    ms_io_ioctl(shmfd, MS_SHM_CMD_GET_RW_LOCK_ID, &rwlockid);

    ms_rwlock_lock_read(rwlockid, MS_TIMEOUT_FOREVER);
    ms_printf("%s\n", (char *)base);
    ms_rwlock_unlock(rwlockid);

    ms_io_close(shmfd);

    return  (0);
}

共享内存支持的 ioctl 命令

命令描述参数
MS_SHM_CMD_GET_BASE获得共享内存的基地址ms_addr_t 指针
MS_SHM_CMD_GET_SIZE获得共享内存的大小ms_size_t 指针
MS_SHM_CMD_GET_RW_LOCK_ID获得共享内存的读写锁 IDms_handle_t 指针
MS_SHM_CMD_GET_W_SEQ获得共享内存的写序列号ms_uint32_t 指针
MS_SHM_CMD_W_COMMIT写提交(写序列号将加一)
文档内容是否对您有所帮助?
有帮助
没帮助