From 260d429a6d0c22236d08eddc5d5229bf40b9e2aa Mon Sep 17 00:00:00 2001 From: guyiwen Date: Tue, 29 Mar 2022 09:30:46 +0800 Subject: [PATCH] mcs: free bin_buffer and modify addr 1. free binbuffer after copying image to specific address to avoid memory leak. 2. modify openamp vdev address 3. add zephyr bin image file Signed-off-by: guyiwen --- mcs/README.md | 12 +++++++++++- mcs/openamp_demo/rpmsg-internal.h | 4 +++- mcs/openamp_demo/rpmsg_main.c | 3 ++- mcs/openamp_demo/rpmsg_ping.c | 3 ++- mcs/zephyr/zephyr.bin | Bin 0 -> 105392 bytes 5 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 mcs/zephyr/zephyr.bin diff --git a/mcs/README.md b/mcs/README.md index 281ba153..4fe5c00a 100644 --- a/mcs/README.md +++ b/mcs/README.md @@ -29,18 +29,28 @@ openamp_demo: 提供OpenAMP用户态程序样例,支持与指定Client OS进 make ```` +注意:此处定义OpenAMP通信设备共享内存起始地址为0x70000000,可根据实际内存分配进行修改。 + 4. 将编译好的KO模块、用户态程序,以及zephyr.bin镜像拷贝到OpenEuler Embedded 系统的目录下。如何拷贝可以参考使用手册中共享文件系统场景。 +5. 将OpenAMP的依赖库libmetal.so,libopen_amp.so,libsysfs.so拷贝至文件系统/lib64目录。如何拷贝可以参考使用手册中共享文件系统场景。 #### 使用说明 1. 在openEuler Embedded系统上插入内核KO模块cpu_handler_dev.ko。 +```` + insmod cpu_handler_dev.ko +```` + 2. 运行rpmsg_main程序,使用方式如下: ```` ./rpmsg_main -c [cpu_id] -b [boot_address] -t [target_binfile] -a [target_binaddress] eg: - ./rpmsg_main -c 3 -b 0xc0000ffc -t /tmp/zephyr.bin -a 0xc0000000 + ./rpmsg_main -c 3 -b 0x7a000ffc -t /tmp/zephyr.bin -a 0x7a000000 ```` +此处定义Client OS起始地址为0x7a000000,启动地址为0x7a000ffc。 + +注意:以上述demo为例,需要预留出地址0x70000000为起始的内存用于OpenAMP demo和Client OS启动。通过QEMU启动时,当指定-m 1G时默认使用0x40000000-0x80000000的系统内存。添加内核启动参数`mem=768M`,可预留地址为0x70000000-0x80000000的256M内存,可根据实际情况进行调整。 diff --git a/mcs/openamp_demo/rpmsg-internal.h b/mcs/openamp_demo/rpmsg-internal.h index 44d80c14..ebfde5fb 100644 --- a/mcs/openamp_demo/rpmsg-internal.h +++ b/mcs/openamp_demo/rpmsg-internal.h @@ -5,7 +5,7 @@ #include #include -#define VDEV_START_ADDR 0xD0000000 +#define VDEV_START_ADDR 0x70000000 #define VDEV_SIZE 0x30000 #define VDEV_STATUS_ADDR VDEV_START_ADDR @@ -23,5 +23,7 @@ #define IRQ_SENDTO_CLIENTOS _IOW('A', 0, int) #define DEV_CLIENT_OS_AGENT "/dev/cpu_handler" +extern char *cpu_id; + void rpmsg_app_master(void); #endif diff --git a/mcs/openamp_demo/rpmsg_main.c b/mcs/openamp_demo/rpmsg_main.c index 2ac2726f..037ec8e9 100644 --- a/mcs/openamp_demo/rpmsg_main.c +++ b/mcs/openamp_demo/rpmsg_main.c @@ -14,7 +14,7 @@ static struct remoteproc rproc_inst; static struct remoteproc_ops ops; -static char *cpu_id; +char *cpu_id; static char *boot_address; static char *target_binfile; static char *target_binaddr; @@ -52,6 +52,7 @@ static int load_bin(void) access_address = mmap((void *)bin_addr, MAX_BIN_BUFLEN, PROT_READ | PROT_WRITE, MAP_SHARED, memfd, bin_addr); memcpy(access_address, bin_buffer, bin_size); + free(bin_buffer); return 0; } diff --git a/mcs/openamp_demo/rpmsg_ping.c b/mcs/openamp_demo/rpmsg_ping.c index 0cb75168..6cea999a 100644 --- a/mcs/openamp_demo/rpmsg_ping.c +++ b/mcs/openamp_demo/rpmsg_ping.c @@ -46,6 +46,7 @@ static void virtio_notify(struct virtqueue *vq) (void)vq; int cpu_handler_fd; int ret; + int cpu_num = strtol(cpu_id, NULL, 0); cpu_handler_fd = open(DEV_CLIENT_OS_AGENT, O_RDWR); if (cpu_handler_fd < 0) { @@ -53,7 +54,7 @@ static void virtio_notify(struct virtqueue *vq) return; } - ret = ioctl(cpu_handler_fd, IRQ_SENDTO_CLIENTOS, 3); + ret = ioctl(cpu_handler_fd, IRQ_SENDTO_CLIENTOS, cpu_num); if (ret) { printf("send ipi tp second os failed\n"); } diff --git a/mcs/zephyr/zephyr.bin b/mcs/zephyr/zephyr.bin new file mode 100644 index 0000000000000000000000000000000000000000..585dd2d37f30ff057677080ce98ed06fb1b0c2ae GIT binary patch literal 105392 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 XE$3fjx$pd|zEupL$+i1ezx{s#@cHM< literal 0 HcmV?d00001 -- Gitee