Ejemplo n.º 1
0
void IPC_initMasterMbx(CbackItem cbackTable[], Mbx* masterMbxPtr, Mbx* slaveMbxPtr)
{
    int i;
    Mbx* lPtr;

    // initialize the pointers
    mbxLocalTablePtr = masterMbxPtr;
    mbxRemoteTablePtr = slaveMbxPtr;

    // clear the mailbox and the flags
    for(i=0, lPtr = mbxLocalTablePtr; i<NUM_MASTER_MBX; i++,lPtr++) {
        lPtr->mbxStatus = READY;
        lPtr->mbxHeader.msg = MBX_MSG_DEFAULT;
        lPtr->mbxHeader.msgId = MBX_MSGID_DEFAULT;
        lPtr->mbxParam = MBX_PARAM_DEFAULT;
        mbxFlags[i] = NO_MSG;
    }

    // plug the actual callbacks
    _plugCallbacks(&cbackTable[0], NUM_MASTER_MBX);

    SLAVE_TXEV_QUIT();

    // disable IRQ
    NVIC_DisableIRQ((IRQn_Type)SLAVE_IRQn);

    // clear any pending interrupt
    NVIC_ClearPendingIRQ((IRQn_Type)SLAVE_IRQn);

    // set the default priority for the mbx interrupts
    NVIC_SetPriority((IRQn_Type)SLAVE_IRQn, MASTER_MAILBOX_PRIORITY);

    // enable the interrupt
    NVIC_EnableIRQ((IRQn_Type)SLAVE_IRQn);
}
/* interrupt function on the master side (slave -> master interrupt) */
void IPC_Slave2Master_IRQHandler() {

	/* acknowledge the interrupt */
	SLAVE_TXEV_QUIT();

	/* call the interrupt callback function */
	(*masterIntCallback)();
	
	/* set the interrupt flag */	
	intFlag = MSG_PENDING;			
}
Ejemplo n.º 3
0
/* interrupt to master from slave */
void M0CORE_IRQHandler() {

    mbxId_t i;

    // acknowledge the interrupt
    SLAVE_TXEV_QUIT();

    for(i=(mbxId_t)0; i<NUM_MASTER_MBX; i++) {

        if(PROCESS == IPC_queryLocalMbx(i)) {

            _mbxProcess(i);

            mbxFlags[i] = MSG_PENDING;
        }
    };
}
/* initialize the interrupt on the master side */
void IPC_masterInitInterrupt(intCallback_t masterCback)
{
	intFlag = NO_MSG;
   
	SLAVE_TXEV_QUIT();

	/* register the callback, executed within the interrupt context */
	masterIntCallback = masterCback;
	
	/* disable IRQ */
	NVIC_DisableIRQ((IRQn_Type)SLAVE_IRQn);	

	/* clear any pending interrupt */
	NVIC_ClearPendingIRQ((IRQn_Type)SLAVE_IRQn);

	/* set the default priority for the mbx interrupts */
	NVIC_SetPriority((IRQn_Type)SLAVE_IRQn, MASTER_INTERRUPT_PRIORITY);
			
	/* enable the interrupt */
	NVIC_EnableIRQ((IRQn_Type)SLAVE_IRQn);	
}
Ejemplo n.º 5
0
void IPC_masterInitQueue(cmdToken* cmdBuf, uint32_t cmdBufSize, msgToken* msgBuf, uint32_t msgBufSize)
{	
	uint32_t i;
					 
	cmdBlockAddress->cmdQstartAddress = cmdBuf;
	cmdBlockAddress->cmdQendAddress = cmdBuf + cmdBufSize;	// end address includes +1 item
	cmdBlockAddress->cmdRdPtr =  cmdBuf;
	cmdBlockAddress->cmdWrPtr = cmdBuf;

	for(i=0; i < cmdBufSize; i++, cmdBuf++) *cmdBuf = INVALID_CMD_TOKEN;

	msgBlockAddress->msgQstartAddress = msgBuf;
	msgBlockAddress->msgQendAddress =  msgBuf + msgBufSize;	 // end address includes +1 item
	msgBlockAddress->msgRdPtr =  msgBuf;
	msgBlockAddress->msgWrPtr =  msgBuf;

	for(i=0; i < msgBufSize; i++, msgBuf++) *msgBuf = INVALID_MSG_TOKEN;

	SLAVE_TXEV_QUIT();

	// disable IRQ
	NVIC_DisableIRQ((IRQn_Type)SLAVE_IRQn);	

	// clear any pending interrupt
	NVIC_ClearPendingIRQ((IRQn_Type)SLAVE_IRQn);
			
	// clear the flag
	msgPending = NO_TOKEN;	

	// set the default priority for the ipc interrupts
	NVIC_SetPriority((IRQn_Type)SLAVE_IRQn, MASTER_QUEUE_PRIORITY);
			
	// enable the interrupt
	NVIC_EnableIRQ((IRQn_Type)SLAVE_IRQn);
		
}
Ejemplo n.º 6
0
/* interrupt to master from slave */
void IPC_Slave2Master_IRQHandler()
{	
	SLAVE_TXEV_QUIT();

	msgPending = PENDING;
}