异构R5实时系统开发笔记-基于米尔芯驰D9360
![](/public/static/modules/cms/images/rd1.png)
2024-06-13
![](/public/static/modules/cms/images/rd2.png)
322
![](/public/static/modules/cms/images/rd3.png)
来源:米尔电子
本篇测评由与非网的优秀测评者“短笛君”提供。
本处参考<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
![](https://srcc.myir.cn/images/20240613/fe56c2f33df4cdb651ab9667d5fd4f5c.png?v=891844)
新建一个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 !
2024-09-06
Openharmony软件评估指南-瑞芯微RK3568开发板
Openharmony软件评估指南用于介绍在米尔的开发板上运行Openharmony系统下的核心资源与外设资源的测试步骤与评估方法。本文可作为前期评估指南使用,也可以作为通用系统开发的测试指导书使用。本文档使用于米尔电子的MYD-LR3568系列板卡,该板卡是米尔电子的嵌入式开发平台基于瑞芯微公司的高性能的嵌入式ARM处理器开发的,其中该系列使用的核心芯片为RK3568X。图1-1.米尔MYD-L
2024-09-06
7折,米尔-新唐MA35D1开发板正式开售!
近日,米尔发布基于新唐MA35D1芯片设计的嵌入式处理器模块MYC-LMA35核心板及开发板。MYC-LMA35核心板及开发板不仅集成了高性能的处理器芯片,还采用了创新的设计理念和丰富的外设资源,旨在满足新能源充电桩、工程机械控制器、OBD汽车诊断仪、工业网关、运动控制器和电力DTU等多元化应用场景的需求。为回馈广大客户的支持与厚爱,米尔电子特别推出新品MYD-LMA35开发板7折优惠活动,限量2
2024-09-06
米尔电子获年度AI创新产品奖,多款AI核心板赋能
近日,由电子发烧友网和elexcon2024深圳国际电子展暨嵌入式展、半导体展联合举办的2024第八届人工智能大会顺利举行,大会表彰了在行业中表现卓越的电子元器件和芯片、模组供应商,公布了“2024年度市场卓越表现奖”获奖名单。作为领先的嵌入式处理器模组厂商-米尔电子,凭借多款AI核心板荣获“年度AI创新产品奖”。再次展现出米尔电子在嵌入式模组行业的创新能力。米尔电子深耕嵌入式领域10多年,与ST
2024-08-28
领万元大奖!米尔电子Remi Pi 瑞米派创意秀
大赛简介为鼓励工程师勇于创新探索的精神,提升实践动手能力,更深度的体验瑞米派产品,米尔电子联合瑞萨共同发起“米尔电子&瑞萨 瑞米派创意秀”,提供瑞米派支持开发者创新应用。报名条件:需关注米尔电子公众号的用户;报名对象:面向企业、创客团队、工程师、电子爱好者、研究院等人士,不限个人或团体形式参赛。大赛日程01-活动申请【时间:2024/08/28-2024/09/30】在线填《报名申请表》,
2024-08-28
米尔携瑞萨RZ系列产品亮相Elexcon深圳国际电子展
2024年8月27日-29日,elexcon2024深圳国际电子展在深圳会展中心(福田)隆重开幕。汇聚全球优质品牌广商齐聚现场,打造电子全产业链创新展示、一站式采购及技术交流平台,展示全球产业动态及未来技术趋势。深圳市米尔电子有限公司(简称:米尔电子)作为瑞萨电子的合作伙伴参展,展出基于RZ系列的核心模组和行业应用demo。elexcon瑞萨展台-米尔活动现场精彩1:米尔RZ/G2L开发板的充电桩
2024-08-23
现场送瑞米派!预约瑞萨RZ/G通用MPU研讨会
RZ/G系列是基于Arm®Cortex®架构和RISC-V架构运行Linux操作系统的可扩展MPU平台,具有先进的图形、视频引擎和高速接口。RZ/G系列的可扩展和高效性使其成为工业自动化、楼宇自动化HMI、工业摄像头和网关应用的理想之选。8月28日,瑞萨电子将携手米尔电子、Qt、百问网、AIZIP等合作伙伴举办线下研讨会,邀您赴现场共同探讨RZ/G系列的技术细节,包括硬件架构、软件开发工具以及在工
2024-08-23
国产核心板全面进攻-RK3568开发板评测
随着端侧AI应用的落地,预计集成NPU的SoC产品将迎来爆发式的增量市场。本期与非网给大家带来一款采用国内知名SoC厂商的产品——基于瑞芯微RK3568的开发板(MYD-LR3568J-32E4D-180-I-GK)。此款开发板是米尔电子推出的一款基于瑞芯微RK3568的工业板。笔者手上的为最高规格配置的版本,4GB LPDDR4 + 32GB eMMC,工业级温度的处理器RK3568J。开发板硬
2024-08-15
原生支持17路UART和4路CAN FD,新唐MA35D1核心板发布!
米尔发布基于新唐MA35D1芯片设计的嵌入式处理器模块MYC-LMA35核心板及开发板,MA35D1是集成2个Cortex-A35与1个Cortex-M4的异构微处理器芯片。核心板采用创新LGA 252PIN设计,存储配置256MB DDR3L、256MB Nand Flash/ 8GB EMMC,同时具有丰富的通讯接口,可广泛应用于新能源充电桩、工程机械控制器、OBD汽车诊断仪、工业网关、运动控
2024-07-31
米尔RK3568加推工控板和工控机,更丰富的场景应用
国产之星-瑞芯微RK3568一直备受关注,米尔电子推广的RK3568核心板采用创新LGA设计,核心板质量更可靠,成本更优。除米粉派RK3568(MYD-LR3568开发板)之外,米尔加推MYD-LR3568-GK工控板和MYD-LR3568-GK-B工控机,丰富更多的应用场景。MYD-LR3568-GK工控板基于MYC-LR3568工业级核心板设计,搭载4核ARM Cortex-A55架构的高性能
2024-07-31
新品7折购!米尔RK3568国产开发板
近日,米尔电子发布MYC-LR3568核心板及开发板,核心板基于高性能、低功耗的国产芯片-瑞芯微RK3568。核心板采用LGA 创新设计,可实现100%全国产自主可控。为感谢广大客户支持,新品上架MYD-LR3568系列开发板7折回馈客户,原价499元,抢先体验价350元起!各型号限购20套,每个ID限购1套,售完即止!产品型号对应核心板型号工作温度MYD-LR3568J-32E4D-180-I-