Я относительно новичок в работе с чипами PI C, так что это может быть вопрос новичка, но я пытаюсь написать файл заголовка, содержащий, среди прочего, маски TRIS / ODC / INIT для всех из портов ввода / вывода.
На печатной плате, в которую встроен этот чип, любой данный компонент может использовать выводы из нескольких портов, и, вероятно, существует около дюжины отдельных компонентов, которые требуют подробного комментирования. Например, для взаимодействия с конкретным модулем SPI AD C используются контакты из портов A, D и F.
Мне кажется, что удобным для читателя способом написания этого будет организация файл за компонентом, так что читатель может сразу увидеть, какие контакты используются, сконфигурированы ли они как входы или выходы и как они инициализируются.
Например, отображаются только данные маски TRIS Вот фрагмент кода для конкретного модуля AD C, который я использую для демонстрации того, о чем я говорю:
#define PORTD_TRIS_MASK 0x00
#define PORTF_TRIS_MASK 0x00
// ...
// lots of hardware configuration stuff goes here
// ...
// ANALOG INPUT - THERMOCOUPLE 1
// Thermocouple ADC chip MAX31856 DNP communicates over SPI
// Accepts any type of thermocouple
// TC1_CS pulled high
// TC1_DRDY pulled high
#define TC1_MOSI LATAbits.LATA14
#define TC1_MISO PORTDbits.RD10
#define TC1_SCK LATDbits.LATD11
#define TC1_CS LATFbits.LATF6
#define TC1_DRDY PORTFbits.RF7
#define TC1_MISO_SHIFT 1<<10
#define TC1_DRDY_SHIFT 1<<7
#define PORTD_TRIS_MASK ( PORTD_TRIS_MASK | TC1_MISO_SHIFT )
#define PORTF_TRIS_MASK ( PORTF_TRIS_MASK | TC1_DRDY_SHIFT )
Приведенный выше код не выдает никаких ошибок, но выдает предупреждение :
HardwareProfile.h:1173:0: warning: "PORTD_TRIS_MASK" redefined
HardwareProfile.h:1029:0: note: this is the location of the previous definition
HardwareProfile.h:1174:0: warning: "PORTF_TRIS_MASK" redefined
HardwareProfile.h:1095:0: note: this is the location of the previous definition
Тот факт, что компилятор жалуется на это, наводит меня на мысль, что такое поведение может и не поощряться, но ничего из этого мне не кажется проблематичным c. Я что-то упустил, или это разумный способ организовать код так, чтобы детали конфигурации выводов оставались рядом с их определениями?
В качестве альтернативы, есть более традиционный способ выполнения sh того, чего я хочу достичь sh Что касается поддержания читабельности, которая более широко используется или приемлема?
Обновление:
Возможно, я не был достаточно ясен в своем первоначальном посте. Это структурировано таким образом, потому что в заголовочном файле есть около десятка таких блоков кода. Предположим, что существует ровно 13 таких блоков кода, любая конкретная маска будет первоначально определена как 0x00 и переопределена 13 раз, идея состоит в том, что каждое переопределение добавляет информацию о конфигурации, относящуюся к конкретному блоку.
Обновление:
В ответ на вопрос о том, как используются эти макросы, они просто используются для одновременной настройки всех выводов в порту. На этом PIC24 каждый порт имеет 16 контактов, каждый из которых имеет регистр TRIS (управление направлением данных), регистр OD C (управление открытым стоком) и регистр LAT (защелка), который, если он настроен как выход, потребуется начальное значение. Обычно, запись в один бит за шестнадцать раз не рекомендуется в пользу записи всего порта один раз. Например, рассмотрим упрощенный случай, когда вместо шестнадцати используются четыре регистра. Вместо того, чтобы писать это:
// In source file
TRISABITS.TRISA0 = 1;
TRISABITS.TRISA1 = 1;
TRISABITS.TRISA2 = 0;
TRISABITS.TRISA3 = 0;
Обычно (насколько я понимаю) писать это:
// In header file
#define BIT_0_SHIFT ( 1<<0 )
#define BIT_1_SHIFT ( 1<<1 )
#define BIT_2_SHIFT ( 0<<2 )
#define BIT_3_SHIFT ( 0<<3 )
#define TRISA_MASK ( BIT_0_SHIFT | BIT_1_SHIFT | BIT_2_SHIFT | BIT_3_SHIFT )
// In source file
TRISA = TRISA_MASK;
Что касается другого вопроса о читабельности, мой аргумент в пользу этой структуры то, что порты организованы на этом чипе, не имеет физического смысла. Пины на любом конкретном порту не обязательно расположены рядом друг с другом или по порядку, и никакое отдельное устройство (например, внешний модуль SPI) не ограничено одним портом. Организация файла заголовка по порту означает, что читателю необходимо прокрутить весь файл заголовка, чтобы проверить конфигурацию одного устройства, а организация файла по устройству позволяет четко видеть определения и конфигурации всего устройства на одном экране.