实时操作系统VxWorks在跟踪雷达系统中的应用
调用pciConfigLibInit()来选择PCI设备的配置机制Mechanism#1或Mechanism#2,接着调用pciConfigLibInit()对PCI设备中断进行初始化,建立中断链表。这两个步骤对PCI做了最基本的配置,随后的一些PCI配置都以它们为基础。随着系统初始化的继续,在另一个硬件初始化函数sysHwInit2()里,调用了sysPciAutoConfig(),这个函数对PCI设备做了进一步的初始化。首先,它逐个查找PCI设备,先查找0号总线上的所有设备,一旦查到PCI-PCI桥设所有设备为止。查找过程中,这个函数对一些在总线上慢显现的设备作了一些特殊的等待处理。这会减慢系统启动的速度,若需要,用户可以通过修改内核源程序来避免等待。当确定了所有的设备后,函数再次查找一遍设备。这次,它创建一个PCI设备列表,把所有的设备都存到列表中。然后,函数根据这个列表,对每个设备做一些配置。它根据设备硬件上的设备映射设备存储空间和I/O空间,分配中断向量等,图4的PCI映射存储器空间就是这样映射的。然后,系统还对一些特殊的PCI设备做相应的配置。到此为止,系统对PCI设备的初始化工作就结束了。用户了解这些配置后,就可以在应用程序里对自己的PCI设备进行访问了。
操作系统启动后,开始执行usrAppInit()。这个函数的内容由用户自己编写,它完成用户所需的功能。在本系统中,因为程序不知道哪个槽上有哪种信号处理板,所以程序首先按槽号逐个查找一遍,以确定哪个槽有信号处理板;然后读出设备的PCI映射存储空间地址,以便对信号处理板进行读写,同时读出中断线的内容,进而通过pciIntConnect()来挂中断。pciIntConnect()函数考虑了PCI设备对中断资源的共享,这样不会破坏共享同一个中断信号的其它中断。中断处理使用了信号量机制,处理模式如图5下半部所示。当有中断产生时,中断服务子程序立即响应,它给相应的处理进程发送信号,处理进程即开始工作;在没接收到信号时,处理进程处于等待状态。
STATUSdspISR()
{
……
switch(intType)
{
caseINT_20MS;/*INT_20MS=1*/
……
semGive(sem20ms);
break;
caseINT_ACQGATE:/*INT_ACQGATE=2*/
……
semGIve(semAcqGate);
break;
default:
……
break;
}
……
}
voidintProc20ms()
{
……
FOREVER
{
semTake(sem20ms,WAIT_FOREVER);
……
}
……
}
voidintProcGate()
《实时操作系统VxWorks在跟踪雷达系统中的应用(第3页)》
本文链接地址:http://www.oyaya.net/fanwen/view/173717.html
操作系统启动后,开始执行usrAppInit()。这个函数的内容由用户自己编写,它完成用户所需的功能。在本系统中,因为程序不知道哪个槽上有哪种信号处理板,所以程序首先按槽号逐个查找一遍,以确定哪个槽有信号处理板;然后读出设备的PCI映射存储空间地址,以便对信号处理板进行读写,同时读出中断线的内容,进而通过pciIntConnect()来挂中断。pciIntConnect()函数考虑了PCI设备对中断资源的共享,这样不会破坏共享同一个中断信号的其它中断。中断处理使用了信号量机制,处理模式如图5下半部所示。当有中断产生时,中断服务子程序立即响应,它给相应的处理进程发送信号,处理进程即开始工作;在没接收到信号时,处理进程处于等待状态。
STATUSdspISR()
{
……
switch(intType)
{
caseINT_20MS;/*INT_20MS=1*/
……
semGive(sem20ms);
break;
caseINT_ACQGATE:/*INT_ACQGATE=2*/
……
semGIve(semAcqGate);
break;
default:
……
break;
}
……
}
voidintProc20ms()
{
……
FOREVER
{
semTake(sem20ms,WAIT_FOREVER);
……
}
……
}
voidintProcGate()
《实时操作系统VxWorks在跟踪雷达系统中的应用(第3页)》