Я только начал делать C (из Java). Я пытаюсь понять, что подход языка к условному основанию зависит от имени определения.Условные утверждения, основанные на имени # define
например. У меня есть огромный заголовочный файл, который я не могу (не должен) редактировать с большим количеством определений.
#define GPIO_OTYPER_OT_0 ((uint32_t)0x00000001)
#define GPIO_OTYPER_OT_1 ((uint32_t)0x00000002)
#define GPIO_OTYPER_OT_2 ((uint32_t)0x00000004)
#define GPIO_OTYPER_OT_3 ((uint32_t)0x00000008)
#define GPIO_OTYPER_OT_4 ((uint32_t)0x00000010)
#define GPIO_OTYPER_OT_5 ((uint32_t)0x00000020)
И так далее;
Я хочу сделать функцию/декларацию (или что-то еще для решения), чтобы воздействовать на _ # часть определения.
(псевдокод)
void initialize(int X) {
GPIOA->MODER |= GPIO_MODER_MODER%X_5;
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_%X;
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR%X;
GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR5;
GPIOA->ODR |= GPIO_ODR_ODR_%X;
}
Где% Х INT X
Все, что я могу думать переключатель заявление для каждого X, но X имеет большой диапазон, так что исходный файл будет огромным.
Редактировать: https://github.com/espruino/Espruino/blob/master/targetlibs/stm32f4/lib/stm32f411xe.h - это заголовочный файл.
Я бы сгенерировал второй заголовок, который имитирует исходный (неизменяемый) заголовок, но делает это здорово. Например: '#define GPIO_OTYPER_OT (x) ((uint32_t) 1 << (x))', а затем, возможно, '#define GPIO_OTYPER_OT_0 GPIO_OTYPER (0)' и т. Д. И сгенерируйте код для перекрестной проверки результатов. Затем используйте заголовок, а не безумный. –
Я бы посмотрел на проблему, которую вы пытаетесь решить, чтобы понять, почему то, что вы делаете, является неправильным способом ее решения. – stark
Исправьте меня, если я ошибаюсь, но 'initialize()' сильно пахнет, как и следующая вещь, которую вы делаете, - это вызвать его в цикле ", чтобы инициализировать каждый вывод GPIO"; что было бы определенным делом мышления на неправильном уровне. Если вы инициализируете, сделайте это на уровне _port_, т. Е. «GPIOA-> OTYPER = GPIO_OTYPER_OT_0 | GPIO_OTYPER_OT_2 | GPIO_OTYPER_OT_5; '. Заграждение операций чтения-изменения-записи в одном и том же регистре является полной потерей циклов. Я подозреваю, что вы не прыгаете _straight_ в двунаправленные протоколы бит-бит или что-то еще, что может потребовать перенастройки произвольных GPIO во время выполнения. – Notlikethat