c - STM32 printf 和 RTC

标签 c arm printf iar stm32

* 更新 *

这是我发现的。每当我在那里有那个功能时,它实际上不会使代码锁定。它实际上会使读取 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 可能不同。

或者使用sprintfsnprintf,或者标准描述的一些函数。

关于c - STM32 printf 和 RTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3917827/

相关文章:

基于 ARM 的 mySQL C 连接器

c - printf语句问题

c - 如何在c中在不同屏幕上显示输出?

c - 使用 lldb 打印变量的内容

gcc - ARM Cortex M4 SVC_Handler "UsageFault"

android - 在android系统上测试屏幕

c - 我该如何开始解决这个问题并修复我的代码?

c - 解释指针和 sizeof 结构的不同值

c - Pthreads、fread() 和 printf() : Getting random D4's in my string

c - printf 是如何工作的?