平台介绍:
loongson3a-4核cpu,vxWorks6.8环境
一,核间通信的控制器驱动
二,核间通信控制器初始化
loongson3a-4核cpu,vxWorks6.8环境
一,核间通信的控制器驱动
核间通信是通过中断来进行实现的。系统中定义了两个全局变量,是用来管理核间通信的,看看他们作用具体是什么?
_WRS_DATA_ALIGN_BYTES(32) INT_CTLR vxbSbIntCtlr[VX_MAX_SMP_CPUS];
typedef struct sb1IntCtlr
{
volatile UINT64 *bcm1xxxIntMaskL;
volatile UINT64 *bcm1xxxIntStatusBaseL;
volatile UINT64 *bcm1xxxIntMapBaseL;
volatile UINT64 *bcm1xxxLdtIntClearL;
} INT_CTLR;
这个全局变量看起来不是很明显,具体呢就是记录核间中断的寄存器的地址,这样呢每次触发一个核间中断呢只需要通过这个全局变量来进行设置就行了。
MIPS_SB_INT_CTLR_DRVCTRL * pVxbPMipsSbIntCtlrDrvCtrl;
typedef struct mipsSbIntCtlrDrvCtrl
{
VXB_DEVICE_ID pInst;
struct intCtlrHwConf isrHandle;
cpuset_t enabledCpus;
int defaultCpu;
BOOL initialized;
} MIPS_SB_INT_CTLR_DRVCTRL;
这个呢记录了默认的cpu以及核间中断时的中断处理函数。
二,核间通信控制器初始化
看看这个核间中断驱动控制器的处理化:
LOCAL void vxbMipsSbIntCtlrInstInit
(
VXB_DEVICE_ID pInst
)
{
HCF_DEVICE * pHcf = hcfDeviceGet (pInst);
/*获取bcmFamily这个资源的值*/
if (devResourceGet (pHcf, "bcmFamily", HCF_RES_INT, (void *) &vxbBcmFamily) != OK)
return;
/*构建pVxbPMipsSbIntCtlrDrvCtrl这个结构体*/
pVxbPMipsSbIntCtlrDrvCtrl = (MIPS_SB_INT_CTLR_DRVCTRL *)hwMemAlloc \
(sizeof(MIPS_SB_INT_CTLR_DRVCTRL));
pVxbPMipsSbIntCtlrDrvCtrl->pInst = pInst;
pInst->pDrvCtrl = pVxbPMipsSbIntCtlrDrvCtrl;
/*记录已经初始化了的cpu的数量*/
pVxbPMipsSbIntCtlrDrvCtrl->enabledCpus = (1 << vxCpuIdGet());
/*记录初始化pVxbPMipsSbIntCtlrDrvCtrl这个结构体的cpu*/
pVxbPMipsSbIntCtlrDrvCtrl->defaultCpu = vxCpuIdGet();
/*通过这个函数获取这个核间通信控制器的资源,中断号,中断引脚,中断路由等信息*/
intCtlrHwConfGet(pInst,
(HCF_DEVICE *)pInst->pBusSpecificDevInfo,
&(pVxbPMipsSbIntCtlrDrvCtrl->isrHandle));
pInst->pMethods = &mipsSbIntCtlr_methods[0];
}
简单看一下这获取资源的函数:
STATUS intCtlrHwConfGet
(
VXB_DEVICE_ID pInst,
HCF_DEVICE * pHcf,
struct intCtlrHwConf * pEntries
)
{
struct intrCtlrInputs * pCtlrInputs;
struct intrCtlrXBar * pXbar;
struct intrCtlrCpu * pCpuTable;
struct intrCtlrPriority * pPrioTable;
stru