Hi,我在打算利用28388的以太网向上位机发送字符串,但在CPU1toCM IPC中断一块遇到了一些问题。
CPU1在向MSGRAM写完字符串后会将ipcflag1置位,去触发CM的ipc中断。CM中我注册了两个ipc中断(CPU1TOCMIPCINT0与INT1),分别有不同的用途。
但我发现在CPU1 中置位ipc_flag1时会同时触发CM的CPU1TOCMIPCINT0和INT1两个中断(如图调试中中断次数均为1)
/**********问题如下*********/
于是我换了一个比较简单的框架,对ipc中断进行测试,发现问题在于每次启动CM核都会自动进入一次CPU1TOCMIPCINT0(如下图),不清楚为什么每次运行CPU1即使没有置位ipcflag0,但CM依然会触发一次CPU1TOCMIPCINT0中断?想请教下原因。
附上两个核心的程序代码:
CPU1:就是根据TI例程修改的一个定时器中断,每次中断置位ipcflag2
void main(void)
{
Device_init();
Device_bootCM(BOOTMODE_BOOT_TO_FLASH_SECTOR0);
Device_initGPIO();
Interrupt_initModule();
Interrupt_initVectorTable();
Interrupt_register(INT_TIMER0, &cpuTimer0ISR);
initCPUTimers();
configCPUTimer(CPUTIMER0_BASE, DEVICE_SYSCLK_FREQ,20);
CPUTimer_enableInterrupt(CPUTIMER0_BASE);
Interrupt_enable(INT_TIMER0);
CPUTimer_startTimer(CPUTIMER0_BASE);
EINT;
ERTM;
IPC_clearFlagLtoR(IPC_CPU1_L_CM_R,IPC_FLAG_ALL); //clear flag all
IPC_sync(IPC_CPU1_L_CM_R, IPC_FLAG31);// sync two core
while(1);
}
__interrupt void cpuTimer0ISR(void)
{
CpuTimer0Count++;
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
IPC_setFlagLtoR(IPC_CPU1_L_CM_R, IPC_FLAG2);
}
CM代码:(注册了三个ipc中断,查看CPU1置位flag2,几个中断函数的运行次数)
#include "driverlib_cm.h"
#include "cm.h"
uint16_t Ipc0IsrCount,Ipc1IsrCount,Ipc2IsrCount=0;
__interrupt void IPC0ISR(void);
__interrupt void IPC1ISR(void);
__interrupt void IPC2ISR(void);
void main(void)
{
CM_init();
Interrupt_registerHandler(INT_CPU1TOCMIPC0, &IPC0ISR);
Interrupt_registerHandler(INT_CPU1TOCMIPC1, &IPC1ISR);
Interrupt_registerHandler(INT_CPU1TOCMIPC2, &IPC2ISR);
Interrupt_enable(INT_CPU1TOCMIPC0);
Interrupt_enable(INT_CPU1TOCMIPC1);
Interrupt_enable(INT_CPU1TOCMIPC2);
IPC_clearFlagLtoR(IPC_CM_L_CPU1_R,IPC_FLAG_ALL); //clear flag all
IPC_sync(IPC_CM_L_CPU1_R, IPC_FLAG31);
while(1)
{}
}
__interrupt void IPC0ISR(void)
{
IPC_ackFlagRtoL(IPC_CM_L_CPU1_R,IPC_FLAG0);
Ipc0IsrCount++;
}
__interrupt void IPC1ISR(void)
{
IPC_ackFlagRtoL(IPC_CM_L_CPU1_R,IPC_FLAG1);
Ipc1IsrCount++;
}
__interrupt void IPC2ISR(void)
{
IPC_ackFlagRtoL(IPC_CM_L_CPU1_R,IPC_FLAG2);
Ipc2IsrCount++;
}