Можно ли использовать структуру повторения в этом коде? - PullRequest
0 голосов
/ 08 июля 2019

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

Я определил GPIO_Ports и Pins.И так идти до SEL8.

if (out & (1 << 0)) {
    GPIO_SetBits(SEL0_GPIO_Port, SEL0_Pin);
} else {
    GPIO_ResetBits(SEL0_GPIO_Port, SEL0_Pin);
}

if (out & (1 << 1)) {
    GPIO_SetBits(SEL1_GPIO_Port, SEL1_Pin);
} else {
    GPIO_ResetBits(SEL1_GPIO_Port, SEL1_Pin);
}

if (out & (1 << 2)) {
    GPIO_SetBits(SEL2_GPIO_Port, SEL2_Pin);
} else {
    GPIO_ResetBits(SEL2_GPIO_Port, SEL2_Pin);
}

1 Ответ

1 голос
/ 08 июля 2019

Мы не знаем типы используемых переменных.Код может выглядеть примерно так:

#include <assert.h>

// Indexas valid are from 0 to 8, some 9
#define IDX_MAX 9

typedef /* insert the type of SELx_GPIO_Port here */ gpio_port_type;

static gpio_port_type get_gpio_port_from_idx(size_t idx) {
  const gpio_port_type ports[] = {
    SEL0_GPIO_Port,
    SEL1_GPIO_Port,
    SEL2_GPIO_Port,
    SEL3_GPIO_Port,
    SEL4_GPIO_Port,
    SEL5_GPIO_Port,
    SEL6_GPIO_Port,
    SEL7_GPIO_Port,
    SEL8_GPIO_Port,
  };
  static_assert(IDX_MAX == sizeof(ports)/sizeof(*ports));
  assert(idx < sizeof(ports)/sizeof(*ports));
  return ports[idx];
}

typedef /* insert the type of SELx_Pin here */ pin_type ;

static pin_type get_sel_pin_from_idx(size_t idx) {
  const pin_type pins[] = {
    SEL0_Pin,
    SEL1_Pin,
    SEL2_Pin,
    SEL3_Pin,
    SEL4_Pin,
    SEL5_Pin,
    SEL6_Pin,
    SEL7_Pin,
    SEL8_Pin,
  };
  static_assert(IDX_MAX == sizeof(pins)/sizeof(*pins));
  assert(idx < sizeof(pins)/sizeof(*pins));
  return pins[idx];
}

void set_out(int out) {
   for (size_t i = 0; i < IDX_MAX; ++i) {
        (
           (out & (1 << i)) ? GPIO_SetBits : GPIO_ResetBits
        )(get_gpio_port_from_idx(i), get_gpio_pin_from_idx(i));
    }
}

Первые две функции отображают статический индекс в диапазоне от 0 до 8 на переменные SELx_GPIO_Port и SELx_Pin соответственно.После этого функция set_out проверяет каждый бит во входной переменной int out и вызывает GPIO_SetBits или GPIO_ResetBits в зависимости от того, установлен бит или не установлен.Я использовал троичный оператор, если функция имела бы другой прототип или была макросом, вы могли бы просто:

void set_out(int out) {
   for (size_t i = 0; i < IDX_MAX; ++i) {
        if (out & (1 << i)) {
            GPIO_SetBits(get_gpio_port_from_idx(i), get_gpio_pin_from_idx(i));
        } else {
            GPIO_ResetBits(get_gpio_port_from_idx(i), get_gpio_pin_from_idx(i));
        }
    }
}
...