【发布时间】:2013-12-24 13:42:21
【问题描述】:
在我的微控制器项目中,我有一个更新 CRC 的功能(来自 avr-libc 的_crc_ibutton_update)。
我正在实现的协议计算数据包的校验和,包括其初始同步字节,我想将同步字节的 CRC 值保持为编译时间常数,但我不喜欢手动预先计算它。
有没有办法强制编译器(GCC 4.3.3)在编译时计算值并只发出一条加载常量指令?
库中的函数仅包含内联汇编程序,因此我尝试在参数为常量时使用 C 实现(使用 __builtin_constant_p() 确定)。代码只是正常编译。
CRC函数并不太复杂,只包含一个迭代次数恒定的for循环,一个分支和几个位操作。
需要说明的是,保存这 8 个汇编指令绝对不是关键,但找到某种解决方案对于我的强迫症来说将是一份不错的圣诞礼物 :-)
【问题讨论】:
-
C++ 和嵌入式编程是朋友多于敌人的另一个原因。
-
你是否制作了你为
static inline目的编写的C函数? -
"强制对 C 函数进行编译时评估?" - 我就是这样做的:
gcc -O3 -c foo.c
标签: c gcc constants compiler-optimization