/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 = ; 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" *
无任何显示表示都被替换成功
这样可以顺利编译通过。
参考资料: