#include #include #include #include #include #include #include #include #include "my.h" #define TPCC_BASEADDR(n) (0x02700000 + n * 0x20000) #define IPR(n) *(volatile int*)(TPCC_BASEADDR(n) + 0x1068) #define INTC_BASEADDR(n) (0x02600000 + n * 0x4000) #define STATUS_SET_INDEX_REG(n) *(volatile unsigned int*)(INTC_BASEADDR(n) + 0x020) void Generate_IPC_Interrup(int coreNum, int info); int IPC_Interrup_Process(); void IPCInterruptHandler(); void main() { int i = 0; intc_init(); IntcBind(CSL_GEM_IPC_LOCAL,CSL_INTC_VECTID_6, IPCInterruptHandler); if(DNUM == 1) { for(i = 0; i < 8; i++) { Generate_IPC_Interrup(i,i); } } while(1); } /* * 函数说明:该函数实现给8个核中的任意一个核发送一个IPC中断 * 参数说明:int coreNum:核编号 * int info: 给其他核发送的消息,该消息长度为0bit-27bit,其中每一位或几位可以用来表示一个消息,这个消息的格式自定义 * 备注: 该函数在同一时刻只能给一个核产生一个同步事件 */ void Generate_IPC_Interrup(int coreNum, int info) { hIpc->IPCGR[coreNum] |= (info << 4); hIpc->IPCGR[coreNum] |= 0x1; return; } /* * 函数说明:该函数用于IPC中断服务程序中,进入IPC中断服务服务函数时,调用该函数,返回发送方传递的消息 * 参数说明: 无 */ int IPC_Interrup_Process() { int info; info = hIpc->IPCGR[DNUM] & 0xFFFFFFF0; hIpc->IPCAR[DNUM] = info; return (info >> 4); } void IPCInterruptHandler() { int info; info = IPC_Interrup_Process(); printf("info = %d\n",info); }