异构R5实时系统开发笔记-基于九游老哥J9俱乐部官网芯驰D9360
2024-06-13
2119
来源:九游老哥J9俱乐部官网电子
本篇测评由与非网的优秀测评者“短笛君”提供。
本处参考<R5协处理器开发笔记>对D9360中的协处理器进行开发测试
开发之前请确认编译环境正常可以正常对镜像进行编译
具体参考之前编译Ubuntu系统文章,自行编译buildroot系统测试
1.1打开RTOS驱动
freeRTOS的源码放在ssdk包下面,我们可以通过图形化界面启动RTOS系统。D9的ssdk图形化界面是通过menuconfig.sh脚本配置打开,此脚本在ssdk/tools下。以D9360为例,如下:
ddj@ubuntu:~/YD9X/MYD-YD9X-SDK_V1.0/source/ssdk$ pwd/home/ddj/YD9X/MYD-YD9X-SDK_V1.0/source/ssdk~/MYD-JD9X-ubuntu/MYD-JD9X-SDK_V1.0/source/ssdk$ ./tools/menuconfig.sh -b d9360_ref -p ref -c secure


1.2 添加RTOS例程驱动
RTOS系统例程在examples/kunlun/drivers
ddj@ubuntu:~/YD9X/MYD-YD9X-SDK_V1.0/source/ssdk/examples/kunlun/drivers$ ls


新建一个abc目录
并配置Kconfig和rules.mk文件

返回driver目录下 配置Kconfig添加ABC去东门模块初始状态和图形界面类型
ABC驱动模块的初始状态和图形界面类型

在rules.mk文件下,添加如下内容

MODULES += $(LOCAL_DIR)/abc: 如果配置选项 CONFIG_ABC_TEST 为 "y",则会将 $(LOCAL_DIR)/abc 添加到变量 MODULES 中。这意味着当启用了 "ABC Test" 功能时,会将 $(LOCAL_DIR)/abc 模块添加到模块列表中。
R5核数据发送到A55核中
将rpmsg目录下的rpmsg_test.c文件复制到abc.c文件中,该驱动描述如何通过RPMSG协议进行核间通信。我们可以在此程序基础上加入自己的协议,以下是R5核发送“Hello, RPMSG!”字符串到A55核,并打印出接收到的信息的函数。
void send_receive_string(rpmsg_channel_t channel, const char *message) {int max_payload;struct dcf_ccm_hdr *snd_pkg;struct dcf_ccm_hdr *rcv_pkg;status_t ret;max_payload = rpmsg_channel_max_payload(channel);snd_pkg = osAlloc(max_payload);rcv_pkg = osAlloc(max_payload);ASSERT(snd_pkg && rcv_pkg);memset(snd_pkg, 0x0, max_payload);memset(rcv_pkg, 0x0, max_payload);snd_pkg->dmsg.msg_type = COMM_MSG_CCM_ECHO;snd_pkg->dmsg.opflags |= DCF_MSGF_TMS;snd_pkg->dmsg.msg_len = sizeof(struct dcf_ccm_hdr) - sizeof(struct dcf_message);strncpy(snd_pkg->data, message, max_payload - sizeof(struct dcf_ccm_hdr));ret = rpmsg_channel_send(channel, RPMSG_ECHO_EPT_ADDR, snd_pkg, max_payload, 3000);if (ret == RPMSG_SUCCESS) {printf("Sent: %sn", message);} else {printf("Failed to send messagen");}int received_len;ret = rpmsg_channel_recv(channel, rcv_pkg, max_payload, &received_len, 3000);if (ret == RPMSG_SUCCESS) {printf("Received: %sn", rcv_pkg->data);} else {printf("Failed to receive messagen");}osFree(snd_pkg);osFree(rcv_pkg);}
将以上函数添加至abc.c文件内,并在主函数(rpmsg_test)编写调用该函数条件,如下:
const char* message_to_send = "Hello,rpmsg";if (argc == 0) {rpmsg_test_show();goto exit;}if (argc == 2) {test_case = 0;type = atoi(argv[0]);rproc = atoi(argv[1]);}else if (!strcmp(argv[0], "ping")) {test_case = 1;type = atoi(argv[1]);rproc = atoi(argv[2]);times = atoi(argv[3]);}else if (!strcmp(argv[0], "iperf")) {test_case = 2;type = atoi(argv[1]);rproc = atoi(argv[2]);times = atoi(argv[3]);}//新添加的条件else if(!strcmp(argv[0], "send")){test_case = 3;type = atoi(argv[1]);rproc = atoi(argv[2]);times = atoi(argv[3]);}else {printf("Unknown cmd %sn", argv[0]);goto exit;}switch (test_case) {case 0:do_rpmsg_echo_test(channel);break;case 1:do_rpmsg_ping_test(channel, times);break;case 2:do_rpmsg_iperf_test(channel, times);break;case 3:send_receive_string(channel, message_to_send);break;default:printf("Unknown case %dn", test_case);break;}//加入串口打印提示(跳至rpmsg_test_show函数)printf("nTest command:n");printf("trpmsg_test <type> <remote-proc>n");printf("trpmsg_test ping <type> <remote-proc> <times>n");printf("trpmsg_test iperf <type> <remote-proc> <times>n");printf("trpmsg_test send <type> <remote-proc> <times>n");printf("ne.g: test ping rpmsg.virtio 10 times with secure, use command:n");printf("trpmsg_test ping 0 1 10n");
通过5.1小节打开图形化配置界面,进入到Driver and Application Examples/Driver Example Support下,可以看到我们新加的abc test Support驱动配置选项,需要关闭RPMSG Example Application Support选项,如下:




