打印

求教:AT91SAM7X+DM9161以太网通信 发送缓冲区指针设置问题

[复制链接]
1897|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
复活节彩蛋|  楼主 | 2013-1-18 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 复活节彩蛋 于 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到底是加还是不加呢???各位大侠的驱动程序都是怎么处理的呀?


相关帖子

沙发
jlass| | 2013-1-18 15:52 | 只看该作者
这种问题还是直接看代码吧,两个MAC地址应该要进行比对的,至于屏蔽掉最后两位仍然可行的原因只有从代码上去找了。

使用特权

评论回复
板凳
复活节彩蛋|  楼主 | 2013-1-18 19:19 | 只看该作者
本帖最后由 复活节彩蛋 于 2013-1-18 19:21 编辑
jlass 发表于 2013-1-18 15:52
这种问题还是直接看代码吧,两个MAC地址应该要进行比对的,至于屏蔽掉最后两位仍然可行的原因只有从代码上 ...

嗯  也许得再好好分析一下代码。

我用仿真器的观察过,我改成tptr = (unsigned short *)(Tx_Desc[0].addr+1)后,从仿真窗口里看,tptr的值竟然像想象中那样加一。感觉很费解。
但因为是用仿真器的缘故,就没有特别在意。

我在想有没有可能是编译的问题。就跟DSP那样,用代码控制变量在内存中的地址,比如将某类数据专门放在SRAM里。
现在只是初步接触ARM,对这不太了解。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

54

帖子

0

粉丝