Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Linux
RISC-V_milk-v_CV1800B
MilkV Duo 核间通信分析
发布于 2023-12-23 15:03:21 浏览:595
订阅该版
[tocm] # MilkV Duo 核间通信分析 一直对 milkv duo 的大小核 Linux 和 FreeRTOS 之间的交互很好奇,但苦于目前相关的资料还很少,就根据目前官方的文档和源码先简单分析一下吧,本人为 Linux 新手,很多理解错误或不到位的地方还希望大家指正补充。 ## 官方文档示例 首先分析官方文档中的一个点灯示例:https://milkv.io/zh/docs/duo/getting-started/rtoscore 文档中给出一个在大核 Linux 中运行的 .c 文件,调用小核的 FreeRTOS 进行点灯。 ```c #define RTOS_CMDQU_DEV_NAME "/dev/cvi-rtos-cmdqu" int fd = open(RTOS_CMDQU_DEV_NAME, O_RDWR); ``` 这里可以看出运行 FreeRTOS 的小核被描述为一个设备,对应为 `/dev/cvi-rtos-cmdqu` Linux 通过其进行访问。 ```c struct cmdqu_t cmd = {0}; cmd.ip_id = 0; cmd.cmd_id = CMD_DUO_LED; cmd.resv.mstime = 100; cmd.param_ptr = DUO_LED_ON; ret = ioctl(fd , RTOS_CMDQU_SEND_WAIT, &cmd); ``` 并通过 ioctl 对小核 RTOS 设备进行控制 (`ioctl` 的具体用法和支持的操作取决于设备和设备驱动程序。) 分析 ioctl 是大小核通信的关键部分,Linux 内核中是使用 mailbox 驱动,猜测其与 ioctl 的具体实现相关。 ## 官方源码 ### 大核Linux https://github.com/milkv-duo/duo-buildroot-sdk/tree/develop/linux_5.10/drivers/soc/cvitek/rtos_cmdqu 通过该文件夹中的源码,分析 Linux 核间通信实现。 [cvi_mailbox.h](https://github.com/milkv-duo/duo-buildroot-sdk/blob/develop/linux_5.10/drivers/soc/cvitek/rtos_cmdqu/cvi_mailbox.h) 为 mailbox 相关声明; [cvi_spinlock.c/.h](https://github.com/milkv-duo/duo-buildroot-sdk/blob/develop/linux_5.10/drivers/soc/cvitek/rtos_cmdqu/cvi_spinlock.c) 为自旋锁实现,用于线程通讯时同步保护; [rtos_cmdqu.c/.h](https://github.com/milkv-duo/duo-buildroot-sdk/blob/develop/linux_5.10/drivers/soc/cvitek/rtos_cmdqu/rtos_cmdqu.c) 为与小核 RTOS 交互消息队列的主要部分。 在 rtos_cmdqu.h 文件中又能看到对小核 RTOS 设备的描述: ```c #define RTOS_CMDQU_DEV_NAME "cvi-rtos-cmdqu" ``` 向外提供以下几个向消息队列发送消息的api: ``` int rtos_cmdqu_send(cmdqu_t *cmdq); int rtos_cmdqu_send_wait(cmdqu_t *cmdq, int wait_cmd_id); ``` 在 rtos_cmdqu.c 文件中可以找到 `ioctl` 的具体实现: ```c static long cvi_rtos_cmdqu_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ``` 实现了 IOCTL 处理程序(`cvi_rtos_cmdqu_ioctl`)以处理特定的 ioctl 命令,包括 `RTOS_CMDQU_SEND`、`RTOS_CMDQU_SEND_WAIT` 和 `RTOS_CMDQU_SEND_WAKEUP`。其中调用 `rtos_cmdqu_send` 等向小核发起通信,`rtos_cmdqu_send` 中使用自旋锁进行同步保护,通过 mailbox 机制访问共享内存。 大核 Linux 通过 `request_irq` 注册中断处理函数: ```c err = request_irq(mailbox_irq, rtos_irq_handler, 0, "mailbox", (void *)ndev); ``` 在 `rtos_irq_handler` 中通过 mailbox 机制访问读取共享内存,中断号 `mailbox_irq` 通过 `platform_get_irq_byname` 获取: ```c mailbox_irq = platform_get_irq_byname(pdev, "mailbox"); ``` ## 小核RTOS [rtos_cmdqu.h](https://github.com/milkv-duo/duo-buildroot-sdk/blob/develop/freertos/cvitek/driver/rtos_cmdqu/include/rtos_cmdqu.h) 中多出了以下操作: ```c #define RTOS_CMDQU_REQUEST _IOW('r', CMDQU_REQUEST, unsigned long) #define RTOS_CMDQU_REQUEST_FREE _IOW('r', CMDQU_REQUEST_FREE, unsigned long) ``` [riscv64](https://github.com/milkv-duo/duo-buildroot-sdk/tree/develop/freertos/cvitek/task/comm/src/riscv64) 该文件夹中可以找到提供的 led io 操作,以及 FreeRTOS 中负责核间通信的主要部分 [comm_main.c](https://github.com/milkv-duo/duo-buildroot-sdk/blob/develop/freertos/cvitek/task/comm/src/riscv64/comm_main.c) ,其中使用命令队列 queHandle 存储来自 Linux 的命令,并创建了一个名为 CMDQU 的任务,用于处理核间通信,根据Linux 的指令进行控制处理。接受来自 Linux 的命令是在中断服务中进行,通过 xQueueSendFromISR 将接受到的命令存储到命令队列中。 ## 总结 以上就是目前 milkv duo 大小核之间通信的简单分析,通过自旋锁进行同步保护,使用中断进行通知触发,通过 mailbox 的机制访问共享内存进行通讯。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
螺丝松掉的人
这家伙很懒,什么也没写!
文章
42
回答
0
被采纳
0
关注TA
发私信
相关文章
1
RT-Thread Studio 跨平台
2
Linux下Scons编译工程遇到宏定义的问题,如何解决?
3
Linux下开发rtthread,求资料
4
qemu-vexpress-a9运行 qemu-dbg.sh 提示错误
5
ART-Pi SDK在Linux环境下编译不通过问题
6
虚拟串口在Linux下的使用问题
7
linux命令行通过串口发送finsh指令无法执行
8
怎么移植linux上的软件
9
linux下使用RT-Thread Studio插件如何进行stlink下载
10
代码在ubuntu上编译不能运行
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部