I2C_ADDRS(addr, addrs...)理解

IIC驱动中的宏定义:

/* Internal numbers to terminate lists */
#define I2C_CLIENT_END 0xfffeU


/* Construct an I2C_CLIENT_END-terminated array of i2c addresses */
#define I2C_ADDRS(addr, addrs...) \

((const unsigned short []){ addr, ## addrs, I2C_CLIENT_END })


没看懂,所以写了点测试代码用于学习理解:

#include <iostream>


using namespace std;


#define I2C_CLIENT_END 1234


/* Construct an I2C_CLIENT_END-terminated array of i2c addresses */
#define I2C_ADDRS(addr, addrs...) \
((const unsigned short []){ addr, ## addrs, I2C_CLIENT_END })








/* run this program using the console pauser or add your own getch, system("pause") or input loop */


int main(int argc, char** argv) 
{
const unsigned short *testArray = I2C_ADDRS(111, 222,333,55,88);

cout<<testArray[0]<<endl;
cout<<testArray[1]<<endl;
cout<<testArray[2]<<endl;
cout<<testArray[3]<<endl;
cout<<testArray[4]<<endl;
cout<<testArray[5]<<endl;


const unsigned short *testArray1 = ((const unsigned short []){111, 222,333,55,88, 1234});
cout<<testArray1[0]<<endl;
cout<<testArray1[1]<<endl;
cout<<testArray1[2]<<endl;
cout<<testArray1[3]<<endl;
cout<<testArray1[4]<<endl;
cout<<testArray1[5]<<endl;


return 0;
}




/*
输出结果为:
111
222
333
55
88
1234 
111
222
333
55
88
1234 
*/

``` #define Drv89x_OCP_STAT_1_ADDR 0x01u #define Drv89x_OCP_STAT_2_ADDR 0x02u #define Drv89x_OCP_STAT_3_ADDR 0x03u #define Drv89x_OLD_STAT_1_ADDR 0x04u #define Drv89x_OLD_STAT_2_ADDR 0x05u #define Drv89x_OLD_STAT_3_ADDR 0x06u uint8 VaDrv89x_u_RxBuffOCP11[2]; static void Drv89x_Read_DiagRegister(void) { static l_read_chip_id = Drv89x_CHIP1; switch(l_read_chip_id) { case Drv89x_CHIP1: if(VeDrv89x_u_GLOABL_FAULT[l_read_chip_id].Drv89xFault_Global_OLD != DRV8912_DIAG_NOERROR) { VaDrv89x_u_TxBuff[0] = REG_READ_Drv89x|Drv89x_OLD_STAT_1_ADDR; VaDrv89x_u_TxBuff[1] = 0u; Drv89x_SpiTransmit(VaDrv89x_u_TxBuff,VaDrv89x_u_RxBuffOLD11,l_read_chip_id); VaDrv89x_u_TxBuff[0] = REG_READ_Drv89x|Drv89x_OLD_STAT_2_ADDR; VaDrv89x_u_TxBuff[1] = 0u; Drv89x_SpiTransmit(VaDrv89x_u_TxBuff,VaDrv89x_u_RxBuffOLD12,l_read_chip_id); VaDrv89x_u_TxBuff[0] = REG_READ_Drv89x|Drv89x_OLD_STAT_3_ADDR; VaDrv89x_u_TxBuff[1] = 0u; Drv89x_SpiTransmit(VaDrv89x_u_TxBuff,VaDrv89x_u_RxBuffOLD13,l_read_chip_id); } if(VeDrv89x_u_GLOABL_FAULT[l_read_chip_id].Drv89xFault_Global_OCP != DRV8912_DIAG_NOERROR) { VaDrv89x_u_TxBuff[0] = REG_READ_Drv89x|Drv89x_OCP_STAT_1_ADDR; VaDrv89x_u_TxBuff[1] = 0u; Drv89x_SpiTransmit(VaDrv89x_u_TxBuff,VaDrv89x_u_RxBuffOCP11,l_read_chip_id); VaDrv89x_u_TxBuff[0] = REG_READ_Drv89x|Drv89x_OCP_STAT_2_ADDR; VaDrv89x_u_TxBuff[1] = 0u; Drv89x_SpiTransmit(VaDrv89x_u_TxBuff,VaDrv89x_u_RxBuffOCP12,l_read_chip_id); VaDrv89x_u_TxBuff[0] = REG_READ_Drv89x|Drv89x_OCP_STAT_3_ADDR; VaDrv89x_u_TxBuff[1] = 0u; Drv89x_SpiTransmit(VaDrv89x_u_TxBuff,VaDrv89x_u_RxBuffOCP13,l_read_chip_id); } break; case Drv89x_CHIP2: if(VeDrv89x_u_GLOABL_FAULT[l_read_chip_id].Drv89xFault_Global_OLD != DRV8912_DIAG_NOERROR) { VaDrv89x_u_TxBuff[0] = REG_READ_Drv89x|Drv89x_OLD_STAT_1_ADDR; VaDrv89x_u_TxBuff[1] = 0u; Drv89x_SpiTransmit(VaDrv89x_u_TxBuff,VaDrv89x_u_RxBuffOLD21,l_read_chip_id); VaDrv89x_u_TxBuff[0] = REG_READ_Drv89x|Drv89x_OLD_STAT_2_ADDR; VaDrv89x_u_TxBuff[1] = 0u; Drv89x_SpiTransmit(VaDrv89x_u_TxBuff,VaDrv89x_u_RxBuffOLD22,l_read_chip_id); VaDrv89x_u_TxBuff[0] = REG_READ_Drv89x|Drv89x_OLD_STAT_3_ADDR; VaDrv89x_u_TxBuff[1] = 0u; Drv89x_SpiTransmit(VaDrv89x_u_TxBuff,VaDrv89x_u_RxBuffOLD23,l_read_chip_id); } if(VeDrv89x_u_GLOABL_FAULT[l_read_chip_id].Drv89xFault_Global_OCP != DRV8912_DIAG_NOERROR) { VaDrv89x_u_TxBuff[0] = REG_READ_Drv89x|Drv89x_OCP_STAT_1_ADDR; VaDrv89x_u_TxBuff[1] = 0u; Drv89x_SpiTransmit(VaDrv89x_u_TxBuff,VaDrv89x_u_RxBuffOCP21,l_read_chip_id); VaDrv89x_u_TxBuff[0] = REG_READ_Drv89x|Drv89x_OCP_STAT_2_ADDR; VaDrv89x_u_TxBuff[1] = 0u; Drv89x_SpiTransmit(VaDrv89x_u_TxBuff,VaDrv89x_u_RxBuffOCP22,l_read_chip_id); VaDrv89x_u_TxBuff[0] = REG_READ_Drv89x|Drv89x_OCP_STAT_3_ADDR; VaDrv89x_u_TxBuff[1] = 0u; Drv89x_SpiTransmit(VaDrv89x_u_TxBuff,VaDrv89x_u_RxBuffOCP23,l_read_chip_id); } break; default: break; } }```该函数的功能是分两个周期去读取两个芯片的各6个寄存器,VaDrv89x_u_RxBuffOCP11这种缓冲区都是uint8的含有两个元素的数组,请问能怎么优化该函数?
03-22
我的程序如下请你看有什么问题 #!/usr/bin/env python # -*- coding: UTF-8 -*- # Copyright (C), 2025, TP-Link Technologies Co., Ltd. # # File Name: XXX__test.py # Author : gongxing # History : # time : 2025-07-14, gongxing, create ''' TestCase:测试用例基类,提供测试生命周期管理 CaseInfo:存储测试用例元数据(名称、ID、作者等) ResultInfo:测试结果记录容器 sat_conf:测试床配置管理模块 logging:Python标准日志模块 ''' from pysat.sat_test import TestCase, CaseInfo from pysat.sat_result import ResultInfo from pysat import sat_conf import logging import pyshark import time logger = logging.getLogger(__name__) '''初始化测试床配置对象_gcfg''' _gcfg = sat_conf.TestbedConfig() def get_config(name): '''get the testbed config info, return the value''' return _gcfg.get(name.lower()) # return _gcfg.get('testbed.cd_bvt_smbrouter.' + name.lower()) tcp = 0 udp = 0 icmp = 0 total = 0 def capture_and_analyze(interface="eth0", duration=30): """使用PyShark抓包并统计协议数量""" global tcp global udp global icmp global total try: # 创建实时抓包实例 capture = pyshark.LiveCapture( interface=interface, display_filter='tcp or udp or icmp', # 只捕获目标协议 use_json=True # 使用JSON解析提高性能 ) print(f"开始抓包,持续 {duration} 秒...") start_time = time.time() # 开始异步抓包 capture.sniff(timeout=duration) # 处理捕获的数据包 for packet in capture: total += 1 # 检查协议层存在性 if 'TCP' in packet: tcp += 1 elif 'UDP' in packet: udp += 1 elif 'ICMP' in packet: icmp += 1 except Exception as e: print(f"抓包错误: {e}") return 0, {} ''' 继承TestCase基类实现自定义测试类Test 初始化CaseInfo对象设置测试元数据: name:测试名称 id:唯一测试标识符 runtime:预估执行时间 add_task()注册测试用例到框架 ''' class Test(TestCase): def __init__(self): TestCase.__init__(self) self.logger = logging.getLogger(self.__class__.__name__) self.case_info = CaseInfo() self.case_info.name = 't5' self.case_info.id = '5' self.case_info.version = '202508181646' self.case_info.author = 'gongxing@tp-link.com.hk' self.case_info.runtime = '1min' self.case_info.testbeds = self.get_testbed_list() self.case_info.description = ''' ''' def add_task(self): self.register_case(self.t5, self.case_info) def t5(self): try: result = ResultInfo() capture_and_analyze() self.logger.info(f"共抓到{total}个包") result.add_result(passfail=ResultInfo.PASS, actual_result=tcp, expected_result='30s内抓到的报文数量', test_comment='30s内抓到的报文数量', item_id='step1') self.logger.info(f"TCP数量为:{tcp}") result.add_result(passfail=ResultInfo.PASS, actual_result=tcp, expected_result='30s内抓到的TCP报文数量', test_comment='30s内抓到的TCP报文数量', item_id='step1') self.logger.info(f"UDP数量为:{udp}") result.add_result(passfail=ResultInfo.PASS, actual_result=udp, expected_result='30s内抓到的UDP报文数量', test_comment='30s内抓到的UDP报文数量', item_id='step1') self.logger.info(f"ICMP数量为:{icmp}") result.add_result(passfail=ResultInfo.PASS, actual_result=icmp, expected_result='30s内抓到的ICMP报文数量', test_comment='30s内抓到的ICMP报文数量', item_id='step1') except Exception as e: result = ResultInfo() result.add_result(passfail=ResultInfo.FAIL, test_comment='Test fail: %s' % e) self.break_test('Test fail: %s' % e) def clean_test(self): try: self.logger.info('[clean_test] start to clean test...') except Exception as e: self.logger.error('[clean_test] clean test failed: %s' % e) raise e
最新发布
08-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值