* 更新 *
这是我发现的。每当我在那里有那个功能时,它实际上不会使代码锁定。它实际上会使读取 RTC I²C 函数执行起来非常慢,但代码仍然可以正常运行,但每次读取 RTC 时我都必须等待很长时间才能通过。
所以 RTC 有一个警报中断,这触发了 ISR 内部的其他 I²C 交互,所以看起来它试图同时进行两个 I²C 通信,因此减慢了进程。我删除了 ISR 中的功能,现在可以使用了。我会继续调查。
我在使用 IAR 5.40 对 STM32F103 微 Controller 进行编程时遇到了这个问题。我有这个功能,如果我尝试 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,即使在调用此函数之前锁定也会发生。
最佳答案
char bTmpSms[3]
只有“99”的空间。如果您的 bSmsIndex 为 100 或更大,您将尝试写入不属于您的内存。
更新后编辑
我在本地机器上没有对 itoa
的引用,但我找到了这个 ( http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/ )。根据该引用资料,目标数组对于任何可能的值都必须足够长。检查您的文档:您的特定 itoa
可能不同。
或者使用sprintf
、snprintf
,或者标准描述的一些函数。
关于c - STM32 printf 和 RTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3917827/