小编par*_*ras的帖子

#define与用于寻址外围设备的枚举

我必须在基于ARM9的微控制器中编程外设寄存器.

例如,对于USART,我将相关的内存地址存储在enum:

enum USART
{
    US_BASE = (int) 0xFFFC4000,
    US_BRGR = US_BASE + 0x16,
    //...
};
Run Code Online (Sandbox Code Playgroud)

然后,我在函数中使用指针来初始化寄存器:

void init_usart (void)
{
    vuint* pBRGR = (vuint*) US_BRGR;
    *pBRGR = 0x030C;
    //...
}
Run Code Online (Sandbox Code Playgroud)

但我的老师说我最好使用#defines,例如:

#define US_BASE (0xFFFC4000)
#define US_BRGR (US_BASE + 0x16)
#define pBRGR   ((vuint*) US_BRGR)

void init_usart (void)
{
    *pBRGR = 0x030C;
}
Run Code Online (Sandbox Code Playgroud)

他说,就像这样,你没有在堆栈中分配指针的开销.

就个人而言,我不太喜欢#define,也不喜欢其他预处理器指令.所以问题是,在这种特殊情况下,#define真的值得使用而不是enums和堆栈分配的指针吗?


相关问题:想在基于ARM9的芯片中配置特定的外设寄存器

c embedded enums arm c-preprocessor

6
推荐指数
2
解决办法
1840
查看次数

如何在元素方面对两个列表求和

我想逐行解析一个文件,每个文件包含两个整数,然后将这些值加在两个不同的变量中.我天真的做法是这样的:

my $i = 0;
my $j = 0;
foreach my $line (<INFILE>)
{
    ($i, $j) += ($line =~ /(\d+)\t(\d+)/);
}
Run Code Online (Sandbox Code Playgroud)

但它会产生以下警告:

在void上下文中无用的私有变量

暗示使用+ =运算符触发标量中左侧的评估而不是列表上下文(如果我在这一点上错了,请纠正我).

是否可以优雅地(可能在一行中)实现这一点而不诉诸数组或中间变量?


相关问题:如何在Perl中以元素方式对数组求和?

perl list

3
推荐指数
1
解决办法
299
查看次数

标签 统计

arm ×1

c ×1

c-preprocessor ×1

embedded ×1

enums ×1

list ×1

perl ×1