基于VxWorks的嵌入式系统复合通信模式
单板机功能集成度高、扩展性强、性能稳定,可以添加多种外围存储设备、支持高分辨显示,是一种理想的单板机系统。
3.1 基于VME总线的DMA通信方式
在VME总线上,每个单板机如果要访问其它单板机的RAM,必须通信VME总线地址映射。因此,每块板上有两个地址译码器,一个用于VME总线地址→本地地址译码,而另一个用于本地地址→VME总线地址译码,这样就会存在多个不同的存储器地址映射。如果想要访问某个单板机的RAM,需要知道该单板机的RAM本地址所映射成的VME总线地址,然后通过访问VME总线地址映射到自身的本地地址而访问到系统控制器,甚至可以将其看成自身的RAM地址。多处理器地址映射关系如图2所示。
综上所述,对于某一VME总线中的任务一块板而言,只要获得了它的本地地址到VME总线地址的映射关系,就可以从板外来访问该板的RAM。VxWorks标准函数库sysLib当中提供了函数sysLocaltoBusAddr(),可以直接获得本地地址的VME总线地址。这样,当前主机只需调用该函数获得自身RAM地址到VME地址映射,其它的主机就可以根据该映射得到的VME总线地址访问该主机。因此,当需要对于外板的某些控制寄存器进行位元操作的进修,这种方法就显得尤其重要:因为往往没有函数能够仅仅对于外板RAM的某个字节进行操作,更无法定位到位操作。
为了进一步提高数据传输速率,可使用PPC4A上的VME控制芯片Tundra中集成的DMA控制器。它支持基于VME总线的DMA数据传输方式,而DMA是外存数据传输最有效的一种方式。具体步骤如下:
①安装DMA驱动程序,调用函数dmaDrv();
②建立DMA设备,调用函数dmaDevCreate();
③打开DMA进行读写,调用函数open()、write()、read()。
DMA设备句柄就是一个类似于文件指针的数据类型,所以可以像一个标准数据操作来对待。开启设备后即可调用文件读写标准函数进行读写操作。通过较为严格的测试,DMA数据传输速率可以达到40Mb/s以上,并且不发生数据传输错误。
为了保证主机对于其它主机DMA传输数据的实时响应,应当产生VME总线中断信号通知该主机。当某个主机发送数据完毕后,须调用VxWorks提供的函数sysBusIntGen ()t向VME总线产生一个级别为intLevel、中断号为intNum的中断信号。
接收端主机事先建立一个与该级别中断信号对应的客户中断服务程序,并将该客户中断服务程序链接到所要求级别的中断号上,从而实现对其进行实时响应。当主机接收到属于自己的中断信号后,会立刻自动调用该中断服务程序。这时可利用中断服务程序释放一个信号灯,通过该信号灯驱动相应的数据处理模块,从而实现实时操作。如下面的全程:
/*客户中断服务程序*/
void intHdlr(SEM_ID semId)
void intHdlr(SEM_ID semId)
{
/*释放信号灯*/
semGive(semId);
}
/*等待信号灯的处理模块*/
void processsModle(void)
{
/*等待信号灯*/
semTake(semld);
/*处理模块代码*/
…
}
VME总线共有7个中断级别,排除系统使用的中断号,客户自定义中断号可从18设置到32。这样能够为足够多的主机设置中断服务程序,从而实现VxWorks操作系统下的多主机VME总线实时高速通信。
3.2 串行口通信
在VxWorks中,将I/O系统设计成为任何类型的设备提供一个简单、统一、独立于设备的接口,所以串行口通信软件的设计和VME通信具有相似之处。在VxWorks中,任何对于串行口的操作仍然可以视为对一个文件的操作,而不必了解关于设备或程序驱动实现的细节。在串行口通信软件的设计不中,利用RRCx的增强软件包ESP可对驱动成功后的串行口设备进行操作。系统首先调用ESP软件提供的esccDrv()安装串行驱动程序,随后调用esccDevCreate()将指定的串口设备添加到系统中,当串口初始化完成后,与DMA操作方式类似,在使用之前利用open()打开相应串口,依据串口打开时的读写标志,调用函数write()、read()对串口进行只读操作、只写操作或同时进行读写操作。
对于串口通信,仍然要关心数据接收的实时性。可采用中断方式,利用VxWorks提供的select函数的事件触发机制,将读串口的任务阻塞使其一直等待数据,当有数据来到的时候该任务会立刻自动响应,提高系统的实时性。
3.3 基于TCP/IP协议的网络通信
网络通信一般可通过套接口(socket)实现。VxWorks提供了标准的BSD socket调用,具有两种类型:Stream socket(全双工流类型)、Datagram sockets(数据摄类型)。前者支持TCP协议,后者支持UDP协议。任何一个任务都可以打开一或多个socket,其它任务的socket可与之连接。客户端程序首先调用socket()个函数产生用于与各分系统连接
VxWorks 相关文章:
- 蓝牙无线耳机设计及VxWorks移植方法(07-21)
- 军事指挥系统中VxWorks下汉字显示技术(07-16)
- 基于VxWorks的文件系统的研究与实现(09-18)
- 嵌入式语音通信系统中VxWorks BSP的设计实现(09-18)
- 嵌入式系统的VxWorks安全性问题研究(11-06)
- VxWorks下的多重定时器设计(02-16)