1. Си / Говнокод #25929

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    // https://jaycarlson.net/2019/09/06/whats-up-with-these-3-cent-microcontrollers/
    // The C code I used for those original MCU tests looked something like this:
    
    volatile int16_t in[25];
    volatile int16_t out[25];
    const int16_t a0 = 16384;
    const int16_t a1 = -32768;
    const int16_t a2 = 16384;
    const int16_t b1 = -25576;
    const int16_t b2 = 10508;
    int16_t z1, z2;
    int16_t outTemp;
    int16_t inTemp;
    void main()
    {
      while(1) {
        _pa = 2;
        for(i=0;i<25;i++)
        {
          inTemp = in[i];
          outTemp = inTemp * a0 + z1;
          z1 = inTemp * a1 + z2 - b1 * outTemp;
          z2 = inTemp * a2 - b2 * outTemp;
          out[i] = outTemp;
        }
        _pa = 0;
      }
    }
    
    // The Padauk code looks like this:
    
    WORD in[11];
    WORD out[11];
    WORD z1, z2;
    WORD pOut, pIn; // these are pointers, but aren't typed as such
    int i;
    void  FPPA0 (void)
    {
      .ADJUST_IC  SYSCLK=IHRC/2    //  SYSCLK=IHRC/2
      PAC.6 = 1; // make PA6 an output
      while(1) {
        PA.6 = 1;
        pOut = out;
        pIn = in;
        i = 0;
        do {
          *pOut = (*pIn << 14) + z1;
          z1 = -(*pIn << 15) + z2
            + (*pOut << 14)
            + (*pOut << 13)
            + (*pOut << 9)
            + (*pOut << 8)
            + (*pOut << 7)
            + (*pOut << 6)
            + (*pOut << 5)
            + (*pOut << 3);
          z2 = (*pIn << 14)
            - (*pOut << 13)
            - (*pOut << 11)
            - (*pOut << 8)
            - (*pOut << 3)
            - (*pOut << 2);
          i++;
          pOut++;
          pIn++;
        } while(i < 11);
        PA.6 = 0;
      }
    }

    > As for the filter function itself, you’ll see that all the multiplies have been replaced with shift-adds. The Padauk part does not recognize the * operator for multiplication; trying to use it to multiply two variables together results in a syntax error. No, I’m not joking.

    Запостил: j123123, 11 Октября 2019

    Комментарии (55) RSS

    • I discovered this while working on my SPI-to-WS2812 converter. When I first need a for() loop, I wrote:

      int i = 7; 
      while(i >= 0) {
         ...
         i--;
      }


      This works, but it’s not nearly as cycle-efficient as using one of Padauk’s handy macros:

      .FOR i, <7,6,5,4,3,2,1,0>
        ...
      .ENDM


      When the compiler encounters these macros, it does a source-level replacement of “i” in the content of the block with each value — copying-and-pasting the entire block.


      Царский анролл
      Ответить
      • You’ll get a compilation error if you try to write a line of code like this:

        int b = *(ptr + i);


        Why? Because your MCU does not have the ability to do indirect addressing with offsets (constant or otherwise). The compiler wants you to tell it precisely what you want to do. Maybe you want to do this:

        ptr += i; // wipes out the old value of ptr, but it's fast
        int b = *ptr;


        Or maybe this:

        int newPtr = ptr + i; // uses a new memory allocation and is slower
        int b = *newPtr;


        Both of these have trade-offs.

        Именно поэтому я за ассемблер
        Ответить
        • показать все, что скрытололшто? Если стандарт это разрешает, то почему меня ебет что там и где как это реализует?
          Ответить
          • Тебе это может быть важно на очень дохлых микроконтроллерах, где мало памяти и нет косвенной адресации. Это нахер не надо на более человеческих процессорах/контроллерах, где не надо каждый байтик и такт процессора дрочить и есть косвенная адресация
            Ответить
            • показать все, что скрытоТы серьезно сейчас? Как это относится к ЯВУ вообще? Задача копулятора для какой-то там платформы состоит в том, чтобы высрать трехадресный кот с прямой адресацией или что там поддерживается на этой платформе, а не отвергать валидное выражение. Поехавшие эмбеддеры превращают Цє в какойто сраный приколоченный гвоздями к платформе трубо пассаль...

              Если так беспокоит предварительная оптимизация, то можно хинт высрать по этому поводу.
              Ответить
              • > Поехавшие эмбеддеры превращают Цє в какойто сраный приколоченный гвоздями к платформе трубо пассаль...
                Та херня, которая описывается в той статье https://jaycarlson.net/2019/09/06/whats-up-with-these-3-cent-microcontrollers/ это вообще не Си, а какая-то ебанутай поебень, похожая чем-то на Си. Там например даже цикла for нет
                Ответить
      • https://govnokod.ru/25937
        Ответить
    • показать все, что скрытоджейраздватри, ты слыхал про мудули в С++20?
      Ответить
      • Да, слышал что там какую-то хуйню хотят в крестах сделать
        Ответить
        • Я это слышу каждый стандарт "о, они опять какую-то хуйн хотят сделать".. И ведь делают.
          Ответить
    • показать все, что скрытоhttps://pbs.twimg.com/media/EGk5RI-X4AIa_td.jpg
      Открытие дороги после ремонта в Уд-Муртии. Хуйло, сало, 2019.
      Ответить
    • показать все, что скрытоДезинфекция.
      Ответить
    • Напоминает язык программирования «Sphinx C--». Правда, у того цикл for был.
      Ответить
      • Циклы и switch можно вообще все убрать, оставив только метки, goto и if. При желании все эти циклы и switch реализовать через какое-нибудь макроговно можно
        Ответить
        • показать все, что скрытоЦарь просил передать, что кроме массива и гоуту вообще больше ничего не надо.

          Кстати, в масме вроде были и ифы и циклы и все это через макросы
          Ответить
    • показать все, что скрытоУдарим киянкой (молоток для укладки плитки) по головам спамеров и нарушителей, вроде белой шпаны - guest8
      Ответить
    • показать все, что скрытоПроведена дезинфекция
      Ответить

    Добавить комментарий