Сбой snprintf при отображении%d или%u

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

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

ОБНОВИТЬ

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

gcc -mcpu=cortex-m3 ...
Другие вопросы по тегам