0

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

4

3 回答 3

1

我是 RELIC 工具包的作者之一。当前的 util_printf() 函数用于在 Avrora 模拟器中打印,以进行调试。我很高兴您可以根据您的目的调整代码。附带说明一下,缓冲区大小问题已在工具包的最新版本中得到修复。

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

谢谢!

于 2012-09-17T20:16:45.173 回答
0

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

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

于 2012-07-28T04:06:50.323 回答
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 数字。希望这可以帮助任何使用带有 AVR 的 RELIC 工具包的人。

这会跳过 util_print 调用。

于 2012-08-01T18:03:44.217 回答