调用CSR_RD宏时触发-Wint-conversion编译警告的原因求解
编译警告触发原因
- 寄存器参数类型不匹配(核心原因)
你调用CSR_RD时传入的第二个寄存器参数,经过VTSS_VENICE_DEV4_SERDES6G_ANA_STATUS_SERDES6G_PLL_STATUS宏链展开后是整数类型的地址值,但_csr_rd函数的第三个入参要求是ioreg_blk *类型的结构体指针,直接传整数地址就会触发「整数转指针无类型转换」的报错。你之前误以为是宏的第三个参数(存值变量)的问题,实际上报错指向的是_csr_rd的第三个入参,也就是你传给宏的第二个寄存器参数,这也是你即便传了&value还是会报错的原因。 - 存值参数类型不匹配(潜在错误)
_csr_rd的第四个入参要求是u32 *类型的指针,用于存储读取到的寄存器值,你直接传u32类型的test2变量本身也不符合类型要求。 - 关于宏参数数量疑问的说明:
CSR_RD宏设计上就是3个入参,展开时会自动把当前函数作用域的vtss_state(你当前函数vtss_venice_c_sd6g_ib_cal的第一个入参就是该变量,作用域合法)作为第一个参数传给_csr_rd,所以_csr_rd需要4个参数是正常设计,没有问题。
解决方法
根据你的代码场景,有两种可选修复方案:
方案1:适配现有CSR_RD宏
构造符合要求的ioreg_blk结构体变量,填充对应的mmd、is32、addr字段后,把结构体指针传给CSR_RD的第二个参数,同时存值变量传地址:
u32 test2; // 构造ioreg_blk结构体,字段值根据寄存器参数对应填写 ioreg_blk reg = { .mmd = 0x04, .is32 = 0, .addr = 0xe630 + 0*7 + 4 // 对应寄存器宏展开后的地址计算逻辑 }; CSR_RD(port_no, ®, &test2);
方案2:直接调用底层csr_rd函数
你当前用的寄存器宏本来就是返回整数地址,适配底层csr_rd函数的入参要求,可直接调用跳过_csr_rd的封装:
u32 test2; vtss_rc __rc = csr_rd(vtss_state, port_no, 0x04, 0, VTSS_VENICE_DEV4_SERDES6G_ANA_STATUS_SERDES6G_PLL_STATUS(0), &test2); if (__rc != VTSS_RC_OK) { return __rc; }
额外修复点
你代码里的位判断逻辑存在错误:
// 原错误写法,逗号表达式只会返回&value的布尔值,完全不生效 if ((VTSS_F_VENICE_DEV4_SERDES6G_ANA_STATUS_SERDES6G_PLL_STATUS_PLL_CAL_NOT_DONE, & value))
需要改成从读取到的寄存器值里取对应位判断:
if (test2 & VTSS_F_VENICE_DEV4_SERDES6G_ANA_STATUS_SERDES6G_PLL_STATUS_PLL_CAL_NOT_DONE) { status = VTSS_RC_ERROR; }
内容的提问来源于stack exchange,提问作者t1fpga1
相关产品推荐
相关产品推荐

