使用 mbed 框架在 STM32 上运行 GMP 的串行 printf

Posted

技术标签:

【中文标题】使用 mbed 框架在 STM32 上运行 GMP 的串行 printf【英文标题】:Serial printf running GMP on STM32 with mbed framework 【发布时间】:2018-10-06 00:41:37 【问题描述】:

对于一个大学项目,我正在实施 RSA-CRT。我使用 mini-gmp,它是 GMP 库的一个子集,用于处理大整数。

该项目的目标是在 STM32F103 微控制器上运行程序,我想将其与 ARM mbed 框架一起使用。

问题是我无法将大整数正确打印到串行控制台进行调试。这是我的代码的最小工作示例:

#include <mbed.h>
#include <mini-gmp.h>

//SETUP
Serial pc(USBTX, USBRX); // enable serial communication, tx, rx

int main()

  pc.baud (115200);
  printf("STARTING\n\r");

  mpz_t n;
  mpz_init_set_ui(n,11242342351435632235235464577);

  mpz_out_str(stdout, 10, n);
  printf("\nFINISHED\n\r");

当使用 PlatformIO 编译并在微控制器上运行时,我在串行控制台中得到了这个:

STARTING
3485947265
FINISHED 

我注意到打印出来的数字总是 10 位数字,以 3 开头,其余数字随 n 的值而变化。所以对我来说它看起来不像是某种溢出。

这里有人可以帮帮我吗?

【问题讨论】:

这个数字需要超过 16 个字节来表示,也许您遇到了翻转问题,因为寄存器不够大? Windows 计算器不允许我输入完整的数字来​​查看它的十六进制表示。 基本上你需要 128 位来存储你传入的数字,而你的 STM32F103 微控制器是一个 32 位处理器。充其量它只能处理 64 位数字。你必须自己处理任何更大的事情。 我认为这就是 GMP 的用途 【参考方案1】:

mpz_init_set_ui() 的原型是

void mpz_init_set_ui (MP_INT *dest_integer, unsigned long int src_ulong);

它需要一个 unsigned long 参数,在这个平台上是 32 位长。 C 常量被截断为 32 位之前它通过to mpz_init_set_ui()

11242342351435632235235464577 mod (2^32) = 3485947265,这就是你得到的。

您应该使用可以使用任意精度参数对其进行初始化的函数,例如mpz_init_set_str()

【讨论】:

正是这个!非常感谢!

以上是关于使用 mbed 框架在 STM32 上运行 GMP 的串行 printf的主要内容,如果未能解决你的问题,请参考以下文章

STM32(在线使用 Mbed)在较高的模拟输入频率下显示延迟

mbed + platformio.org:建议?

ROS+mbed

CAN BUS STM32 Nucleo F429ZI CAN 写入失败

在64位Linux上安装32位gmp大数库

STM32CubeIDE只能刷一次,没有SWD调试