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; }
/* 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); }
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); }
/* interrupt to master from slave */ void IPC_Slave2Master_IRQHandler() { SLAVE_TXEV_QUIT(); msgPending = PENDING; }