* 更新 *
这是我发现的。每当我在那里拥有该功能时,它实际上不会使代码锁定。它实际上会使读取 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,即使这样,在调用此函数之前也会发生锁定。