我正在寻找有关嵌入式软件编码风格的答案。我的问题是我需要创建一个抽象层来处理低杠杆寄存器操作。
有两种可能的方法,一种是基于#define的,另一种是基于函数的。
在第一种方法中,我正在创建简单的函数,这些函数将处理寄存器操作。在此示例中,我将一个微控制器端口设置为低状态。
static void breakLockNr_3()
{
LATDbits.RD2 = 0;
}
在第二种方法中,我可以使用#defines定义相同的操作:
文件开头:
#define BREAK_LOCK_NR_3 LATDbits.RD2
#define BREAK_LOCK_NR_3_LOW 0
稍后在代码中:
BREAK_LOCK_NR_3 = BREAK_LOCK_NR_3_LOW
您认为哪种方法更清晰易用,并且对代码清除程序,速度和内存优化更有效?
答案 0 :(得分:2)
如果将编译器与正确的优化配合使用,则很有可能该函数将转换为内联函数。在这种情况下,在速度或文本段空间方面都不会影响性能。尝试看看编译器是否正在对此进行优化。否则,您可以将函数显式定义为内联。
是否适合使用函数或宏取决于当前的应用程序以及其他一些设计决策。通常,与宏相比,函数将更易于维护。因此,应谨慎使用宏。
答案 1 :(得分:0)
如果您想比较,您的宏应该类似于:
#define BREAK_LOCK_NB_3() (LATDbits.RD2 = 0)
否则,抽象级别是不同的,因为在第二个示例中,您并不是真正地抽象硬件。
我同意关于两种情况下的性能相同的说法。
然而,更重要的是您应该关注的是处理寄存器的方法。通常,您会设置或清除一位而不是整个寄存器,例如使用掩码等。
答案 2 :(得分:0)
如先前的回答所示,现在认为尽可能多地利用C的类型系统是一种好习惯。因此,一般来说,一切都带有类型>预处理程序宏。在您的情况下,我希望另外用“ inline”注释的功能。我推荐以下有关主题的最新链接:link1 link2 link3
答案 3 :(得分:-2)
第二种方法比较可取,因为与函数执行相比,这种方法花费的时间更少(第一种方法),因为它将在预处理时删除具有实际值的宏。它将使代码易于理解。