【发布时间】:2015-05-10 19:02:30
【问题描述】:
我正在使用小型 UART 设备,并且经常需要切换其运行的波特率。
基本上整个设置归结为
#define FOSC 2000000
#define BAUD 9600
uint8_t rate = (uint8_t) ((FOSC / (16.0 * BAUD)) - 1 + 0.5);
(其中 +0.5 用于对结果进行四舍五入。)
我目前正在使用 gcc 4.8.1 进行编译,-O1。
编译器是否优化了整个演员表,还是我留下了演员表后跟一个常量?这会因不同的-O# 值而有所不同(-O0 除外)? -Os (我最终可能必须编译)呢?
如果重要的话,我正在为Atmel AT90USB647(或datasheet [pdf])开发。
【问题讨论】:
-
嗯?预处理只是字符串替换。它不处理语义级别的任何事情。
-
也就是说:你可以问
uint8_t rate = (uint8_t) (2000000 / (16.0 * 9600)) - 1 + 0.5,把预处理器排除在外。 -
简短的回答,不过——这将成为 gcc4 上的编译时常量,甚至可能使用
-O0,但肯定会使用其他任何东西。 -
@user1320881,我猜 OP 认为强制转换操作有运行时成本?
-
用
-S编译并查看汇编文件.s。