1.介绍
增强型网络驱动(END)是SOI 模型中数据链路层的实现,它通过MUX 函数和网络服务
通信。
2.驱动操作
2.1 添加驱动到VxWorks
添加驱动到VxWorks 系统就像添加其他的应用一样。第一步是编译并把驱动代码包
括在VxWorks 镜像中。
由于VxWorks 允许创建一个以上的网络设备,所以必须需要对配置设备的相关的
#define 进行分组。定义在target/config/bspname/configNet.h 里面。以下是网络设备描述的一
个例子。在系统中应该添加类似的描述到configNet.h 文件中。
#define MOT_FCC_LOAD_FUNC sysMotFccEndLoad
#define MOT_FCC_LOAD_STRING ""
IMPORT END_OBJ* MOT_FCC_LOAD_FUNC (char *, void*);
在每一个网络设备的配置中,应该定义以上两个常量,以下对着两个常量进行说明:
LOAD_FUNC:
规定驱动endLoad()函数的入口点。例如,如果驱动的endLoad()入口点是
sysMotFccEndLoad(),那么编辑configNet.h 包括以下的定义:
#define MOT_FCC_LOAD_FUNC sysMotFccEndLoad
LOAD_STRING:
在网络初始化过程中,作为initString参数,传递给muxDevLoad( )的初始化参数。这个
字符串也一并传给endLoad()函数,它的内同取决于驱动的需要。
必须编辑endDevTbl()的定义(在configNet.h中规定包括在镜像中的ENDS)从而包含被
加载的每一个设备的入口。
例如:
END_TBL_ENTRY endDevTbl [] =
{
{ 0, LOAD_FUNC_0, LOAD_STRING_0, BSP_0, NULL, FALSE },
{ 1, LOAD_FUNC_1, LOAD_STRING_1, BSP_1, NULL, FALSE },
{ 0, END_TBL_END, NULL, 0, NULL, FALSE },
};
上面的第一个参数规定设备号。在最后的FALSE 表示入口还没有被处理。在系统成功
的加载驱动后,这个值变为TRUE。如果想要禁止系统自动加载驱动,那么可以把这个值设
为TRUE。
这样,就准备好重新编译VxWorks 从而包括新的END 驱动。当新编译的VxWorks 启
动时,系统给在table 中每一个设备按照列出来的顺序调用muxDevLoad()。
2.2 网络初始化步骤
在系统启动后,VxWorks产生tUsrRoot任务初始化网络。usrRoot()调用usrNetInit(); 在usrNetInit()中调用sockLibAdd(),sockLibAdd()再调用bsdSockLibInit来添加BSD socket 库接
口。在usrNetInit()中还调用usrNetProtoInit()来初始化各种协议。usrNetInit()还调用
muxDevLoad()和ipAttach()。muxDevLoad()然后调用驱动中的endLoad()函数。
在muxDevLoad()加载驱动之后,调用muxDeStart()函数,它调用驱动中的endStart()
函数。endStart()函数应该激活驱动并且用相应的中断连接程序把中断服务程序连接到相
应的结构和BSP中。2.3 接收帧
当有中断发生的时候,VxWorks 调用endStart()函数注册的中断服务程序。中断服务程
序应该完成把帧从本地硬件传到可存取的存储器中所需的最少工作。
为了最小化中断封锁时间,仅仅那些需要最少执行时间的程序在中断级处理,像错误
检查或是设备状态改变。这个程序应该以任务级在所有耗时工作中排队。
为了以任务级处理在排队中等待接收的帧,用netJobAdd()函数。这个函数接受一个
函数指针以及最多5 个参数(给函数指针指向的函数提供参数)。net JobAdd()函数原型
如下:
STATUS netJobAdd
(
FUNCPTR routine,
int param1,
int param2,
int param3,
int param4,
int param5
)
在这里的routine 应该是在驱动中以任务级执行帧处理的函数。netJobAdd()函数把这
个函数放在tNetTask 工作队列中,并且提供合适的信号量唤醒tNetTask。
在唤醒之后,tNetTask 把函数调用和相应的参数从它的工作队列中取出。然后在它的上
下文中执行这些函数直到队列为空。
3. 编写END 驱动
3.1 驱动用的END 数据结构END_OBJ
END所用的核心的数据结构是END_OBJ。驱动应该指定这个结构并在endLoad()函数
中初始化它的一些元素。此结构定义在target/h/end.h中。
这个结构中的一些元素是由MUX管理的。但是驱动应该设定和管理其他的元素。
用户1396622 2009-1-18 13:03
用户824863 2007-11-8 14:16
用户824863 2007-11-8 11:50
这个是点亮的效果,拍的有点模糊!
shenyandetongxing_551209819 2006-10-26 23:24