【发布时间】:2011-04-24 11:42:06
【问题描述】:
* 更新 *
这是我发现的。每当我在那里拥有该功能时,它实际上不会使代码锁定。它实际上会使读取 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,即使这样,在调用此函数之前也会发生锁定。
【问题讨论】:
-
你是说即使这个函数没有执行一次也会发生锁定?
-
是的,就是这样!
-
哦 - 这是一个非常有趣的方面,直到现在我才知道。当您停留在读取 I2C RTC 时,堆栈跟踪是否显示任何有趣的东西?你在使用多任务处理吗?
-
@jramirez,如果你的答案是正确的,请接受它;)
-
@Colin 我知道,但它说“你可以在 2 天内接受你自己的答案”我想我将不得不等待抱歉