首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解从北欧半导体库编写预处理器指令的方法

了解从北欧半导体库编写预处理器指令的方法
EN

Stack Overflow用户
提问于 2021-05-22 00:52:52
回答 1查看 47关注 0票数 0

我正在努力理解北欧的嵌入式系统定时器库。我发现它们定义预处理器指令的方式是我不理解的,也是我以前从未见过的:

代码语言:javascript
复制
/** @brief The configuration structure of the timer driver instance. */
typedef struct
{
    nrf_timer_frequency_t frequency;          ///< Frequency. 
    nrf_timer_mode_t      mode;               ///< Mode of operation.
    nrf_timer_bit_width_t bit_width;          ///< Bit width.
    uint8_t               interrupt_priority; ///< Interrupt priority.
    void *                p_context;          ///< Context passed to interrupt handler.
} nrfx_timer_config_t; 

/** @brief Timer driver instance default configuration. */
#define NRFX_TIMER_DEFAULT_CONFIG                                                    \
{                                                                                    \
    .frequency          = (nrf_timer_frequency_t)NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY,\ 
    .mode               = (nrf_timer_mode_t)NRFX_TIMER_DEFAULT_CONFIG_MODE,          \
    .bit_width          = (nrf_timer_bit_width_t)NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH,\
    .interrupt_priority = NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY,                    \
    .p_context          = NULL                                                       \
}

我不理解的是他们的预处理器指令#define NRFX_TIMER_DEFAULT_CONFIG中的符号。点运算符用于访问结构成员,但是点左边没有任何内容,那么编译器如何知道要访问哪个结构呢?我希望是这样的:

代码语言:javascript
复制
nrfx_timer_config_t.frequency = NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY, \

但是没有对nrfx_timer_config_t结构的引用。我猜(nrf_timer_frequency_t)是在以某种方式表示成员资格,但我不明白它是如何做到这一点的,因为.interrupt_priority.p_context似乎根本没有任何对nrfx_timer_config_t结构的引用。编译器如何知道这些值来自哪里以及如何赋值?

此外,我不确定是否需要此上下文,但nrf_timer_frequency_tnrf_timer_mode_tnrf_timer_bit_width_t都是枚举。

如果能帮助我们理解这里发生的事情,我们将不胜感激,谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-05-22 01:15:13

它与宏语法或预处理器指令无关。它是一种,自ISO C99以来一直是C语言的一部分。

在本例中,用例将实例化一个nrfx_timer_config_t类型的对象,并使用NRFX_TIMER_DEFAULT_CONFIG对其进行初始化,如下所示:

代码语言:javascript
复制
nrfx_timer_config_t timer1 = NRFX_TIMER_DEFAULT_CONFIG ;

它扩展为:

代码语言:javascript
复制
nrfx_timer_config_t timer1 = {
    .frequency          = (nrf_timer_frequency_t)NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY,
    .mode               = (nrf_timer_mode_t)NRFX_TIMER_DEFAULT_CONFIG_MODE,
    .bit_width          = (nrf_timer_bit_width_t)NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH,
    .interrupt_priority = NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY,
    .p_context          = NULL
};

(忽略NULL和任何其他宏也将被展开的事实)。

关于:

我希望是这样的:

nrfx_timer_config_t.frequency = NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY,\

..。点运算符(.)的左侧不能是类型名称,它必须是对象。宏用于初始化这样的对象(在=的lhs上)

关于:

我猜(nrf_timer_frequency_t)以某种方式表示成员资格,

不,这就是它看起来的样子,一个常规的类型转换。如果为NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY、枚举nrf_timer_frequency_t的枚举符号(或扩展为1的宏),则不需要强制转换。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67640975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档