![](/img/trans.png)
[英]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.