В настоящее время я разрабатываю встроенное приложение, которое должно использовать как можно меньше ресурсов ЦП. Основной цикл записывает некоторые биты для вывода. Количество итераций цикла - очень важная переменная, назовем ее N.

N может быть в диапазоне от 0 до 3.

for (int i=0; i<N; i++) {
    WriteBits();
}

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

Но другой способ закодировать это - задействовать макросы определения:

#define N 3
...
WriteBits();
#if N >= 1
WriteBits();
#endif

#if N >= 2
WriteBits();
#endif

#if N == 3
WriteBits();
#endif

Этот метод намного быстрее, но, конечно, необходимо жестко запрограммировать значение N.

Есть ли другой подход, позволяющий загружать переменную N из файла во время работы и вставлять ее в операторы #if?

Мое приложение работает на Linux Raspbian.

РЕДАКТИРОВАТЬ:

Это приложение используется для отображения текста на светодиодных панелях. Когда я использую метод цикла, частота кадров составляет около 145 Гц. При использовании определяет до 200 Гц.

c++
0
Marcin Zdunek 6 Сен 2016 в 14:05

3 ответа

Используйте простой переключатель без перерыва:

switch(N){
    case 3: WriteBits(); //no break
    case 2: WriteBits(); //no break
    case 1: WriteBits(); //no break
    //case 0: WriteBits(); // If you need N+1 call
}
1
Teivaz 6 Сен 2016 в 11:19

Вы можете сделать что-то подобное, если COUNT является буквальным.

#define LOOP(COUNT, X) LOOP_##COUNT(X)
#define LOOP_1(X) X;
#define LOOP_2(X) LOOP_1(X) LOOP_1(X)
#define LOOP_3(X) LOOP_2(X) LOOP_1(X)
#define LOOP_4(X) LOOP_2(X) LOOP_2(X)
#define LOOP_5(X) LOOP_3(X) LOOP_2(X)
#define LOOP_6(X) LOOP_3(X) LOOP_3(X)
#define LOOP_7(X) LOOP_4(X) LOOP_3(X)
#define LOOP_8(X) LOOP_4(X) LOOP_4(X)
#define LOOP_9(X) LOOP_5(X) LOOP_4(X)
#define LOOP_10(X) LOOP_5(X) LOOP_5(X)
0
Ray Hamel 6 Сен 2016 в 11:29

Если ваше время должно быть таким точным, вы не можете полагаться на свой компилятор C в создании оптимального кода. Вам нужно будет написать ассемблер самостоятельно.

Я бы предложил такую ​​структуру:

  jump to (start + (3-N)*<length of code of WriteBits>)
start:
  <code of WriteBits>
  <code of WriteBits>
  <code of WriteBits>
  end
0
michalsrb 6 Сен 2016 в 11:32