样例代码
/* * Copyright (c) Huawei Technologies Co., Ltd. 2012-2020. All rights reserved. * Description: * Author: huawei * Create: 2020-10-01 */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <pthread.h> #include <sys/types.h> #include <unistd.h> #include "ascend_hal.h" /* **************************************** */ /* 取值范围 [1-96]: */ /* 一个 device 最多支持 96 个 session 通道,*/ /* 创建 client 时,建议传参小于等于 96 */ /* **************************************** */ #define MAX_SESSION_NUM 96 /* ************************************************************** */ /* 0:阻塞死等,如果收发通道阻塞则会等待通道空闲,死等。 */ /* 1:不阻塞,如果收发通道阻塞则不发送数据,立马返回。 */ /* 2:阻塞直到超时,如果收发通道阻塞则会等待通道空闲,直到超时。 */ /* 建议使用“2”,用户可根据实际数据发送情况选择重发或者丢弃。 */ /* ************************************************************** */ #define HDC_WAIT_TIMEOUT 2 /* ************************************************* */ /* 单位 ms;用户根据业务设置合适的收发通道超时时间值 */ /* ************************************************* */ #define HDC_SEND_RECV_WAIT_TIME 100 #define HDC_SEND_RECV_DATA_LEN 256 #define HDC_DST_PATH_LEN 256 #define HDC_CHANGE_FRAME_SIZE_TO_KB 1024 #define HDC_ERROR(fmt, ...) printf("Line: %04d. %s]" fmt "\n", __LINE__, __func__, ## __VA_ARGS__) #define HDC_INFO(fmt, ...) printf("[Line: %04d. %s]" fmt "\n", __LINE__, __func__, ## __VA_ARGS__) void usage() { printf("--------------------------------------------------------------------------------------\n"); printf( "normal channel, usage:\n" "\t./hdc_demo 0 server/client(1/0) dev_id(0~64) server_type(14) size(KB) loop_times \n"); printf( "fast channel, usage:\n" "\t./hdc_demo 1 server/client(1/0) dev_id(0~64) server_type(14) size(KB) loop_times \n"); printf( "send file channel, usage:\n" "\t./hdc_demo 2 dev_id(0~64) file \n"); printf("--------------------------------------------------------------------------------------\n"); printf( "normal channel, examples:\n" "\tserver:./hdc_demo 0 1 0 14 64 10\n" "\tclient:./hdc_demo 0 0 0 14 64 10\n"); printf( "fast channel, examples:\n" "\tserver:./hdc_demo 1 1 0 14 64 10\n" "\tclient:./hdc_demo 1 0 0 14 64 10\n"); printf( "send file channel, examples:\n" "\t./hdc_demo 2 0 /home/examples.txt \n"); printf("--------------------------------------------------------------------------------------\n"); } int normal_channel_client(int devid, int type, int size, int count) { struct drvHdcMsg *pMsg = NULL; HDC_SESSION Session = NULL; HDC_CLIENT client = NULL; char *buffer = NULL; int recv_cnt; int ret; ret = drvHdcClientCreate(&client, MAX_SESSION_NUM, type, 0); if (ret) { HDC_ERROR("drvHdcClientCreate failed, ret = %d", ret); return -1; } buffer = (char *)malloc(size); if (!buffer) { HDC_ERROR("malloc failed, ret = %d", ret); goto OUT; } while (count--) { ret = drvHdcSessionConnect(0, devid, client, &Session); if (ret) { HDC_ERROR("drvHdcSessionConnect failed, ret : %d, count : %d", ret, count); break; } ret = drvHdcSetSessionReference(Session); if (ret) { HDC_ERROR("drvHdcSetSessionReference failed, ret : %d, count : %d", ret, count); break; } ret = drvHdcAllocMsg(Session, &pMsg, 1); if (ret) { HDC_ERROR("drvHdcAllocMsg failed, ret : %d, count : %d", ret, count); break; } ret = halHdcRecv(Session, pMsg, size, 0, &recv_cnt, 0); if (ret) { HDC_ERROR("halHdcRecv failed, ret : %d, count : %d", ret, count); break; } ret = drvHdcReuseMsg(pMsg); if (ret) { HDC_ERROR("drvHdcReuseMsg failed, ret : %d, count : %d", ret, count); break; } ret = drvHdcAddMsgBuffer(pMsg, buffer, size); if (ret) { HDC_ERROR("drvHdcAddMsgBuffer failed, ret : %d, count : %d", ret, count); break; } ret = halHdcSend(Session, pMsg, 0, 0); if (ret) { HDC_ERROR("halHdcSend failed, ret : %d, count : %d", ret, count); break; } ret = drvHdcFreeMsg(pMsg); if (ret) { HDC_ERROR("drvHdcFreeMsg failed, ret : %d, count : %d", ret, count); break; } pMsg = NULL; ret = drvHdcSessionClose(Session); if (ret) { HDC_ERROR("drvHdcSessionClose failed, ret : %d, count : %d", ret, count); break; } Session = NULL; } OUT: if (pMsg != NULL) { drvHdcFreeMsg(pMsg); } if (Session != NULL) { drvHdcSessionClose(Session); } if (buffer != NULL) { free(buffer); } if (client != NULL) { drvHdcClientDestroy(client); } return ret; } int normal_channel_server(int devid, int type, int size, int count) { struct drvHdcMsg *pMsg = NULL; HDC_SESSION Session = NULL; HDC_SERVER server = NULL; char *buffer = NULL; int recv_len; int ret; ret = drvHdcServerCreate(devid, type, &server); if (ret) { HDC_ERROR("drvHdcServerCreate failed, ret = %d", ret); return -1; } buffer = (char *)malloc(size); if (!buffer) { HDC_ERROR("malloc failed, ret = %d", ret); goto OUT; } while (count--) { ret = drvHdcSessionAccept(server, &Session); if (ret) { HDC_ERROR("drvHdcSessionAccept failed, ret : %d, count : %d", ret, count); break; } ret = drvHdcSetSessionReference(Session); if (ret) { HDC_ERROR("drvHdcSetSessionReference failed, ret : %d, count : %d", ret, count); break; } ret = drvHdcAllocMsg(Session, &pMsg, 1); if (ret) { HDC_ERROR("drvHdcAllocMsg failed, ret : %d, count : %d", ret, count); break; } ret = drvHdcAddMsgBuffer(pMsg, buffer, size); if (ret) { HDC_ERROR("drvHdcAddMsgBuffer failed, ret : %d, count : %d", ret, count); break; } ret = halHdcSend(Session, pMsg, 0, 0); if (ret) { HDC_ERROR("halHdcSend failed, ret : %d, count : %d", ret, count); break; } ret = drvHdcReuseMsg(pMsg); if (ret) { HDC_ERROR("drvHdcReuseMsg failed, ret : %d, count : %d", ret, count); break; } ret = halHdcRecv(Session, pMsg, size, 0, &recv_len, 0); if (ret) { if (ret != DRV_ERROR_SOCKET_CLOSE) HDC_ERROR("halHdcRecv failed, ret : %d, count : %d", ret, count); break; } ret = drvHdcFreeMsg(pMsg); if (ret) { HDC_ERROR("drvHdcFreeMsg failed, ret : %d, count : %d", ret, count); break; } pMsg = NULL; ret = drvHdcSessionClose(Session); if (ret) { HDC_ERROR("drvHdcSessionClose failed, ret : %d, count : %d", ret, count); break; } Session = NULL; } OUT: if (pMsg != NULL) { drvHdcFreeMsg(pMsg); } if (Session != NULL) { drvHdcSessionClose(Session); } if (buffer != NULL) { free(buffer); } if (server != NULL) { drvHdcServerDestroy(server); } return ret; } int normal_channel_test(int argc, char *argv[], void (*usage)(void)) { int server_type; int frame_size; int device_id; int loop_cnt; int mode; if (argc < 7) { usage(); return -1; } mode = atoi(argv[2]); /* server or client */ device_id = atoi(argv[3]); server_type = atoi(argv[4]); frame_size = atoi(argv[5]) * HDC_CHANGE_FRAME_SIZE_TO_KB; /* 将用户入参 frame 大小转化为 KB */ loop_cnt = atoi(argv[6]); if (mode) { return normal_channel_server(device_id, server_type, frame_size, loop_cnt); } else { return normal_channel_client(device_id, server_type, frame_size, loop_cnt); } } int fast_channel_client(int devid, int type, int size, int count) { unsigned long hostsendDataBuf; unsigned long hostrecvDataBuf; unsigned long hostsendCtrlBuf; unsigned long hostrecvCtrlBuf; struct drvHdcFastSendMsg smsg; struct drvHdcFastRecvMsg rmsg; struct drvHdcMsg *pMsg = NULL; HDC_SESSION session = NULL; HDC_CLIENT client = NULL; void *sendDataBuf = NULL; void *recvDataBuf = NULL; void *sendCtrlBuf = NULL; void *recvCtrlBuf = NULL; char *sendbuffer = NULL; char *pBuf = NULL; int recvBufCount; int datalen; int ctrllen; int bufLen; int ret; ret = drvHdcClientCreate(&client, MAX_SESSION_NUM, type, 0); if (ret) { HDC_ERROR("drvHdcClientCreate failed, ret = %d", ret); goto _uninit; } ret = drvHdcSessionConnect(0, devid, client, &session); if (ret) { HDC_ERROR("drvHdcSessionConnect failed, ret : %d\n", ret); goto _destroy; } ret = drvHdcSetSessionReference(session); if (ret) { HDC_ERROR("drvHdcSetSessionReference failed, ret : %d\n", ret); goto _close; } ret = drvHdcAllocMsg(session, &pMsg, 1); if (ret) { HDC_ERROR("drvHdcSessionAccept failed, ret : %d\n", ret); goto _close; } sendbuffer = malloc(HDC_SEND_RECV_DATA_LEN); if (sendbuffer == NULL) { HDC_ERROR("malloc fail.\n"); goto _free; } datalen = size; ctrllen = HDC_CHANGE_FRAME_SIZE_TO_KB; /* */ /* 快速通道申请 buffer准备 */ sendDataBuf = drvHdcMallocEx(HDC_MEM_TYPE_TX_DATA, NULL, 0, datalen, devid, 0); recvDataBuf = drvHdcMallocEx(HDC_MEM_TYPE_RX_DATA, NULL, 0, datalen, devid, 0); sendCtrlBuf = drvHdcMallocEx(HDC_MEM_TYPE_TX_CTRL, NULL, 0, ctrllen, devid, 0); recvCtrlBuf = drvHdcMallocEx(HDC_MEM_TYPE_RX_CTRL, NULL, 0, ctrllen, devid, 0); if (!sendDataBuf || !recvDataBuf || !sendCtrlBuf || !recvCtrlBuf) { HDC_ERROR("drvHdcMallocEx failed, %p,%p,%p,%p\n", sendDataBuf, recvDataBuf, sendCtrlBuf, recvCtrlBuf); goto _free; } HDC_INFO("native fast channel info : datalen %d, ctrllen %d, %p,%p,%p,%p", datalen, ctrllen, sendDataBuf, recvDataBuf, sendCtrlBuf, recvCtrlBuf); *(((unsigned long *)sendbuffer) + 0) = (unsigned long)sendDataBuf; *(((unsigned long *)sendbuffer) + 1) = (unsigned long)recvDataBuf; *(((unsigned long *)sendbuffer) + 2) = (unsigned long)sendCtrlBuf; *(((unsigned long *)sendbuffer) + 3) = (unsigned long)recvCtrlBuf; *(((unsigned long *)sendbuffer) + 4) = datalen; *(((unsigned long *)sendbuffer) + 5) = ctrllen; ret = drvHdcAddMsgBuffer(pMsg, sendbuffer, HDC_SEND_RECV_DATA_LEN); if (ret) { HDC_ERROR("drvHdcAddMsgBuffer failed, ret : %d\n", ret); goto _free; } /* 发送本端 快速通道的 buffer信息给到对端 */ ret = halHdcSend(session, pMsg, 0, 0); if (ret) { HDC_ERROR("halHdcSend failed, ret : %d\n", ret); goto _free; } ret = drvHdcReuseMsg(pMsg); if (ret) { HDC_ERROR("drvHdcReuseMsg failed, ret : %d\n", ret); goto _free; } ret = halHdcRecv(session, pMsg, HDC_SEND_RECV_DATA_LEN, 0, &recvBufCount, 0); if (ret) { HDC_ERROR("halHdcRecv failed, ret : %d\n", ret); goto _free; } ret = drvHdcGetMsgBuffer(pMsg, 0, &pBuf, &bufLen); if (ret) { HDC_ERROR("drvHdcGetMsgBuffer failed, ret : %d\n", ret); goto _free; } /* 获取对端快速通道信息 */ hostsendDataBuf = *(((unsigned long *)pBuf) + 0); hostrecvDataBuf = *(((unsigned long *)pBuf) + 1); hostsendCtrlBuf = *(((unsigned long *)pBuf) + 2); hostrecvCtrlBuf = *(((unsigned long *)pBuf) + 3); datalen = (int)(*(((unsigned long *)pBuf) + 4)); ctrllen = (int)(*(((unsigned long *)pBuf) + 5)); HDC_INFO("remote fast channel info : datalen %d, ctrllen %d, %lx,%lx,%lx,%lx", datalen, ctrllen, hostsendDataBuf, hostrecvDataBuf, hostsendCtrlBuf, hostrecvCtrlBuf); drvHdcFreeMsg(pMsg); pMsg = NULL; free(sendbuffer); sendbuffer = NULL; while (count--) { smsg.srcDataAddr = (unsigned long long)sendDataBuf; smsg.dstDataAddr = hostrecvDataBuf; /* 对端的接收buffer */ smsg.srcCtrlAddr = (unsigned long long)sendCtrlBuf; smsg.dstCtrlAddr = hostrecvCtrlBuf; /* 对端的接收buffer */ smsg.dataLen = datalen; smsg.ctrlLen = ctrllen; /* 用户可根据实际数据发送情况选择重发或者丢弃;参数使用参考具体接口描述 */ ret = halHdcFastSend(session, smsg, HDC_WAIT_TIMEOUT, HDC_SEND_RECV_WAIT_TIME); if (ret) { HDC_ERROR("halHdcFastSend failed, ret : %d\n", ret); break; } ret = halHdcFastRecv(session, &rmsg, 0, 0); if (ret) { HDC_ERROR("halHdcFastRecv failed, ret : %d\n", ret); break; } } HDC_INFO("fast channel time delay client finish"); _free: if (sendbuffer) { free(sendbuffer); } if (sendDataBuf) { drvHdcFreeEx(HDC_MEM_TYPE_TX_DATA, sendDataBuf); } if (recvDataBuf) { drvHdcFreeEx(HDC_MEM_TYPE_RX_DATA, recvDataBuf); } if (sendCtrlBuf) { drvHdcFreeEx(HDC_MEM_TYPE_TX_CTRL, sendCtrlBuf); } if (recvCtrlBuf) { drvHdcFreeEx(HDC_MEM_TYPE_RX_CTRL, recvCtrlBuf); } if (pMsg) { drvHdcFreeMsg(pMsg); } sendbuffer = NULL; sendDataBuf = NULL; recvDataBuf = NULL; sendCtrlBuf = NULL; recvCtrlBuf = NULL; pMsg = NULL; _close: drvHdcSessionClose(session); _destroy: drvHdcClientDestroy(client); _uninit: return ret; } int fast_channel_server(int devid, int type, int size, int count) { unsigned long hostsendDataBuf; unsigned long hostrecvDataBuf; unsigned long hostsendCtrlBuf; unsigned long hostrecvCtrlBuf; struct drvHdcFastSendMsg smsg; struct drvHdcFastRecvMsg rmsg; struct drvHdcMsg *pMsg = NULL; HDC_SESSION session = NULL; HDC_SERVER server = NULL; void *sendDataBuf = NULL; void *recvDataBuf = NULL; void *sendCtrlBuf = NULL; void *recvCtrlBuf = NULL; char *sendbuffer = NULL; char *pBuf = NULL; int recvBufCount; int datalen; int ctrllen; int bufLen; int ret; ret = drvHdcServerCreate(devid, type, &server); if (ret) { HDC_ERROR("drvHdcServerCreate failed, ret = %d\n", ret); goto _uninit; } ret = drvHdcSessionAccept(server, &session); if (ret) { HDC_ERROR("drvHdcSessionAccept failed, ret : %d\n", ret); goto _destroy; } ret = drvHdcSetSessionReference(session); if (ret) { HDC_ERROR("drvHdcSetSessionReference failed, ret : %d\n", ret); goto _close; } ret = drvHdcAllocMsg(session, &pMsg, 1); if (ret) { HDC_ERROR("drvHdcSessionAccept failed, ret : %d\n", ret); goto _close; } ret = halHdcRecv(session, pMsg, HDC_SEND_RECV_DATA_LEN, 0, &recvBufCount, 0); if (ret) { HDC_ERROR("halHdcRecv failed, ret : %d\n", ret); goto _free; } ret = drvHdcGetMsgBuffer(pMsg, 0, &pBuf, &bufLen); if (ret) { HDC_ERROR("drvHdcGetMsgBuffer failed, ret : %d\n", ret); goto _free; } /* 获取对端快速通道信息 */ hostsendDataBuf = *(((unsigned long *)pBuf) + 0); hostrecvDataBuf = *(((unsigned long *)pBuf) + 1); hostsendCtrlBuf = *(((unsigned long *)pBuf) + 2); hostrecvCtrlBuf = *(((unsigned long *)pBuf) + 3); datalen = (int)(*(((unsigned long *)pBuf) + 4)); ctrllen = (int)(*(((unsigned long *)pBuf) + 5)); HDC_INFO("remote fast channel info : datalen %d, ctrllen %d, %lx,%lx,%lx,%lx", datalen, ctrllen, hostsendDataBuf, hostrecvDataBuf, hostsendCtrlBuf, hostrecvCtrlBuf); /* 快速通道申请 buffer准备 */ sendDataBuf = drvHdcMallocEx(HDC_MEM_TYPE_TX_DATA, NULL, 0, datalen, devid, 0); recvDataBuf = drvHdcMallocEx(HDC_MEM_TYPE_RX_DATA, NULL, 0, datalen, devid, 0); sendCtrlBuf = drvHdcMallocEx(HDC_MEM_TYPE_TX_CTRL, NULL, 0, ctrllen, devid, 0); recvCtrlBuf = drvHdcMallocEx(HDC_MEM_TYPE_RX_CTRL, NULL, 0, ctrllen, devid, 0); if (!sendDataBuf || !recvDataBuf || !sendCtrlBuf || !recvCtrlBuf) { HDC_ERROR("drvHdcMallocEx failed, %p,%p,%p,%p\n", sendDataBuf, recvDataBuf, sendCtrlBuf, recvCtrlBuf); goto _free; } sendbuffer = malloc(HDC_SEND_RECV_DATA_LEN); if (!sendbuffer) { HDC_ERROR("malloc fail.\n"); goto _free; } *(((unsigned long *)sendbuffer) + 0) = (unsigned long)sendDataBuf; *(((unsigned long *)sendbuffer) + 1) = (unsigned long)recvDataBuf; *(((unsigned long *)sendbuffer) + 2) = (unsigned long)sendCtrlBuf; *(((unsigned long *)sendbuffer) + 3) = (unsigned long)recvCtrlBuf; *(((unsigned long *)sendbuffer) + 4) = datalen; *(((unsigned long *)sendbuffer) + 5) = ctrllen; HDC_INFO("native fast channel info : datalen %d, ctrllen %d, %p,%p,%p,%p", datalen, ctrllen, sendDataBuf, recvDataBuf, sendCtrlBuf, recvCtrlBuf); ret = drvHdcReuseMsg(pMsg); if (ret) { HDC_ERROR("drvHdcReuseMsg failed, ret : %d\n", ret); goto _free; } ret = drvHdcAddMsgBuffer(pMsg, sendbuffer, HDC_SEND_RECV_DATA_LEN); if (ret) { HDC_ERROR("drvHdcAddMsgBuffer failed, ret : %d\n", ret); goto _free; } /* 发送本端的 快速通道的 buffer信息给到对端 */ ret = halHdcSend(session, pMsg, 0, 0); if (ret) { HDC_ERROR("halHdcSend failed, ret : %d\n", ret); goto _free; } drvHdcFreeMsg(pMsg); pMsg = NULL; free(sendbuffer); sendbuffer = NULL; while (count--) { ret = halHdcFastRecv(session, &rmsg, 0, 0); if (ret) { HDC_ERROR("halHdcFastRecv failed, ret : %d\n", ret); break; } smsg.srcDataAddr = (unsigned long long)sendDataBuf; smsg.dstDataAddr = hostrecvDataBuf; /* 对端的接收buffer */ smsg.srcCtrlAddr = (unsigned long long)sendCtrlBuf; smsg.dstCtrlAddr = hostrecvCtrlBuf; /* 对端的接收buffer */ smsg.dataLen = datalen; smsg.ctrlLen = ctrllen; /* 用户可根据实际数据发送情况选择重发或者丢弃;参数使用参考具体接口描述 */ ret = halHdcFastSend(session, smsg, HDC_WAIT_TIMEOUT, HDC_SEND_RECV_WAIT_TIME); if (ret) { HDC_ERROR("halHdcFastSend failed, ret : %d\n", ret); break; } } HDC_INFO("fast channel time delay server finish"); _free: if (sendbuffer) { free(sendbuffer); } if (sendDataBuf) { drvHdcFreeEx(HDC_MEM_TYPE_TX_DATA, sendDataBuf); } if (recvDataBuf) { drvHdcFreeEx(HDC_MEM_TYPE_RX_DATA, recvDataBuf); } if (sendCtrlBuf) { drvHdcFreeEx(HDC_MEM_TYPE_TX_CTRL, sendCtrlBuf); } if (recvCtrlBuf) { drvHdcFreeEx(HDC_MEM_TYPE_RX_CTRL, recvCtrlBuf); } if (pMsg) { drvHdcFreeMsg(pMsg); } sendbuffer = NULL; sendDataBuf = NULL; recvDataBuf = NULL; sendCtrlBuf = NULL; recvCtrlBuf = NULL; pMsg = NULL; _close: drvHdcSessionClose(session); _destroy: drvHdcServerDestroy(server); _uninit: return ret; } int fast_channel_test(int argc, char *argv[], void (*usage)(void)) { int server_type; int frame_size; int device_id; int loop_cnt; int mode; if (argc < 7) { usage(); return -1; } mode = atoi(argv[2]); /* server or client */ device_id = atoi(argv[3]); server_type = atoi(argv[4]); frame_size = atoi(argv[5]) * HDC_CHANGE_FRAME_SIZE_TO_KB; /* 将用户入参 frame 大小转化为 KB */ loop_cnt = atoi(argv[6]); if (mode) { return fast_channel_server(device_id, server_type, frame_size, loop_cnt); } else { return fast_channel_client(device_id, server_type, frame_size, loop_cnt); } } int hdc_send_file_to_device(int argc, char *argv[], void (*usage)(void)) { char dst_path[HDC_DST_PATH_LEN] = {0}; char *file = NULL; int devid; int ret; if (argc < 4) { usage(); return -1; } devid = atoi(argv[2]); file = argv[3]; ret = drvHdcGetTrustedBasePath(0, devid, dst_path, HDC_DST_PATH_LEN); if (ret) { HDC_ERROR("drvHdcGetTrustedBasePath failed, ret : %d\n", ret); return -1; } ret = drvHdcSendFile(0, devid, file, dst_path, NULL); if (ret) { HDC_ERROR("drvHdcSendFile failed, ret : %d\n", ret); return -1; } HDC_INFO("send file success, dst path : %s", dst_path); return 0; } int main(int argc, char *argv[]) { int op_type; int ret = -1; if (argc < 2) { usage(); return -1; } op_type = atoi(argv[1]); switch (op_type) { case 0: ret = normal_channel_test(argc, argv, usage); break; case 1: ret = fast_channel_test(argc, argv, usage); break; case 2: ret = hdc_send_file_to_device(argc, argv, usage); break; default: usage(); break; } HDC_INFO("Test finish. ret = %d", ret); return ret; }

参见样例编译编译成可执行文件后(例如可执行文件的名字为hdc_demo),你可以通过./hdc_demo -h命令查看输入参数的详细含义,其中:
- “server/client(1/0)”:当前执行此程序的机器为服务端的话,则配置为“1”,客户端,则为“0”。
- “server_type”的详细含义请参见drvHdcServiceType。
- “size”:指传送的数据的大小,单位KB。
- “loop_times”:指收发超时次数。
父主题: HDC样例