本帖最后由 复活节彩蛋 于 2013-1-18 14:57 编辑
从网上下载了AT91SAM7X256的以太网收发示例程序。其RequestSend函数中
void RequestSend(unsigned short FrameSize)
{
while (pEMAC->EMAC_TSR & AT91C_EMAC_TGO);
tptr = (unsigned short *)(Tx_Desc[0].addr & ~3);
Tx_Desc[0].stat = (FrameSize | TD_LAST_BUF | TD_TRANSMIT_WRAP);
}
为何要将地址的最后两位清零呢?
改动1: 如果改成tptr = (unsigned short *)(Tx_Desc[0].addr+1); 程序就会异常停止(停在 DAbt_Handler B DAbt_Handler 这句中 )。
改动2: 如果将初始化操作函数rx_descr_init中的Tx_Desc.addr = TX_BUF(i); 改为Tx_Desc.addr = TX_BUF(i)+1; 程序又会正常运行。
通过改动1与改动2的比较,得出这样一个结论:
(1)这里的地址必须与初始化地址一致,否则程序将无**常运行;
(2)初始化的地址是Tx_Desc[0].addr,但是变成Tx_Desc[0].addr & ~3依然可以正常工作,说明实际的地址数据并没有被改变。
为此做了改动3: tptr = (unsigned short *)(Tx_Desc[0].addr ); 程序可以正常工作。
但是通过仿真器仿真发现:
(1)改动3中,tptr本身的数据与未改动前相同,验证了结论(2)
以上程序都是在KEIL4 中编译,仿真器是Ulink
到底这个& ~3到底是加还是不加呢???各位大侠的驱动程序都是怎么处理的呀?
|