ATMega2560上的vsnprintf

时间:2012-07-26 18:35:08

标签: avr avr-gcc atmega printf

我正在使用工具包在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语句输出到控制台。

3 个答案:

答案 0 :(得分:1)

我是RELIC工具包的作者之一。当前的util_printf()函数用于在Avrora仿真器内部进行打印,以进行调试。我很高兴你可以根据你的目的调整代码。另请注意,缓冲区大小问题已在最新版本的工具包中得到修复。

让我知道你的图书馆还有其他问题。您可以亲自与我联系或直接写给讨论组。

谢谢!

答案 1 :(得分:0)

vsnprintf将它的输出存储在给定的缓冲区(在这种情况下是指针变量的地址点),为了让它在控制台上显示(通过UART),你必须使用printf发送缓冲区(尝试添加printf) (“%s”,指针)在vsnprintf之后),如果你正在使用avr-libc,不要忘记在调用printf函数之前先初始化std流

哦,顺便说一下你的代码容易受到缓冲区溢出攻击,缓冲区[64 + 1]意味着你的缓冲区大小只有65字节,vsnprintf(指针,128,格式,列表);表示应用程序定义的最大缓冲区为128字节,尝试将其更改为低于65字节以避免溢出

答案 2 :(得分:0)

好吧,所以我找到了一个解决方法,将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调用。