ecos3.0编译 if_lancepci.c:528: 错误: 赋值运算的左操作数必须是左值
/home/xin/ecos3/ecos-3.0/packages/devs/eth/amd/lancepci/v3_0/src/if_lancepci.c:528: 错误: 赋值运算的左操作数必须是左值
vi /home/xin/ecos3/ecos-3.0/packages/devs/eth/amd/lancepci/v3_0/src/if_lancepci.c
for (i = 0; i < cpd->rx_ring_cnt; i++) { HAL_PCI_CPU_TO_BUS(d, (cyg_uint8 *)b); _SU32(p, LANCE_RD_PTR) = (b & LANCE_RD_PTR_MASK) | LANCE_RD_PTR_OWN; _SU16(p, LANCE_RD_BLEN) = (-_BUF_SIZE); p += LANCE_RD_SIZE; d += _BUF_SIZE; }
分别定义为
~/ecos3/ecos-3.0/packages/devs/eth/i386/pc/lancepci/v3_0/include$vi devs_eth_i386_pc_lancepci.inl
#define HAL_PCI_CPU_TO_BUS(__cpu_addr, __bus_addr) \ CYG_MACRO_START \ (__bus_addr) = CYGARC_PHYSICAL_ADDRESS(__cpu_addr); \ CYG_MACRO_END #endif // __WANT_CONFIG
457行b的定义
cyg_uint32 b;
以上函数中红色字体将被替换为
(cyg_uint8 *)b = CYGARC_PHYSICAL_ADDRESS(cpd->rx_ring);
而强制转换放在等号的左边是不被编译器支持的,正常的做法是放到选号的右边,我想不到什么好的办法能比较方便的把放到右边,所以我就把强制转换去掉了,因为把 uint_32 的变量赋值给 uint_8* 应该是没有什么问题的,所以就把for中的代码改成为
HAL_PCI_CPU_TO_BUS(d, b);
修改方式:
vi打开文件使用%s/(cyg_uint8 \*)b/b/g
保存关闭后,查看修改结果
grep "(cyg_uint8 \*)b" *
无任何显示表示都被替换成功
这样可以顺利编译通过。
参考资料: