diff --git a/test/case46/src/testcase46.c b/test/case46/src/testcase46.c index bd891d6..3d8e52f 100644 --- a/test/case46/src/testcase46.c +++ b/test/case46/src/testcase46.c @@ -4,14 +4,13 @@ // ----------------------------------------------------------------- // Filename : test.c // Author : xianfeng.du -// Created On : 2022-11-25 +// Created On : 2024-12-14 // Last Modified : // ----------------------------------------------------------------- // Description: -// -// -// -FHDR------------------------------------------------------------ - +// (Aut@qieYuan_2025.05.04) 新增数据接收与发送 收发聚合无多线程 +// ----------------------------------------------------------------- +#define _GNU_SOURCE #include #include #include @@ -35,12 +34,255 @@ #include "ospSwTimer.h" #include "stc_drv_api.h" -uint32_t slot_ind_flag = 0; +//---------------------------------------------------- +// Last modified time: 2025.05.03 +// Last Version: V1.0 +//---------------------------------------------------- + +#include // udp +#include // 绑定CPU +#include // thread +#include // POSIX api +#include // open() +#include // MMAP +#include +//---------------------------------------------------- + + +#define SERVER_IP_CASE52 "172.29.118.76" // IP +#define SERVER_PORT_CASE52 28864 // 端口 +#define BUFFER_SIZE_CASE52 16016 // 用户缓冲区 +int sockfd_case52; // 句柄 +struct sockaddr_in server_addr_case52; // 套接字 + +#define MAP_SIZE_CASE52 1028096 // +#define MAP_SIZE_ST_CASE52 4096 // 4096 +#define CTRL_BUFFER_SIZE 1024 +#define UCP4008_CTRL_PHYSADDR 0x82000000 // 接收开关 +#define MAP_ADDR_RX_BASE_CASE52 0x85001000 // RX 数据位起始 +#define MAP_ADDR_RXFLAG_DATA_CASE52 0x85000000 // wr 计数起始位 + +int mem_fd_case52; // 统一文件描述符 +ssize_t send_len; +void *ucp4008_ctrl_mmap_base; // 接受开关映射地址 +void *map_base_rx_case52; // RX映射地址 8块 +void *map_base_rxf_case52; // wr 计数映射地址 +uint8_t w_idx, r_idx; // RX 信号 +uint16_t udp_data_buffer[8008]; +volatile uint32_t *mapped_addr; +//---------------------------------------------------- + +volatile uint32_t slot_ind_flag = 0; uint32_t slot_ind_time_flag = 0; -uint32_t g_slot_time = 0; +uint32_t g_slot_time = 0; uint32_t gu32_value = 0; uint32_t gu32_tick_receive_ctrl = 0; uint32_t gu32_tick_from_tx_ctrl = 0; +uint8_t ucp_print_err_f = 0; + + +void *handleUdpTransmission(void *arg) +{ + (void)arg; + printf("[socket]:/************ linux_UDP ***************/\n"); + if ((sockfd_case52 = socket(AF_INET, SOCK_DGRAM, 0)) < 0) + { + printf("[socket]:socket error!\n"); + perror("socket creation failed\n"); + exit(EXIT_FAILURE); + } + server_addr_case52.sin_family = AF_INET; // IPv4 + server_addr_case52.sin_port = htons(SERVER_PORT_CASE52); // 端口转换 + server_addr_case52.sin_addr.s_addr = inet_addr(SERVER_IP_CASE52); // IP转换 + // int flags = fcntl(sockfd_case52, F_GETFL, 0); + // fcntl(sockfd_case52, F_SETFL, flags | O_NONBLOCK); + printf("[socket]:UDP ready\n"); + + // mmap + printf("[socket]: Opening /dev/mem for all mappings\n"); + mem_fd_case52 = open("/dev/mem", O_RDWR | O_SYNC); + if (mem_fd_case52 == -1) { + printf("[mmap]: Failed to open /dev/mem !!!!\n"); + perror("open /dev/mem"); + exit(EXIT_FAILURE); + } + + // RX + printf("[mmap]:/*************** mmap_rx ***************/\n"); + map_base_rx_case52 = mmap(NULL, MAP_SIZE_CASE52, PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd_case52, MAP_ADDR_RX_BASE_CASE52); + if (map_base_rx_case52 == MAP_FAILED) { + printf("[mmap]: rx mapping failed!\n"); + perror("mmap rx error"); + // munmap(map_base_tx_case52, MAP_SIZE_CASE52); // clean TX + close(mem_fd_case52); + exit(EXIT_FAILURE); + } + printf("[mmap]: rx ready\n"); + + // RX_FLAG + printf("[mmap]:/************** rx_flag ***************/\n"); + map_base_rxf_case52 = mmap(NULL, MAP_SIZE_ST_CASE52, PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd_case52, MAP_ADDR_RXFLAG_DATA_CASE52); + if (map_base_rxf_case52 == MAP_FAILED) { + printf("[mmap]: RX_FLAG mapping failed!\n"); + perror("mmap RX_FLAG error"); + // munmap(map_base_tx_case52, MAP_SIZE_CASE52); // clean TX + munmap(map_base_rx_case52, MAP_SIZE_CASE52); // clean RX + close(mem_fd_case52); + exit(EXIT_FAILURE); + } + printf("[mmap]: wr_idx ready\n"); + + // ucp4008_ctrl_mmap_base + ucp4008_ctrl_mmap_base = mmap( + NULL, + MAP_SIZE_ST_CASE52, + PROT_READ | PROT_WRITE, + MAP_SHARED, + mem_fd_case52, + UCP4008_CTRL_PHYSADDR + ); + if (ucp4008_ctrl_mmap_base == MAP_FAILED) { + printf("[mmap]: ucp4008_ctrl mapping failed!\n"); + perror("ucp4008_ctrl error"); + close(mem_fd_case52); + exit(EXIT_FAILURE); + } + + // udp_ctrl + char *ctrl_message = "ready"; + sendto(sockfd_case52, ctrl_message, strlen(ctrl_message), 0, + (struct sockaddr *)&server_addr_case52, sizeof(server_addr_case52)); + printf("[sendto]:%s\n", ctrl_message); + + char ctrl_buffer[CTRL_BUFFER_SIZE]; + struct sockaddr_in from_addr; + socklen_t from_addr_len = sizeof(from_addr); + int recv_len; + int strcmp_flag = 1; + + while (strcmp_flag) + { + recv_len = recvfrom(sockfd_case52, ctrl_buffer, CTRL_BUFFER_SIZE, 0, + (struct sockaddr *)&from_addr, &from_addr_len); + if (recv_len < 0) { + printf("[recv_len]:recv_len < 0\n"); + } + + ctrl_buffer[recv_len] = '\0'; + printf("[recvfrom]:%s\n", ctrl_buffer); + if (strcmp(ctrl_buffer, "ok") == 0) { + //usleep(1000000); + printf("[mmap]:wr...\n"); + mapped_addr = (volatile uint32_t *)ucp4008_ctrl_mmap_base; + *mapped_addr = 0xA5A55A5A; + printf("[mmap]: wr 0xA5A55A5A done :) \n"); + strcmp_flag = 0; + } else { + printf("[recvfrom]:strcmp no ok!\n"); + } + } + + // 初始化消费者索引 + r_idx = 0; + printf("[store]: r_idx ready == 0\n"); + // while + uint8_t block_n = 0; + uint8_t cut_i = 0; + while (1) + { + if (1 == slot_ind_flag) + { + slot_ind_flag = 0; + // 更新生产者计数 + // w_idx = *((volatile uint8_t *)map_base_rxf_case52); + w_idx = __atomic_load_n( + (volatile uint8_t *)(map_base_rxf_case52 + 0), + __ATOMIC_ACQUIRE + ); + // 尝试读取 + block_n = 0; + if (w_idx == r_idx){ + printf("[while(p)]: w_idx = %hhu, r_idx = %hhu\n", w_idx, r_idx); + printf("[while(p)]: pass\n"); + } else { + if (r_idx < w_idx) { + printf("[while(r)]: w_idx = %hhu, r_idx = %hhu\n", w_idx, r_idx); + printf("[while(r)]: r_idx < w_idx\n"); + block_n = w_idx - r_idx; + for (cut_i = 0; cut_i < block_n; cut_i++) + { + memcpy(udp_data_buffer, + (char*)map_base_rx_case52 + r_idx * 16016, + 16016); + // 发送数据到上位机 + send_len = sendto( + sockfd_case52, + udp_data_buffer, + sizeof(udp_data_buffer), + 0, + (struct sockaddr*)&server_addr_case52, + sizeof(server_addr_case52) + ); + if (send_len == -1) { + perror("sendto error"); + continue; + } + r_idx ++ ; + } + // 更新r_idx,如果到头 + r_idx = r_idx % 8; + } else { //r_idx > w_idx + printf("[while(w)]: w_idx = %hhu, r_idx = %hhu\n", w_idx, r_idx); + printf("[while(w)]: w_idx < r_idx\n"); + // 取完末尾 + for (cut_i = 0; cut_i < (8-r_idx); cut_i++) + { + memcpy(udp_data_buffer, + (char*)map_base_rx_case52 + (r_idx+cut_i) * 16016, + 16016); + // 发送数据到上位机 + send_len = sendto( + sockfd_case52, + udp_data_buffer, + sizeof(udp_data_buffer), + 0, + (struct sockaddr*)&server_addr_case52, + sizeof(server_addr_case52) + ); + if (send_len == -1) { + perror("sendto error"); + continue; + } + } + r_idx = 0; + // 取从头开始 + for (cut_i = 0; cut_i < w_idx; cut_i++) + { + memcpy(udp_data_buffer, + (char*)map_base_rx_case52 + cut_i * 16016, + 16016); + // 发送数据到上位机 + send_len = sendto( + sockfd_case52, + udp_data_buffer, + sizeof(udp_data_buffer), + 0, + (struct sockaddr*)&server_addr_case52, + sizeof(server_addr_case52) + ); + if (send_len == -1) { + perror("sendto error"); + continue; + } + r_idx ++; + } + r_idx = r_idx % 8; + } + } + } + } + return NULL; +} uint32_t rx_callback_data(const char* buf,uint32_t payloadSize) { @@ -51,6 +293,7 @@ uint32_t rx_callback_data(const char* buf,uint32_t payloadSize) uint32_t tick_from_tx_ctrl = *(uint32_t *)(buf+4); + // printf("[rx_callback_data]:slot_ind_flag == 1 \n"); slot_ind_flag = 1; gu32_value = value; gu32_tick_receive_ctrl = stc_cnt; @@ -70,9 +313,10 @@ uint32_t rx_callback_data(const char* buf,uint32_t payloadSize) if ((diff > 520000) || (diff < 480000)) { - UCP_PRINT_ERROR("qNO[%d],sfn[%d],slot[%d],diff[%d]",UCP4008_TRAFFIC_NR_eMBB_DATA,sfn,slot,diff); + if(ucp_print_err_f == 1){ + UCP_PRINT_ERROR("qNO[%d],sfn[%d],slot[%d],diff[%d]",UCP4008_TRAFFIC_NR_eMBB_DATA,sfn,slot,diff); + } } - return payloadSize; } @@ -143,7 +387,9 @@ static inline void msg_transfer_cfg(void) int32_t handle_id = 0; transfer_type_info_s transfer_type_info; - for (inst_id=0; inst_id