我正在为加速度计实现一个驱动程序,我必须实现启用/禁用低功耗模式等功能。
我可以写:
lis2dh12_low_power_enable();
lis2dh12_low_power_disable();
或:
lis2dh12_low_power_change_state(boolean_t enable);
前一种解决方案通常更具可读性,但它可能会创建额外的代码,例如在此特定情况下:
void foo(boolean_t status) {
if (status)
lis2dh12_low_power_enable();
else
lis2dh12_low_power_disable();
}
是否有任何理由(类似MISRA的规则(来实现这种典型的启用/禁用功能?
我会按原样实现lis2dh12_low_power_change_state(boolean_t enable);
并将其他两个定义为围绕它的宏,例如:
#define lis2dh12_low_power_enable() lis2dh12_low_power_change_state(1)
顺便说一句:boolean_t
不是C。自 C99 以来,它要么是内置类型_Bool
,要么是来自stdbool.h
的宏bool
。
POSIX 为将来的类型保留了更多的后缀_t
。
这是相当主观的。我可以分享我的经验,但我不能列出任何正式来源。例如,MISRA-C不关心程序设计和效率。
根据我的经验,通常首选格式lis2dh12_low_power_change_state(boolean_t enable);
的功能。您可以少跟踪一个函数,并且它会稍微减小代码大小。
但更重要的是,像你的 if-else 示例这样的情况会创建一个分支,这会导致许多系统上的代码效率降低。由于像这样的函数通常只是寄存器访问volatile
包装器。而且由于volatile
,编译器不一定能够优化分支。
此外,调用方可能必须跟踪"事物"是启用还是禁用,因此调用方中通常也有一个布尔值。然后,调用方只需将此变量传递给驱动程序即可更方便,而不必编写 if-else。
如果您不提供lis2dh12_low_power_change_state(boolean_t enable);
则很有可能将其实现(可能重复!(作为帮助程序或(更糟糕的(在整个表单应用程序中重复代码:
if (status)
lis2dh12_low_power_enable();
else
lis2dh12_low_power_disable();
所以_enable()
\_disable()
版本是对DRY(不要重复自己(的不可避免的威胁。
您始终可以编写代码:
lis2dh12_low_power_change_state(B_TRUE);
或
lis2dh12_low_power_change_state(B_FALSE);
(其中B_TRUE
和B_FALSE
是常量(哪个更干净。
只是为了驳回性能问题 - 我无法想象为什么更改功率级别设置的代码上的附加分支语句会影响任何事情。如果您正在敲打电源设置,还有其他问题!
事实上,如果更改状态函数可以是内联的,那么任何优化器都会使用常量"透视"调用,并在可能的情况下删除分支。