* 更新 *
这是我发现的情况。每当我在代码中使用那个函数时,它不会真正使代码锁定。它实际上会使读取RTC I²C函数执行变得非常缓慢,但代码仍然可以正常运行,只是每次读取RTC时需要等待很长时间。
因此,RTC有一个闹钟中断,这会触发ISR内部的其他I²C交互,因此看起来它正在尝试同时进行两个I²C通信,从而减慢了进程速度。我删除了ISR中的函数,现在它可以正常工作了。我将继续调查。
我在使用IAR 5.40编程STM32F103微控制器时遇到了这个问题。如果我尝试printf一个本地变量,它会导致代码在甚至到达该函数之前的另一点处冻结。
可能是什么原因导致这种情况?
这是该函数:
u8 GSM_Telit_ReadSms(u8 bSmsIndex)
{
char bTmpSms[3] = {0};
itoa(bSmsIndex, bTmpSms, 10); // Converts the smsindex into a string
printf("index = %s\n", bTmpSms); // This printf caused the code to get stuck in the RTC // byte read function!
GSM_Telit_RequestModem("AT+CMGR=""1", 10, "CMGR", 5, 0);
return 1;
}
我也尝试过这个方法,但并没有导致我遇到的锁定问题:
u8 GSM_Telit_ReadSms(u8 bSmsIndex)
{
char bTmpSms[3] = {0};
itoa(bSmsIndex, bTmpSms, 10);
printf("index = 2\n");
GSM_Telit_RequestModem("AT+CMGR=""1", 10, "CMGR", 5, 0);
return 1;
}
没有任何优化启用,当尝试从我的I²C RTC读取一个字节时,代码会卡住,但是一旦我删除这个
printf("index = %s\n", bTmpSms);
或者使用这个printf("index = 2\n");
,那么一切都很顺利。有什么想法吗?实际上,bSmsIndex永远不会超过30,即使在调用此函数之前锁定也会发生。