From efce1c62dc45e2d9ad120628a4a0d90247ea5b44 Mon Sep 17 00:00:00 2001 From: yaoguangzhong Date: Fri, 28 Feb 2025 19:04:27 +0800 Subject: [PATCH] uniproton: send data to nrtos by shared memory method send data to nrtos by shared memory method Signed-off-by: Guangzhong Yao --- .../config_armv8_kp920/defconfig | 4 +-- demos/kp920/config/prt_config.h | 2 +- src/component/mica/rpmsg_service.c | 14 ++++++-- testsuites/rhealstone/rcv-data/rcv-data.c | 33 ++++++++++++++----- .../rhealstone/rcv-data/rpmsg_backend.h | 4 +-- 5 files changed, 42 insertions(+), 15 deletions(-) diff --git a/build/uniproton_config/config_armv8_kp920/defconfig b/build/uniproton_config/config_armv8_kp920/defconfig index da1033f0..cb392ab9 100644 --- a/build/uniproton_config/config_armv8_kp920/defconfig +++ b/build/uniproton_config/config_armv8_kp920/defconfig @@ -165,7 +165,7 @@ CONFIG_OS_OPTION_LINUX=y # # Rsc table option Configuration # -# CONFIG_OS_OPTION_RSC_TABLE is not set +CONFIG_OS_OPTION_RSC_TABLE=y # # dirvers Modules Configuration @@ -283,4 +283,4 @@ CONFIG_CONFIG_BOARD_LOOPSPERMSEC=25000 # # Spi Modules Configuration # -# CONFIG_OS_SUPPORT_SPI is not set \ No newline at end of file +# CONFIG_OS_SUPPORT_SPI is not set diff --git a/demos/kp920/config/prt_config.h b/demos/kp920/config/prt_config.h index 9710b1cf..caec0182 100644 --- a/demos/kp920/config/prt_config.h +++ b/demos/kp920/config/prt_config.h @@ -78,7 +78,7 @@ extern "C" { #define OS_MEM_FSC_PT_ADDR (uintptr_t)&g_memRegion00[0] /* 私有FSC内存分区大小 */ #if defined(OS_OPTION_RSC_TABLE) -#define OS_MEM_FSC_PT_SIZE 0x200000 /* 程序运行堆空间大小,为满足数据传输buffer malloc可申请1M空间大小,将堆空间修改为2M */ +#define OS_MEM_FSC_PT_SIZE 0x300000 /* 程序运行堆空间大小,为满足数据传输buffer malloc可申请2M空间大小,将堆空间修改为3M */ #else #define OS_MEM_FSC_PT_SIZE 0x60000000 #endif diff --git a/src/component/mica/rpmsg_service.c b/src/component/mica/rpmsg_service.c index 0957c4d4..73704c80 100644 --- a/src/component/mica/rpmsg_service.c +++ b/src/component/mica/rpmsg_service.c @@ -52,9 +52,11 @@ static struct rpmsg_rcv_msg tty_msg; /* RPMsg umt */ #define RPMSG_UMT_EPT_NAME "rpmsg-umt" +#define OPENAMP_SHM_COPY_SIZE 0x100000 /* 1M */ static SemHandle umt_sem; static struct rpmsg_endpoint umt_ept; static struct rpmsg_rcv_msg umt_msg; +static U64 g_umt_send_data_addr; char *g_s1 = "Hello, UniProton! \r\n"; extern char *g_printf_buffer; @@ -238,10 +240,15 @@ static void *rpmsg_listen_task(void *arg) int rcv_data_from_nrtos(void *rcv_data, int *data_len) { umt_send_msg_t *msg; + static int init = 0; PRT_SemPend(umt_sem, OS_WAIT_FOREVER); if(umt_msg.len) { msg = (umt_send_msg_t *)umt_msg.data; + if (!init) { + g_umt_send_data_addr = msg->phy_addr + OPENAMP_SHM_COPY_SIZE; + init ++; + } memcpy(rcv_data, (void *)msg->phy_addr, msg->data_len); *data_len = msg->data_len; rpmsg_release_rx_buffer(&umt_ept, umt_msg.data); @@ -264,11 +271,14 @@ int rcv_data_from_nrtos(void *rcv_data, int *data_len) int send_data_to_nrtos(void *send_data, int data_len) { int ret; + int rpmsg_data_len; - if (data_len > MAX_STRING_LEN) + if (data_len > OPENAMP_SHM_COPY_SIZE) return OS_ERROR; - ret = rpmsg_send(&umt_ept, send_data, data_len); + memcpy(g_umt_send_data_addr, send_data, data_len); + rpmsg_data_len = data_len; + ret = rpmsg_send(&umt_ept, &rpmsg_data_len, sizeof(int)); if (ret < 0) { PRT_Printf("send_data_to_nrtos failed ret %d data_len %d\n", ret, data_len); return OS_ERROR; diff --git a/testsuites/rhealstone/rcv-data/rcv-data.c b/testsuites/rhealstone/rcv-data/rcv-data.c index 62c24d61..5da12ee2 100644 --- a/testsuites/rhealstone/rcv-data/rcv-data.c +++ b/testsuites/rhealstone/rcv-data/rcv-data.c @@ -11,23 +11,40 @@ TskHandle taskId; U32 status; +void create_random_char(char *buffer) +{ + for (int i = 0; i < STR_SIZE; i++) { + buffer[i] = 'B' + rand() % 26; + } +} void Task01(uintptr_t param1, uintptr_t param2, uintptr_t param3, uintptr_t param4) { char msg[] = "rtos rcv ok"; - char *buffer = NULL; + char *rcv_buffer = NULL , *result_buffer = NULL; int data_len = 0; - int ret; + int ret = 0, i = 0; - buffer = (char*)malloc(STR_SIZE + 1); + srand(time(NULL)); + rcv_buffer = (char*)malloc(STR_SIZE + 1); + if (rcv_buffer == NULL) { + printf("rcv_buffer malloc failed\n"); + } + result_buffer = (char*)malloc(STR_SIZE + 1); + if (result_buffer == NULL) { + printf("result_buffer malloc failed\n"); + } while(1) { - memset(buffer, 0, STR_SIZE + 1); - ret = rcv_data_from_nrtos(buffer, &data_len); + memset(rcv_buffer, 0, STR_SIZE + 1); + memset(result_buffer, 0, STR_SIZE + 1); + ret = rcv_data_from_nrtos(rcv_buffer, &data_len); if (ret != 0) break; - printf("rcv buffer %s data_len %d \n", buffer + STR_SIZE - 10, data_len); - send_data_to_nrtos(msg, sizeof(msg)); + printf("receive buffer last ten charactors %s, total receive buffer len is %d \n", rcv_buffer + STR_SIZE - 10, data_len); + create_random_char(result_buffer); + printf("send buffer last ten charactors %s, total send buffer len is %d \n", result_buffer + STR_SIZE - 10, STR_SIZE); + send_data_to_nrtos(result_buffer, STR_SIZE); } return; @@ -49,4 +66,4 @@ void rcv_test() status = PRT_TaskResume(taskId); directive_failed(status, "PRT_TaskResume of TA01"); -} \ No newline at end of file +} diff --git a/testsuites/rhealstone/rcv-data/rpmsg_backend.h b/testsuites/rhealstone/rcv-data/rpmsg_backend.h index edfe9908..34ab8408 100644 --- a/testsuites/rhealstone/rcv-data/rpmsg_backend.h +++ b/testsuites/rhealstone/rcv-data/rpmsg_backend.h @@ -49,8 +49,8 @@ extern void receive_message(void); /* 下线时,设置rsc_table的reserved[1]为CPU_OFF_FUNCID,告诉mica侧更新状态 */ extern void rsc_table_set_offline_flag(void); -extern int rcv_data_from_rtos(void *rcv_data, int *data_len); -extern int send_data_to_fos(void *send_data, int data_len); +extern int rcv_data_from_nrtos(void *rcv_data, int *data_len); +extern int send_data_to_nrtos(void *send_data, int data_len); #ifdef __cplusplus } -- Gitee