vsnprintf на ATMega2560

Я использую набор инструментов для криптографии на эллиптических кривых на ATMega2560. При попытке использовать функции печати в наборе инструментов я получаю пустую строку. Я знаю, что функции печати работают, потому что версия x86 печатает переменные без проблем. У меня нет опыта работы с ATMega, и я хотел бы получить любую помощь в этом вопросе. Код печати приведен ниже.

Код для печати большого числа (сам он вызывает util_print)

void bn_print(bn_t a) {
int i;

if (a->sign == BN_NEG) {
    util_print("-");
}
if (a->used == 0) {
    util_print("0\n");
} else {
#if WORD == 64
    util_print("%lX", (unsigned long int)a->dp[a->used - 1]);
    for (i = a->used - 2; i >= 0; i--) {
        util_print("%.*lX", (int)(2 * (BN_DIGIT / 8)),
                (unsigned long int)a->dp[i]);
    }
#else
    util_print("%llX", (unsigned long long int)a->dp[a->used - 1]);
    for (i = a->used - 2; i >= 0; i--) {
        util_print("%.*llX", (int)(2 * (BN_DIGIT / 8)),
                (unsigned long long int)a->dp[i]);
    }
#endif
    util_print("\n");
}
}

Код для фактической печати большой числовой переменной:

static char buffer[64 + 1];
void util_printf(char *format, ...) {
#ifndef QUIET
#if ARCH == AVR
char *pointer = &buffer[1];
va_list list;
va_start(list, format);
vsnprintf(pointer, 128, format, list);
buffer[0] = (unsigned char)2;
va_end(list);
#elif ARCH == MSP
va_list list;
va_start(list, format);
vprintf(format, list);
va_end(list);
#else
va_list list;
va_start(list, format);
vprintf(format, list);
fflush(stdout);
va_end(list);
#endif
#endif
}

редактировать: у меня есть инициализированный UART, и я могу выводить отчеты printf на консоль.


person carbon    schedule 26.07.2012    source источник


Ответы (3)


Я один из авторов инструментария RELIC. Текущая функция util_printf() используется для печати внутри симулятора Avrora в целях отладки. Я рад, что вы смогли адаптировать код для своих целей. Кстати, проблема с размером буфера уже была решена в более поздних версиях инструментария.

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

Благодарю вас!

person dfaranha    schedule 17.09.2012

vsnprintf сохраняет свой вывод в заданном буфере (который в данном случае является точкой адреса с помощью переменной указателя), чтобы он отображался на консоли (через UART), вы должны отправить свой буфер с помощью printf (попробуйте добавить printf("% s", указатель) после vsnprintf), если вы используете avr-libc, не забудьте сначала инициализировать поток std, прежде чем вызывать функцию printf

о, кстати, ваш код уязвим для атаки переполнения буфера, buffer[64 + 1] означает, что размер вашего буфера составляет всего 65 байт, vsnprintf(pointer, 128, format, list); означает, что максимальный буфер, определенный вашим приложением, составляет 128 байт, попробуйте изменить его ниже 65 байт, чтобы избежать переполнения

person kuriel    schedule 28.07.2012

Итак, я нашел обходной путь для вывода чисел bn в стандартный вывод на ATMega2560. Инструментарий поставляется с функцией, которая записывает переменную в строку (bn_write_str). Поэтому я реализовал свою собственную функцию печати как таковую:

void print_bn(bn_t a)
{
    char print[BN_SIZE]; // max precision of a bn number
    int bi = bn_bits(a); // get the number of bits of the number
    bn_write_str(print, bi, a, 16) // 16 indicates the radix (hexadecimal)
    printf("%s\n"), print);
}

Эта функция напечатает число bn в шестнадцатеричном формате. Надеюсь, это поможет любому, кто использует набор инструментов RELIC с AVR.

Это пропускает вызовы util_print.

person carbon    schedule 01.08.2012