📄 dpram.txt
字号:
网络控制器与链路控制器的交互
网络控制器和链路控制器的交互依靠某型双端口RAM芯片,该芯片具有两套独立的地址、数据线及读/写控制线,偏移地址0xFFE、0xFFF被配置为mailbox,右端口在0xFFE写入数据,则左端口产生中断,左端口读取该地址后中断被清除;左端口在0xFFF写入数据,则右端口产生中断,右端口读取该地址后中断被清除。
网络控制器和链路控制器的CPU即是通过读写双端口RAM芯片完成网络层与数据链路层的原语交互。mailbox中写入的是原语的类型,而双端口RAM的其它存储空间则存放各种服务原语的参数。
NCDualPort描述了双端口RAM读写的mailbox和参数区域地址,其数据结构如下所示:
typedef struct tagNCDualPort
{ /*中断标志区*/
Uint16 * lpReadFlag;
Uint16 * lpWriteFlag;
/*参数区*/
Uint8 * lpNCBParam;
Uint16 * lpNCDParam;
} NCDualPort, *LPNCDualPort;
在网络控制器双端口处理模块中定义一个NCDualPort的实例m_DualPort,通过m_DualPort读写中断。如下:
/*在mailbox单元写入原语wCmd*/
extern void DualPort_WriteIntFlag(Uint16 wCmd)
{
*(m_DualPort.lpWriteFlag) = wCmd;
}
/*读取mailbox单元原语并返回类型*/
extern Uint16 DualPort_ReadIntFlag(void)
{
return (Uint16)*( m_DualPort.lpReadFlag);
}
网络控制器CPU在接收到双端口RAM的中断后,在中断服务程序中将mailbox中的中断编码(即服务原语类型)读出,写入双端口RAM中断队列尾。
/*网络控制器双端口中断服务程序*/
#pragma interrupt(DualPort_Isr)
static void DualPort_Isr(void)
{
Uint16 wCmd;
disable();
wCmd = DualPort_ReadIntFlag(); /*读中断编码(服务原语)*/
DualPort_IntAddTail(wCmd); /*将中断编码入中断队列尾*/
outword(INT_EOI, EOITYPE_DPRAM);
enable();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -