Побитовый оператор над регистрами на MSP430 без разыменования - PullRequest
1 голос
/ 07 августа 2020

Я использую MSP430G2553, и у меня есть вспомогательный код, определенный в заголовках, которые я использую (msp430g2553.h). Так, например, если я хочу установить направление вывода GPIO 0 порта 1, я могу написать

P1DIR |= BIT0;

Из любопытства я посмотрел, как определяется P1DIR. И я нашел

SFR_8BIT(P1DIR);

, где SFR_8BIT определяется как

#define SFR_8BIT(address)   extern volatile unsigned char address

Итак, мы получаем

extern volatile unsigned char P1DIR

Значение P1DIR добавляется во время компоновки и определяется as (в скрипте компоновщика):

P1DIR              = 0x0022;

Итак, наконец, мы получаем

extern volatile unsigned char 0x0022;

Итак, мне кажется, что P1DIR - это указатель, а это означает, что нам нужно разыменовать его . Но во всех документах, которые я смотрю, они выполняют побитовые операторы прямо в P1DIR вместо * P1DIR. Как такое возможно?

Ответы [ 2 ]

1 голос
/ 07 августа 2020

This ...

extern volatile unsigned char P1DIR

... объявляет P1DIR как volatile unsigned char, а не указатель на него. Нет проблем с выполнением побитовых операций с таким объектом.

Я также склонен думать, что вы неправильно понимаете сценарий компоновщика. Вы говорите:

Значение P1DIR добавляется во время связывания

, но хотя я не знаю конкретного языка сценария компоновщика, о котором идет речь, это ссылка язык. Конечно, тогда, если скрипт содержит ...

P1DIR              = 0x0022;

... тогда это определяет адрес, соответствующий этому символу, а не его значение на C -языке. смысл. Это не имеет ничего общего с типом хранимого здесь значения. Связывание адресов с символами - вот в чем суть связывания.

Предположительно, тогда 0x0022 - это адрес порта ввода-вывода. Когда программа считывает значение P1DIR, она считывает значение из этого адреса и, следовательно, из порта, который предположительно предоставляет значение регистра состояния или аналогичного. Он не читает сам адрес.

0 голосов
/ 07 августа 2020

Компилятор видит P1DIR как переменную, как вы правильно проследили, он видит P1DIR следующим образом:

extern volatile unsigned char P1DIR

Это переменная, адрес которой определен в другом месте. В этом случае, вероятно, в стандартной библиотеке, которая будет использоваться на этапе компоновки. На этапе связывания адреса переменных разрешаются, и P1DIR берется из того места, где он был определен как 0x22. Переменная такого типа должна быть по указанному c адресу, так как она должна быть по указанному адресу для этого порта. Вы можете проверить адрес каждого порта в документации MSP430 (там указано, что P1DIR находится на 0x22)

...