如何将结构成员作为参数传递给函数? - C

How to pass a struct member as an argument to a function? − C

我正在尝试将结构的成员 TRISCbits.TRISC2 传递给函数。

microcontroller.h:

typedef union {
    struct {
        unsigned TRISC0                 :1;
        unsigned TRISC1                 :1;
        unsigned TRISC2                 :1;
    };
} TRISCbits_t;
extern volatile TRISCbits_t TRISCbits @ 0x014;

我想做什么:

user.c:

static void pwm5Init(volatile unsigned __bit* trisBit){
    *trisBit = 0;
}

我想将 TRISC2 位作为参数传递:pwm5Init(&TRISCbits.TRISC2)。 我希望我的函数 pwm5Init 修改地址 0x14+3 位处的真实 TRISC2 位 - 而不是本地副本 -

指针有点不能指向,你会怎么做?有哪些好的做法?

我想不出比 linux kernel

更好的例子了

这里是修改单个位的代码片段

unsigned tmp;
// some code here
tmp = pmu_raw_readl(EXYNOS_L2_OPTION(0));
tmp &= ~EXYNOS_L2_USE_RETENTION;
pmu_raw_writel(tmp, EXYNOS_L2_OPTION(0));

pattern是从内存中读一个字,然后修改位,再写一个字。 我相信内存是在字节级别上寻址的。在某些架构上,甚至在单词级别上。所以用 "native" 指令修改单个位是不可能的。

也许你的例子并没有真正反映你想做的事情,但给出了:

static unsigned pwm5Init()
{
    return 0 ;
}

然后:

TRISCbits.TRISC2 = pwm5Init() ;

将实现您为 不可能 提出的确切结果:

static void pwm5Init(volatile unsigned __bit* trisBit){
    *trisBit = 0;
}

也就是"good practice"。如果这没有达到您的要求,那么您可能需要一个更现实的例子?

如果您可能需要当前值,则:

static unsigned pwm5Init( unsigned bit )
{
    // flip the bit (for example)
    return ~bit & 1 ;
}

然后:

TRISCbits.TRISC2 = pwm5Init( TRISCbits.TRISC2 ) ;