Я использую 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 добавляется во время компоновки и определяется как (в скрипте компоновщика):

P1DIR              = 0x0022;

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

extern volatile unsigned char 0x0022;

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

1
user2251965 7 Авг 2020 в 07:47

2 ответа

Лучший ответ

Этот ...

extern volatile unsigned char P1DIR

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

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

Значение P1DIR добавляется во время компоновки.

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

P1DIR              = 0x0022;

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

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

1
John Bollinger 7 Авг 2020 в 05:37

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

extern volatile unsigned char P1DIR

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

0
Pablo Yaggi 7 Авг 2020 в 05:12