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 | 获得共享内存的读写锁 ID | ms_handle_t 指针 |
MS_SHM_CMD_GET_W_SEQ | 获得共享内存的写序列号 | ms_uint32_t 指针 |
MS_SHM_CMD_W_COMMIT | 写提交(写序列号将加一) | 无 |