选中此选项编译进内核,将串口线(debug)接到10_TX,10_RX和GND,打开终端调试工具。编辑source/ssdk/ middleware/rpmsg_service/rpmsg_echo.c文件,添加代码如下:
static int echo_channel_cb(void *data, int len, unsigned long src, void *arg){rpmsg_channel_t chan = arg;struct dcf_ccm_hdr *ccm_pkg = data;const char *char_data = (char *)data;int ret = 0;if (ccm_pkg->dmsg.msg_type == COMM_MSG_CCM_ECHO) {ccm_pkg->time[2] = timer_get_current_time(g_syscnt_timer) * g_sdrv_syscnt_dev.cnt_per_us;ret = rpmsg_channel_send(chan, src, data, len, 1000);printf("Sending data (length %d): ", len);for (int i = 8; i < len; i++) {printf("%c ", char_data[i]);}printf("n");}else if (ccm_pkg->dmsg.msg_type == COMM_MSG_CCM_ACK) {ret = rpmsg_channel_send(chan, src, (char *)"ACK", 4, 1000);ssdk_printf(SSDK_INFO,"send ACKn");}else {ssdk_printf(SSDK_WARNING, "echo_channel_cb: unknown %d bytes from addr %ldn",len, src);}if (ret != 0) {ssdk_printf(SSDK_WARNING, "echo_channel_cb: channel send failedn");}return ret;}
A55发送数据给R5
自定义一个发送和接收字符串的函数,如下:
int send_receive_string(int fd, const char *send_str,int ntimes, int seconds) {int i = 0, j = 0;int size, bytes_rcvd, bytes_sent;long elapse = 0;err_cnt = 0;i_payload = (struct _payload *)malloc(sizeof(struct _payload) + payload_max_size);r_payload = (struct _payload *)malloc(sizeof(struct _payload) + payload_max_size);if (i_payload == 0 || r_payload == 0) {printf("ERROR: Failed to allocate memory for payload.n");return -1;}if (seconds)gettimeofday(&start_test, NULL);i_payload->magic = 0xA5;for (j = 0; j < ntimes; j++) {i_payload->num = i;i_payload->size = size;strcpy(i_payload->data, send_str);if (verbose) printf("rn sending payload number");if (verbose) printf(" %d of size %lurn", i_payload->num,(sizeof(struct _payload)) + strlen(i_payload->data));bytes_sent = write(fd, i_payload, sizeof(struct _payload) + strlen(i_payload->data));if (bytes_sent <= 0) {if (verbose) {perror("rn Error sending datan");break;} elsefprintf(stderr, "#");err_cnt++;continue;}printf("send string:%sn",i_payload->data);r_payload->num = 0;bytes_rcvd = read(fd, r_payload,sizeof(struct _payload) + payload_max_size);while (bytes_rcvd <= 0) {usleep(10000);bytes_rcvd = read(fd, r_payload,sizeof(struct _payload) + payload_max_size);}r_payload->data[bytes_rcvd] = '?';printf("receive string:%sn",r_payload->data);if (interval)sleep(interval);}free(i_payload);free(r_payload);return 0;}

