The SI implementation simplifies many of the details used in the TI implementations. Where as they cover multiple modules used in conjunction the SI implementation has condensed usage into to Models; The Message Queue Model and Notify Model. Some features have been removed and configurability has reduced in order to provide a light-weight, simple, and fast method for using the TI IPC hardware safely and effectively.
This model resembles the TI Notify model in that it uses interrupts to notify cores and allows for events to be associated with messages. Each core will run SI_IPC_Init(...). This will coordinate cores and set them up to use the Notify model. Each core can than call SI_IPC_RegisterEvent(...) for any event for which they'd like to register a callback function. These events will be linked to incoming messages. A sender must then simply call SI_IPC_Message(...) to send a message and interrupt to another core. The receiver will use the SI_IPC_Isr(..) to handle the interrupt and call the appropriate function for the message received.
Each core will call init and a single function for each send and receive is needed. Receive requires only an register call for future automated responses to message events.
Example INIT
Int SI_IPC_Init(Int intNum, UInt eventCount, uint32_t msgAddress, uint32_t listAddress);
Int SI_IPC_RegisterEvent(UInt eventID, SI_FnCbck FnCbck);
SEND
SI_IPC_Message(UInt remoteCoreID, UInt eventID, uint32_t msg);
Additional details can be found in SI_SIPC.c
The Message Queue model resembles the TI MessageQ model. Implemenation and usage also closely resemble the SI Notify model with some differences. As before each core will initialize the model. This implementation uses SI_IPC_InitQueue(...) for each core to set up a message queue and coordinate among the active cores. Each core will then use SI_IPC_QueueMessage(...) to send a message or SI_IPC_GetMessage(...) to read a message. This implementation uses a FIFO of size set by the user and messages are pushed and popped from a core's local FIFO as you see fit.
Each core will call init and a single function for each send and receive is needed. Receive and Send are as simple as a single function for use after initialization.
Example:
INIT
uint32_t SI_IPC_InitQueue(uint32_t msgCount, uint32_t listAddress)
RECEIVE
uint32_t SI_IPC_QueueMessage(uint32_t remoteCoreID, uint32_t msg, uint32_t timeout)
SEND
uint32_t SI_IPC_GetMessage(uint32_t *msg, uint32_t timeout)
Additional details can be found in SI_SIPC.c
Add link to SI_IPC project here???????????????