ВходНаше всё Теги codebook PARTS Поиск Опросы Закон Понедельник
8 августа
1163375 Топик полностью
VladislavS. (12.01.2022 10:35, просмотров: 312) ответил SciFi на Кстати, про рутину. Кто-нибудь предлагал внедрить в язык Си интерпретатор того же Си на этапе компиляции? Чтобы уйти от зубодробительных макросов и использовать вычисленные значения в качестве констант и т.д.?
Он изобрёл С++ :))) 

Вот, пример формирования таблицы перекодировки. Выполняется на этапе комиляции

class ENCODE_DELAY
{
  uint8_t value[256]{};

  static constexpr auto Q(const uint8_t x) { return 1<<x; }

  static constexpr auto rx_decode(const uint8_t x)
  {
    return (x&Q(0)?Q(7):0) + (x&Q(1)?Q(3):0) + (x&Q(2)?Q(0):0);
  }

  static constexpr auto tx_decode(const uint8_t x)
  {
    return (x&Q(0)?Q(6):0) + (x&Q(1)?Q(2):0) + (x&Q(2)?Q(1):0);
  }

public:
  constexpr ENCODE_DELAY()
  {
    for(auto n=0; n<256; n++) value[n] = tx_decode(n>>4) + rx_decode(n&0xF);
  }
  constexpr auto operator()(const uint8_t n) const { return value[n]; }
  constexpr auto& operator[](const uint8_t index) const { return value[index]; }
};

constexpr ENCODE_DELAY encode_delay;

В результате во флэш ложится таблица

encode_delay:
        DC8 0, 128, 8, 136, 1, 129, 9, 137, 0, 128, 8, 136, 1, 129, 9, 137, 64
        DC8 192, 72, 200, 65, 193, 73, 201, 64, 192, 72, 200, 65, 193, 73, 201
        DC8 4, 132, 12, 140, 5, 133, 13, 141, 4, 132, 12, 140, 5, 133, 13, 141
        DC8 68, 196, 76, 204, 69, 197, 77, 205, 68, 196, 76, 204, 69, 197, 77
        DC8 205, 2, 130, 10, 138, 3, 131, 11, 139, 2, 130, 10, 138, 3, 131, 11
        DC8 139, 66, 194, 74, 202, 67, 195, 75, 203, 66, 194, 74, 202, 67, 195
        DC8 75, 203, 6, 134, 14, 142, 7, 135, 15, 143, 6, 134, 14, 142, 7, 135
        DC8 15, 143, 70, 198, 78, 206, 71, 199, 79, 207, 70, 198, 78, 206, 71
        DC8 199, 79, 207, 0, 128, 8, 136, 1, 129, 9, 137, 0, 128, 8, 136, 1
        DC8 129, 9, 137, 64, 192, 72, 200, 65, 193, 73, 201, 64, 192, 72, 200
        DC8 65, 193, 73, 201, 4, 132, 12, 140, 5, 133, 13, 141, 4, 132, 12, 140
        DC8 5, 133, 13, 141, 68, 196, 76, 204, 69, 197, 77, 205, 68, 196, 76
        DC8 204, 69, 197, 77, 205, 2, 130, 10, 138, 3, 131, 11, 139, 2, 130, 10
        DC8 138, 3, 131, 11, 139, 66, 194, 74, 202, 67, 195, 75, 203, 66, 194
        DC8 74, 202, 67, 195, 75, 203, 6, 134, 14, 142, 7, 135, 15, 143, 6, 134
        DC8 14, 142, 7, 135, 15, 143, 70, 198, 78, 206, 71, 199, 79, 207, 70
        DC8 198, 78, 206, 71, 199, 79, 207

Которой можно пользоваться как обычным массивом encode_delay[].