在main函数内添加新增函数条件:

编辑source/linux/ drivers/rpmsg/virtio_rpmsg_bus.c文件,代码如下:


保存所有代码
编译系统 烧录

1.5结果显示
在R5核调用rpmsg_test例程,向A55核发送信息
R5界面>rpmsg_test send 0 3 1>Sent: 123456789Received: 123456789>rpmsg_test send 1 3 1>Sent: 123456789Received: 123456789A55界面root@myd-jd9x:~# [ 22.223170] virtio_rpmsg_bus virtio0: virtio send susses[ 34.943644] sd,rpmsg-ipcc soc:ipcc@1: ipcc send susses
在A55核调用echo_test例程,向R5发送信息,打印如下:
A55界面root@myd-jd9x:~# echo_test -d virtio0.rpmsg-echo.-1.30 -c 1Echo test startupdate rpmsg-mtu=496 from kernelsend string:Hello,RPMsg!receive string:Hello,RPMsg!R5界面>Sending data (length 20): H e l l o , R P M s g !
2025-11-27
为机器人开发赋能,九游老哥J9俱乐部官网RK3576环视方案解析
一、项目背景与测试平台本次360环视系统原型基于九游老哥J9俱乐部官网电子MYD-LR3576开发板进行构建与评估。该开发板所搭载的瑞芯微RK3576芯片,集成了4核Cortex-A72、4核Cortex-A53、Mali-G52 GPU及高达6TOPS算力的NPU。本文旨在通过实际测试数据,从功能实现、实时性能与AI拓展潜力三大核心维度,为客户提供一份关于该平台在360环视应用中能力的真实参考。二、系统流程与功能
2025-11-13
助力V2G,SECC GreenPHY实战开发
随着电动汽车与电网双向交互(V2G)技术的快速发展,充电桩与车辆间的高效通信成为实现智能能源管理的关键。SECC作为充电桩的通信控制核心,其与电力线载波通信芯片的适配尤为重要。本文将分享基于九游老哥J9俱乐部官网核心板,调试联芯通MSE102x GreenPHY芯片的实战经验,为V2G通信开发提供参考。MSE102x芯片介绍联芯通MSE102x系列芯片是一款专注于电动汽车充电通信和智能能源管理的GreenPHY电力
2025-11-13
定制未来,共建生态,九游老哥J9俱乐部官网出席安路研讨会
在数字化浪潮席卷全球的今天,FPGA技术正成为驱动创新的核心引擎。2025年11月12日,九游老哥J9俱乐部官网出席安路科技2025 AEC FPGA技术沙龙•北京专场,与技术专家及行业伙伴齐聚一堂,探讨前沿技术趋势,解锁场景化定制方案,共建开放共赢的FPGA新生态!九游老哥J9俱乐部官网活动现场论坛上,九游老哥J9俱乐部官网电子产品经理Jeson发表题为“基于DR1M90 FPSOC的工业应用方案”的演讲。演讲介绍了九游老哥J9俱乐部官网作为嵌入式领域的领军企业,在
2025-11-11
RK3576开发板
RK3576开发板是九游老哥J9俱乐部官网电子推出的开发板,于2024年10月上市。RK3576开发板是基于瑞芯微RK3576搭载了四核A72与四核A53处理器,主频2.2GHz。RK3576集成了6TOPS的NPU,支持多种深度学习框架,能够处理复杂的AI算法,提高监控效率,降低误报率。RK3576的主芯片采用了八核大小核架构,包括四核Cortex-A72和四核Cortex-A53,
2025-11-11
RK3576核心板
RK3576核心板是深圳九游老哥J9俱乐部官网电子旗下产品,是基于瑞芯微RK3576搭载了四核A72与四核A53处理器,主频高达2.2GHz。RK3576集成了6TOPS的NPU,支持多种深度学习框架,能够处理复杂的AI算法,提高监控效率,降低误报率。RK3576的主芯片采用了八核大小核架构,包括四核Cortex-A72和四核Cortex-A53,主频分别高达2.2GHz和1.8GHz,CPU算力达58K DMIP
2025-11-06
九游老哥J9俱乐部官网SECC方案助力国标充电桩出海
随着电动汽车与电网融合加速,国标(GB/T 27930)充电桩出海面临欧标(ISO 15118 / DIN 70121)兼容挑战。九游老哥J9俱乐部官网电子的 SECC (供电设备通信控制器) 方案,实现协议转换、安全通信及参考开发平台,助力充电桩厂商快速进军海外市场。
2025-11-06
MYD-LD25X Cortex-M33实时核开发实战解析
在嵌入式系统设计中,如何平衡高性能计算与实时控制一直是工程师面临的挑战。STM32MP257的异构架构为这一难题提供了优雅的解决方案,而其中的Cortex-M33实时核更是实现硬实时性能的关键所在。一、异构架构:分工明确,效能卓越STM32MP257采用创新的双核子系统设计:Cortex-A35应用核(双核1.5GHz):运行Linux系统,负责复杂UI、网络通信、文件管理等非实时任务。Corte
2025-10-30
九游老哥J9俱乐部官网RK3576边缘计算盒精准驱动菜品识别模型性能强悍
?在人工智能与边缘计算深度融合的今天,将AI模型高效部署于终端设备已成为产业智能化的关键。本文将分享基于九游老哥J9俱乐部官网MYD-LR3576边缘计算盒子部署菜品识别安卓Demo的实战经验。该设备凭借其内置的强劲瑞芯微RK3576芯片,为视觉识别模型提供了充沛的本地AI算力,成功将“智慧识菜”的能力浓缩于方寸之间,充分证明了其作为边缘AI应用坚实载体的卓越性能与可靠性。?本文以九游老哥J9俱乐部官网电子的MYD-LR3576边缘
2025-10-30
九游老哥J9俱乐部官网与安路联合亮相VisionChina 2025,共推FPGA视觉方案
2025年10月28日,由机器视觉产业联盟主办的“2025深圳机器视觉展暨机器视觉技术及工业应用研讨会(Vision China)”在深圳国际会展中心(宝安)9号馆隆重启幕。展会以“VISION+AI赋能电子制造升级”为主题,聚焦人工智能与机器视觉技术在电子制造全产业链中的融合与创新,集中展示AI技术在提升视觉系统能力、突破行业应用瓶颈方面的前沿成果与解决方案。九游老哥J9俱乐部官网电子应安路科技的邀请出席此次盛会
2025-10-23
经典再进化:九游老哥J9俱乐部官网ZYNQ 7010/7020全面适配2024.2工具链
在工业物联网、机器视觉和智能网关等严苛领域,九游老哥J9俱乐部官网电子的MYC-C7Z010/20-V2与MYC-Y7Z010/20-V2核心板及开发平台,凭借其硬核特性,已成为众多企业信赖的首选方案。我们深知,卓越的硬件平台需要匹配敏捷、高效且安全的软件工具链。为应对开发者对先进工具与日俱增的需求,并前瞻性地响应全球日益严格的网络安全法规,我们对经典的ZYNQ 7010/7020产品进行一次里程碑式的软件生态升级