[英]After setting change_state in class_init function, nothing else works
[英]Rationale for enable/disable function v.s. change_state?
我正在实现一个加速度计的驱动程序,我必须实现启用/禁用低功耗模式等功能。
我可以写:
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)
BTW: boolean_t
不是C.自C99以来,它是内置类型_Bool
或来自stdbool.h
的宏bool
。
更多后缀_t
由POSIX保留用于将来的类型。
这是相当主观的。 我可以分享我的经验,但我不能列出任何正式的消息来源。 例如,MISRA-C不关心程序设计和效率。
根据我的经验,格式为lis2dh12_low_power_change_state(boolean_t enable);
的函数lis2dh12_low_power_change_state(boolean_t enable);
通常是优选的。 你可以减少一个函数来跟踪它,它可以减少代码大小。
但更重要的是,像if-else这样的例子会创建一个分支,导致许多系统上的代码效率降低。 因为这些函数通常只是volatile
寄存器访问的包装器。 并且由于volatile
,编译器可能不一定能够优化掉分支。
此外,调用者可能必须跟踪是否启用或禁用了“the thing”,因此调用者中通常也有一个布尔值。 然后调用者只需将此变量传递给您的驱动程序,而不必编写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
是常量)哪个更干净。
只是为了解决性能问题 - 我无法想象为什么更改功率级别设置的代码上的附加分支声明可能会影响任何事情。 如果您正在敲击功率设置,那么还有其他错误!
实际上,如果更改状态函数可以内联,则任何优化器都会使用常量“透视”调用并在可能的情况下删除分支。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.