异构R5实时系统开发笔记-基于米尔芯驰D9360

2024-06-13

2021

来源:米尔电子
本篇测评由与非网的优秀测评者“短笛君”提供。
本处参考<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;
} else
fprintf(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: 123456789
Received: 123456789
>rpmsg_test send 1 3 1
>Sent: 123456789
Received: 123456789
A55界面
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 1
Echo test start
update rpmsg-mtu=496 from kernel
send string:Hello,RPMsg!
receive string:Hello,RPMsg!
R5界面
>Sending data (length 20): H e l l o , R P M s g !
2025-10-16
从微秒级响应到确定性延迟:深入解析米尔全志T536核心板的实时性技术突破
各位工程师同仁,今天咱们聊点硬核的——实时性。这不是那种"差不多就行"的性能指标,在工业控制、机器人运动、电力保护这些领域,实时性就是生命线。想象一下:工业机器人抓取精密元件时,哪怕几毫秒的延迟都可能导致良品率暴跌;电力系统故障检测,响应慢了几个毫秒可能就是一场灾难。为什么通用Linux在实时场景中"力不从心"?标准Linux内核设计初衷是"公平调
2025-10-16
米尔电子获全志科技生态认证,共推工业智能化升级
在近日举办的2025中国国际工业博览会上,米尔电子被全志科技正式授予“生态认证合作伙伴”证书,标志着双方在嵌入式处理器模组领域的合作迈入新阶段。此次认证基于米尔电子在T536、T527、T113等全志工业级核心板及开发板被市场的高度认可,米尔电子的全志系列产品已广泛应用于工业自动化、机器人及边缘计算场景。米尔代表领取“生态认证合作伙伴”证书(右三)生态共建:全产业链协同创新全志科技通过“芯片+
2025-10-16
名单揭晓,追加30套开发板!米尔-安路飞龙派「硬核创造力」第二季
经过米尔电子和安路科技的严格筛选,30位「硬核玩家」从千帆竞逐中脱颖而出,正式成为米尔-安路飞龙派第二季创意秀的玩家。开发者们将以MYD-YM90X开发板为起点,开启一场FPGA的盛宴,在安路飞龙派的赛道上探索无限可能!现将入选的30位开发者/团队名单公布如下(排名不分先后):
2025-09-26
颂歌迎国庆丨米尔电子国庆节及中秋放假通知及温馨提示
金风送爽,秋桂飘香,阖家欢聚,共庆国昌。我们即将迎来中秋佳节及祖国76周年华诞。在这美好的金秋时节,在这家国同庆之际,米尔全体员工衷心感谢您长期以来的信任和支持,预祝您节日快乐!·国庆放假时间·一二三四五六日29初八30初九1国庆2十一3十二4十三5十四6中秋7十六8十七9十八10十九11二十12廿一10月1日 至 10月8日,共放假8天根据《国务院办公厅关于2025年部分节假日安排的通知》相关内
2025-09-26
如何移植EtherCAT Igh--基于米尔RK3576开发板
本文将介绍基于米尔电子MYD-LR3576开发板(米尔基于瑞芯微 RK3576开发板)的板端移植EtherCAT Igh方案的开发测试。摘自优秀创作者-EPTmachine米尔基于瑞芯微RK3576开发板EtherCAT IgH需要保证高实时性,Preempt-RT是一种针对实时性能进行了优化的Linux内核。与普通的Linux内核相比,Preempt-RT具有以下优势:实时性能: Preempt
2025-09-18
追加!30套FPGA开发板免费送!米尔-安路飞龙派创意秀活动再开启
大赛简介日前,米尔电子2025年举办的米尔-安路飞龙派FPGA/FPSoC创意开发大赛圆满落幕,吸引了众多工程师踊跃参与。为持续推动技术创新,米尔电子现重磅推出第二期福利活动——基于安路DR1M90开发板的创意秀,再次免费赠送30套FPGA开发板,旨在鼓励工程师突破思维边界,通过实践探索安路飞龙派产品的无限可能,为创新应用提供强力支持。报名条件:用户需关注米尔电子公众号;第一期已领开发板的用户不可
2025-09-11
“一芯四用”,米尔RK3576如何同时驾驭4路YOLOv8视频流?
在科技飞速发展的当下,人工智能与边缘计算的融合正以前所未有的速度重塑着我们的生活。RK3576芯片拥有4核Cortex-A72以及4核Cortex-A53提供基础算力,6TOPS算力NPU来模型推导运算。使用YOLOv8模型时也是手到擒来,接下来随着步伐看看它表现如何。YOLO简介YOLO(You Only Look Once)是当前业界领先的实时目标检测算法系列,以其速度和精度的完美平衡而闻名。
2025-09-04
6TOPS算力驱动30亿参数LLM,米尔RK3576部署端侧多模态多轮对话
关键词:瑞芯微 RK3576、NPU(神经网络处理器)、端侧小语言模型(SLM)、多模态 LLM、边缘 AI 部署、开发板当 GPT-4o 用毫秒级响应处理图文混合指令、Gemini-1.5-Pro 以百万 token 上下文 “消化” 长文档时,行业的目光正从云端算力竞赛转向一个更实际的命题:如何让智能 “落地”?—— 摆脱网络依赖、保护本地隐私、控制硬件成本,让设备真正具备 “看见并对话” 的
2025-09-04
直播预告 | 恩智浦技术日巡回研讨会:技术盛宴,“云端”开席!
9月9日,恩智浦技术日巡回研讨会将在杭州举办!活动同期,恩智浦携手生态合作伙伴,将对会议中精彩的技术演讲全程进行网络直播,让更多的开发者足不出户,也能够直击活动现场,解锁前沿产品方案,共赴“云端”技术盛宴!直播期间,参与观众互动,还有好礼等你拿~~点击文章顶部卡片,或扫描海报二维码,约起来吧!
2025-08-28
米尔发表演讲,并携瑞萨RZ产品亮相2025 Elexcon深圳电子展
2025年8月26日-28日,Elexcon深圳国际电子展在深圳会展中心(福田)1号馆(展台号:1L30)盛大举行。作为全球电子产业链的重要盛会,展会汇聚创新技术与行业解决方案。米尔电子MYIR携RZ系列核心板、开发板等方案Demo亮相瑞萨嵌入式MCU/MPU生态专区,并发表主题演讲。技术盛宴:瑞萨RZ系列产品矩阵亮相展会上,米尔展示了基于RZ/G2L、RZ/G2UL、RZ/T2H的核心板