Как написать заголовочные файлы для устройств - PullRequest
3 голосов
/ 19 октября 2010

Я новичок во встроенном программировании, прохожу курсы по нему. И работает с ATSTK600.

Я ищу справку о том, «как писать заголовочные файлы для устройств». Что ж, если быть точным, то какой стандарт должен соблюдаться при написании заголовочных файлов, например, именования регистров и т. Д. (Как создать .h & include, насколько я знаю).

Недавно я получил задание на создание файла заголовка, который я сделал, находился на правильном пути с некоторыми ошибками, которые нужно исправить перед повторной отправкой. При определении USART (допустил ошибку, поскольку это очень ново для меня)

#define USART_RX $0032 [который профессор сказал неправильно, потому что знак $ #define не будет работать]. Так верно ли следующее определение?

#define USART0_RX  32
#define USART0_UDRE  34
#define USART0_TX  36

Другое дело, я определил порты следующим образом, это правильное соглашение об именах?

#define I_PINS_PORTA  0x20
#define DD_PORTA  0x21
#define DATA_PORTA  0x22

Ну, где-то я прочитал правильное соглашение об именах: #define BASE_ADDR_PORTA 0x20, но что тогда следует использовать для DD_PORTA & I_PINS_PORTA?

Я искал некоторую помощь по этому вопросу через Интернет и наткнулся на этот форум.

P.S. AM использует C в качестве языка программирования.

Ответы [ 2 ]

2 голосов
/ 19 октября 2010

Одно из соглашений, которое вы, по-видимому, соблюдали для UART, но не для PORTA, заключается в том, чтобы поставить имя системы в начале имени. Это облегчает обнаружение в коде. Так что вместо

#define DD_PORTA 0x21

у вас может быть

#define PORTA_DD 0x21

Использование базовых адресов для устройств, которые охватывают область регистров, также является хорошей идеей. Для этого вам понадобится:

#define PORTA_BASE 0x20

#define PORT_I       0x00
#define PORT_DD      0x01
#define PORT_DATA    0x02

#define PORTA_I     (PORTA_BASE + PORT_I)
#define PORTA_DD    (PORTA_BASE + PORT_DD)
#define PORTA_DATA  (PORTA_BASE + PORT_DATA)

Это приводит к тому, что вы набираете больше текста, но это поможет вам избежать ошибок позже.

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

Что касается выравнивания байтов - я не уверен, что вы спрашиваете об этом. Выравнивание адреса в памяти связано с тем, что оставшаяся часть адреса делится на размер выравнивания (в байтах), равный 0. Многие системы могут либо загружать и хранить только по адресам, равномерно делимым на 2, 4 или 8 (или делать это). гораздо быстрее по адресам, которые отвечают требованию). Кроме того, производительность кэша ЦП зависит от выравнивания (наличие некоторой необходимой памяти в кеше только наполовину может быть таким же плохим, как ее отсутствие).

0 голосов
/ 22 октября 2010

Это похоже на вопрос, который возник пару дней назад в # define и enums для адресации периферийных устройств . Я думаю, что принятый ответ - лучший способ определения интерфейсов для встроенных устройств. Я также рекомендую прочитать столбец Дэн Сакс , указанный в этом ответе.

...