2011-10-08 315 views
3

我试图用snprintf将一个整数打印到一个字符串中,以便在来自ARM微控制器的OLED显示器上显示。但是,当我使用%d或%u时,微型锁定并停止执行。 使用%x或%c工作正常,但输出没有多大用处。snprintf在显示%d或%u时崩溃

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

UPDATE

传递值< 10似乎使其工作。

+0

你是否将一个'int'推入堆栈? '%d'大于'%c',所以如果你推一个'char',那么它将与'%c'一起工作,但是会与'%d'一起崩溃。尝试在调用'snprintf'时指定'(int)yourvariable'而不是'yourvariable'。 –

+2

@ todda.speot.is:错误。当传递给'printf'时,'%d'和'%c'都指定了相同的类型:'int'。 –

+0

类型促销!我忘了。 –

回答

2

这实际上证明是我使用的RTOS的堆栈大小问题。我想snprintf调用增加的复杂性是超过极限和崩溃。

感谢所有谁采取了答案这个答案!

0

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

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

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

gcc -mcpu=cortex-m3 ... 
+0

-mcpu已被设置为cortex-m3,并且我同意类型问题。我猜想snprintf存在一些问题,但是对于如此基本的东西在像ARM这样的通用架构上无法正常工作感到惊讶。当然,我在做**错误的事情:P – aliask

0

你有范围的原型吗? snprintf()是一个可变参数函数,调用可变参数可能会涉及到一些技巧来获取函数期望它们的地方的参数。

另外:总是调用可变参数函数时使用正确的类型。 ('%'是snprintf()期望在某处找到的类型,'somewhere'可能甚至取决于类型,任何情况都可以......)在你的情况下:“%X”需要一个unsigned int。通过在函数调用中强制使用参数或使用“unsigned int sweeplow;”将其交给她当定义它时。无论如何,负频率或计数都没有意义。

+0

添加一个原型并没有改变它,并且不幸的是,它们都没有玩过类型。 – aliask

+0

它是否干净地编译,即使使用-Wall和-Wstrict-prototypes? – wildplasser

+0

它与-Wall,而不是-Wstrict_prototypes(在编译代码依赖的库时失败) – aliask

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; 
}; 

此外,检查您的构建日志中的链接警告。

相关问题