3

我正在尝试使用 snprintf 将整数打印到字符串中,以便在 ARM micro 的 OLED 显示器上显示。但是,当我使用 %d 或 %u 时,微锁定并停止执行。使用 %x 或 %c 可以正常工作,但输出用处不大。

什么可能导致这种行为?不幸的是,我无法使用 JTAG 设备进行调试。我正在使用 arm-none-eabi-gcc 进行编译,它都在 maple mini 上运行。

更新

传递值 < 10 似乎使它起作用。

4

4 回答 4

2

这实际上是我使用的 RTOS 的堆栈大小问题。我猜 snprintf 调用的增加的复杂性将其推到了极限并崩溃了。

感谢所有回答这个问题的人!

于 2011-10-10T13:52:24.283 回答
1

传递值 < 10 似乎使它起作用。

这对我来说听起来好像你有一个丢失/不工作的除法例程。printf/sprintf 通常通过连续除以 10 来打印十进制数字。对于小于 10 的数字,除法不是必需的,这可能就是它不起作用的原因。

要检查,请创建一个除以两个变量的函数(除以常数通常被编译器优化为乘法)。例如:

int t()
{
  volatile int a, b; // use volatile to prevent compiler optimizations
  a = 123;
  b = 10;
  return a/b;
};

此外,请检查您的构建日志以获取链接警告。

于 2011-10-10T12:04:54.447 回答
0

你有原型吗?snprintf() 是一个 varargs 函数,调用 varargs 可能涉及一些技巧,以便在函数期望它们的位置获取参数。

另外:在调用可变参数函数时始终使用正确的类型。('%' 后面的那个是 snprintf() 期望在某处找到的类型,'somewhere' 甚至可能取决于类型。任何事情都会发生......)在你的情况下:“%X”需要一个无符号整数。通过在函数调用中强制转换参数或使用“unsigned int sweeplow;”将其交给她。定义它的时候。无论如何,负频率或计数毫无意义。

于 2011-10-08T11:56:12.623 回答
0

这不可能是类型错误,因为%x两者%u都指定了相同的类型。所以它snprintf本身一定是个问题。两者之间唯一的主要区别是%u必须除以整数并计算余数,而%x可以通过移位和掩码来解决。

您的 C 库可能是针对与您使用的不同种类的 ARM 处理器编译的,并且可能使用非法指令来计算商或余数。

确保您正在为 Cortex M3 编译库。例如,

gcc -mcpu=cortex-m3 ...
于 2011-10-08T10:21:03.377 回答