Сбой snprintf при отображении% d или% u - PullRequest
3 голосов
/ 08 октября 2011

Я пытаюсь напечатать целое число в строку с помощью snprintf для отображения на OLED-дисплее с ARM micro. Однако, когда я использую% d или% u, микро блокируется и останавливается. Использование% x или% c работает нормально, но вывод не слишком полезен.

Что может вызвать такое поведение? К сожалению, у меня нет доступа к устройству JTAG для отладки. Я использую arm-none-eabi-gcc для компиляции, и все это работает на maple mini.

UPDATE

Передача значений <10, кажется, заставляет его работать. </p>

Ответы [ 4 ]

2 голосов
/ 10 октября 2011

Это оказалось проблемой размера стека с RTOS, которую я использовал. Я предполагаю, что дополнительная сложность вызова snprintf подталкивала его к превышению предела и вылетала.

Спасибо всем, кто взломал ответ на этот вопрос!

1 голос
/ 10 октября 2011

Передача значений <10, кажется, заставляет его работать. </p>

Для меня это звучит так, как будто у вас есть пропущенная / нерабочая процедура деления. printf / sprintf обычно печатает десятичные числа, последовательно разделяя их на 10. Для чисел меньше 10 деление не требуется, и, вероятно, поэтому оно не работает.

Для проверки создайте функцию, которая делит две переменные (деление на константу обычно оптимизируется для умножения компилятором). E.g.:

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

Кроме того, проверьте журнал сборки на наличие предупреждений о ссылках.

0 голосов
/ 08 октября 2011

У вас есть прототип по объему?snprintf () - это функция varargs, и вызов varargs может потребовать некоторой хитрости для получения аргументов в том месте, где функция ожидает их.

Также: всегда использует правильные типы при вызовефункция varargs.(тот, что после «%» - это тип, который snprintf () ожидает найти где-то, «где-то» может даже зависеть от типа. Что-нибудь идет ...) в вашем случае: «% X» ожидает беззнаковое целое.Передайте это ей, либо приведя параметр в вызов функции, либо используя "unsigned int sweeplow;"при определении этого.Отрицательные частоты или значения в любом случае не имеют смысла.

0 голосов
/ 08 октября 2011

Это не может быть ошибкой типа, поскольку %x и %u оба указывают одинаковые типы. Так что это должно быть проблемой в самом snprintf. Единственное существенное различие между ними состоит в том, что %u должен делить целые числа и вычислять остаток, тогда как %x может обходиться с помощью сдвигов и масок.

Возможно, ваша библиотека C была скомпилирована для процессора ARM, отличного от используемого вами, и, возможно, она использует недопустимую инструкцию для вычисления частного или остатка.

Убедитесь, что вы компилируете свою библиотеку для Cortex M3. Например.,

gcc -mcpu=cortex-m3 ...
...