Как передать член структуры в качестве аргумента функции? - C - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь передать элемент 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 модифицировала действительный бит TRISC2 по адресу 0x14 + 3 бит - не локальная копия -

Поскольку вы не можете сделать указатель немного, как бы вы это сделали? Каковы хорошие практики?

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Возможно, ваш пример не совсем отражает то, что вы будете sh делать, но дано:

static unsigned pwm5Init()
{
    return 0 ;
}

Тогда:

TRISCbits.TRISC2 = pwm5Init() ;

Достигнем именно того результата, который вы предлагаете ваше невозможно :

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

Это "хорошая практика". Если это не дает того, о чем вы просите, то вам нужен более реалистичный пример c, возможно?

В случае, когда вам может понадобиться текущее значение, тогда:

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

затем:

TRISCbits.TRISC2 = pwm5Init( TRISCbits.TRISC2 ) ;
1 голос
/ 12 марта 2020

Я не могу представить лучшего примера, чем linux ядро ​​

Вот фрагмент кода, как изменить один бит

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));

Скороговорка читается слово из памяти, затем измените бит, затем напишите слово. Я считаю, что память адресована на уровне байтов. На некоторых архитектурах даже на уровне слов. Поэтому изменение одного бита с помощью «родной» инструкции невозможно.

...