3

我正在做一些微控制器编程,我有以下代码:

#define F_CPU 8000000
#define F_ADC (F_CPU / 64.0)
#define T_ADC (1.0/F_ADC)

有没有办法在编译时打印出 T_ADC 的计算值?我试着把它串起来

#define STRINGIFY(s) XSTRINGIFY(s)
#define XSTRINGIFY(s) #s
#pragma message ("T_ADC " STRINGIFY(T_ADC)) 

但这只是给出了宏扩展“(1/(8000000/64))”,而不是实际值。

这是一个微控制器程序,printf在启动时做一个很尴尬。我正在使用 gcc,如果有帮助,我很乐意使用任何非标准的 gcc 功能。

4

3 回答 3

1

正如@mbratch 和@freddie 所说,计算是由编译器完成的,所以你不能简单地使用预处理器指令得到结果。现在想到的最简单的方法是将宏分配给全局常量,然后使用调试器读取常量的值,或者打开可执行文件的二进制映像(您可以从内存映射文件)。

const float temp = T_ADC;

请注意,您必须指定 C 类型,这是必不可少的步骤,因为宏的结果取决于它。

于 2013-09-15T17:31:28.357 回答
0

我在微控制器的预处理器中实现了波特率计算,但调整了整数除法,使其四舍五入(因为截断有更多错误)。然后我在一系列低、中和太多类别中显示了实现的错误,但由于额外繁琐的编码工作,我没有达到 +-XX% *。

它与http://99-bottles-of-beer.net/language-c-c++-preprocessor-115.html 类似,但是:-

  • 做起来很乏味,因为它与以下成正比:-
    • 所需的位数/类别
    • 变量的数量,因为什么都不能共享
  • 相当特定于预处理器
  • 没有任何编译器检查

由于我没有代码,因此练习/乏味留给读者...

* 使用基于缩放整数的计算

于 2014-03-13T21:02:57.767 回答
0

这不完全是您正在寻找的东西,但它会有所帮助。

/* definition to expand macro then apply to pragma message */
#define VALUE_TO_STRING(x) #x
#define VALUE(x) VALUE_TO_STRING(x)
#define VAR_NAME_VALUE(var) #var "="  VALUE(var)

#define F_CPU  8000000
#define F_ADC  (F_CPU / 64.0)
#define T_ADC  (1.0/F_ADC)

#pragma message VAR_NAME_VALUE(T_ADC) /* prints  note: #pragma message: T_ADC=(1.0/(8000000 / 64.0) */

这称为字符串化

编辑:预处理器只进行字符串替换。您可以使用 pragma 消息,然后使用简单的脚本进行计算。继续我上面的评论。

$ gcc a.c 2> out
$ python -c "print `cat out | cut -d = -f2`"
8e-06
于 2013-09-15T02:18:24.457 回答