TI的工程师,你们好!
cc3200 开发过程中遇到问题如下:
添加idle_profile lpds模式后,通过注册的GPIO深度唤醒源唤醒后,UART中断无法抢占。
问题描述如下:
2个线程:task1 优先级为1, task2 优先级为2. task1 在深度唤醒源唤醒后,占用cpu 10s 并同时给task2 发信号。task2 为串口数据读,正常情况下阻塞,等到DMA中断到来,通知task2 读串口数据。
设置一个GPIO9为低电平,在uart中断中将其拉高。
在不进入LPDS模式下,当串口有数据接收时,串口中断 会将GPIO9拉高,并发信号给task2 触发其读串口数据。
问题是:在进入LPDS模式下后,按下GPIO 触发深度唤醒源中断唤醒CC3200后,task1 被唤醒,占用cpu,task1并没有设置GPIO9为高电平,而实测发现 GPIO9 此时为高电平。 同时 向串口写数据,串口中断没有被触发。 我的理解应该是 此时中断会抢占task1,从而通知task2 去收数据。
请问一下,在LPDS 模式下,寄存器的状态是否会被保存? 为何此时,串口中断没有被触发?
其中,task1 死循环代码如下:
while(FOREVER) {
UART_PRINT("WakeupTask\n\r");
osi_MsgQRead(&g_tWkupQueue, &ucQueueMsg, OSI_WAIT_FOREVER);
switch(ucQueueMsg){
case 1:
UART_PRINT("timer\n\r");
break;
case 2:
UART_PRINT("CPU running\n\r");
while(i > 0) {
osi_MsgQWrite(&g_tUartMonitorFlag, (void*)1, OSI_NO_WAIT);
MAP_UtilsDelay(8000000); //delay 3s
i–;
}
i = 12;
osi_Sleep(1000);
break;
case 3:
UART_PRINT("host irq\n\r");
break;
default:
UART_PRINT("invalid msg\n\r");
break;
}
}
sherlock ding:
回复 Viki Shi:
谢谢提供的文档,cc_back_up_soc_data 接口有保存CPU当前寄存器和NVIC的数据, cc_restore_soc_data 会恢复 cc_back_up_soc_data 保存的数据。 然后 在进入睡眠前 调用cc_back_up_soc_data接口, 在深度唤醒源中断中, 调用cc_restore_soc_data接口。 然后 uart1中断依然没办法被触发。请问 这样操作是否正确,或者还有其他需要考虑的因素?