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

    −50

    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
    Timer_Overflow_Interrupt(void)
    {
    switch(TMR_State)			// Обработчик прерывания по переполнению
    	{
    	case 0:	
    		{ 
    		Clr_Pin();		// Вывод в 0
    		TCNT = 255-100; 	// Задержка в 100 (до переполнения)
    		TMR_State = 1; 		// Следующая стадия 1
    		Break;			// Выход
    		}
     
    	case 1:	
    		{ 
    		Set_Pin();
    		TCNT = 255-1; 
    		TMR_State = 2; 
    		Break;
    		}
     
    	case 2:	
    		{ 
    		Clr_Pin();
    		TCNT = 255-5; 
    		TMR_State = 3; 
    		Break;
    		}
     
    	case 3:	
    		{ 
    		Set_Pin();
    		TCNT = 255-2; 
    		TMR_State = 4; 
    		Break;
    		}
     
    	case 4:	
    		{ 
    		Clr_Pin();
    		TCNT = 255-3; 
    		TMR_State = 5; 
    		Break;
    		}
     
    	case 5:	
    		{ 
    		Set_Pin();
    		TCNT = 255-4; 
    		TMR_State = 6; 
    		Break;
    		}
     
    	case 6:
    		{ 
    		Clr_Pin();
    		Timer_OFF(); 		// Выключаем таймер. Работа окончена
    		TMR_State = 0; 		// Обнуляем состояние
    		Break;			
    		}
     
    	default: 	break;		
    	}
    }

    http://easyelectronics.ru/avr-uchebnyj-kurs-konechnyj-avtomat.html

    А не лучше ли сделать массив указателей на функции, каждая из которых будет соответствовать case-у, и пусть там оно вызывает из массива фукнцию под номером TMR_State? Притом вот эту хню TMR_State = 1; TMR_State = 2; TMR_State = 3; которая дублируется во всех этих case-ах, ее ж можно хуйнуть всего один раз, типа TMR_State = (TMR_state+1)%7. Хотя для AVR контроллеров это скорее всего будет дорогая операция, так что можно хуйнуть TMR_State = TMR_state == 7 ? 0 : TMR_state+1;

    Запостил: j123123, 20 Июля 2016

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

    • Или даже так
      const static char a[] = {1,2,3,4,5,6,0}; 
      ...
      TMR_State = a[TMR_State];
      Ответить
      • const static unsigned char shit[] = {255-100, 255-1, 255-5, 255-2, 255-3, 255-4, 0};
        
        if (TMR_State & 1)
        {
          Set_Pin();
        } else
        {
          Clr_Pin();
          if (TMR_State == 6)
          {
            Timer_OFF();
          }
        }
        
        TCNT = shit[TMR_State];
        Ответить
        • Ну там показан основной принцип, как вместо нечитаемой циклопараши получить прямую свитч-портянку. Будь автомат посложнее так просто анроллнуть не получилось бы.
          Ответить
    • Железячников пустили к коду.
      Ответить
      • Ну собственно Ди там и пишет: Ага, только к МК обычно идут от железа, от электроники, а там программированию не учат. В результате получаются такие программные монстры, что страшно становится. С ужасом вспоминаю свои программы пятилетней давности.
        Ответить
      • Ты так говоришь, как-будто программистов можно пускать к железу (вспомни лифт из ардуины, соплей и фольги)...
        Ответить
        • А я и не говорю, что программистов нужно пускать к железу.

          Кесарево кесарю, богу божье.

          Do one thing and do it well.
          Ответить
          • Но... Кто же тогда будет кодить под контроллеры, а тем более под FPGA?
            Ответить
            • просто под программистом имплиситли подразумевается ынтерпрайзо-вебовый говнокодер

              разве как и под сисдмином подразумевается офисный эникей
              Ответить
            • Системщики.
              Ответить
              • Ой, да половина "системщиков" регистров то в глаза не видела...
                Ответить
                • а ты видел?

                  последний регистр, который можно было увидеть глазами, был наверное годах в 60х. Ламповый такой.
                  Ответить
                  • На релюшках делал в детстве. Правда всего 4-битный.
                    Ответить
                    • >>На релюшках
                      ого, это даже не 60е, это еще раньше)
                      Ответить
                      • Ну зато на них видно, что и как работает. А на лампах - уже нет (разве что на тиратронах и им подобных газоразрядках).
                        Ответить
                        • ну вообще регистр-защелка это скучно

                          собери-ка лучше сумматор или дешифратор, например
                          Ответить
                          • Дешифратор на релюхах вообще банально смотрится, просто на последних слоях овердохуя контактов уходит... А сумматор с лампочками тоже собирал.

                            З.Ы. И дешифратор для семисигментника.
                            Ответить
                            • а ДЛМ был в децтве?
                              Ответить
                              • > ДЛМ
                                Что это?
                                Ответить
                                • в гуголь "детская логическаЯ машина"
                                  Ответить
                                  • Неа, не видел такую... Просто была куча релюх, кнопок и прочего железа.
                                    Ответить
                                  • З.Ы. В общем-то даже осцилл был.
                                    Ответить
                                    • круто) а что ты еще собирал?

                                      Я, к сожалению, ни с чем таким не игрался. Только с компьютером, и то чисто софтварно.
                                      Ответить
                                      • Ну всякие транзисторные пищалки-мигалки на мультивибраторах, телеграф до соседа, приёмники и прочее говно, которое может собрать школота. Маленькую теслу (всего сантиметра 2 пробивало) на умножителе и трансе из телека.

                                        Ну и у отца на работе подрабатывал - всякую фигню для управления двигателями, титанами и прочими няшками на пускателях собирал. Зарядник ебических масштабов для автопогрузчика.

                                        Потом комп пытался спаять по схеме из журнала, половина даже работала... В итоге забил когда появился настоящий комп :(

                                        В общем, ничего особо серьёзного...
                                        Ответить
                                        • Жалко что настоящий комп появился так быстро, было бы клево если бы ты себе спектрум собрал по вырезкам журналов)

                                          Но вообще это круто, на самом деле. Чем раньше человек начал, и чем более лоу левел были его первые эксперементы, тем более он годный компьютерщик.
                                          Ответить
                                          • Ну я потом его эмулятор с дебаггером накатал на пасцале и асме: #10011 (железо не эмулировалось, только проц и оперативка). Ибо хотелось в шахматы из того же журнала погамать.
                                            Ответить
                                            • а смысл? Без железа ни одну игру не запустишь, а все знают что ничего нет на свете лучше старых спектрумовских бродилок
                                              Ответить
                                              • Ну вот шахматы же запустил. У них просто фронтенд на бейсике был. Из него выдрал в каких ячейках поле, с какого адреса запускать и т.п. Ну вот эмулятора проца + простенького фронтенда на пасцале вполне хватало, чтобы в эти шахматы погамать ;)
                                                Ответить
                                          • Вы тут поебитесь еще.
                                            Ответить
                    • Нашел релюшки на улице?
                      Ответить
                      • Лучше герконы. И память можно сделать через бистабильные реле. Или триггер из транзисторов собрать.
                        Иди вон http://www.zachtronics.com/kohctpyktop-engineer-of-the-people/ проходи, а потом ставь http://www.cburch.com/logisim/ и делай свой процессор.
                        Ответить
                        • >Лучше герконы
                          Чем лучше? Как ты их переключать собрался?
                          Ответить
                          • Тем что компактнее. Магнитом
                            Ответить
                            • Руками подносить будешь?
                              Ответить
                              • Да, это так можно задать read-only энергонезависимую прошивку, битики выставлять, поднося магниты к нужным местам. А чтобы менять можно было, надо сделать или катушками(электромагнит), или особый механизм, который будет постоянные магнитики убирать от герконов
                                Ответить
                                • Есть же готовые реле на герконах.

                                  Ещё бывают поляризованные реле с контактами без возвращающей пружины: если к катушке приложить напряжение одной полярности, то контакты переключатся в одну сторону; если поменять полярность, то переключатель пойдёт в противоположную сторону; в покое последнее состояние сохраняется, если сильно не трясти.
                                  Ответить
                                  • Это как раз то, что называют бистабильным реле
                                    Ответить
                                  • А смысл герметизировать только контакты? А вообще я герконы видел только в велокомпьютерах и сигнализации.
                                    Ответить
                                    • У обычных реле такой же фатальный недостаток, как и у обычных выключателей: в момент переключения образуется искровой промежуток. Если отсосать воздух, то искрить при переключении не будет.
                                      Ответить
                                • Ещё немного - и ты память на ферритовых колечках изобретёшь.
                                  Ответить
    • > А не лучше ли сделать массив указателей на функции
      А зачем массив и индекс? Просто указатель на функцию. Один на весь автомат.
      void no_op(void) {
      }
      
      void (*next_action)(void) = no_op;
      
      void start(void) {
          next_action = step1;
      }
      
      void step1(void) {
          // do step 1
          next_action = step2;
      }
      
      void step2(void) {
          // do step 2
          next_action = no_op;
      }
      Ответить
      • Это будет глобальная переменная с указателем. Вообще, было б неплохо запилить такие вот глобальные переменные с ограничениями, ну как например объявление статической переменной внутри функций, но чтобы можно было бы перечислить, какие именно функции имеют доступ к этой вот глобальной переменной. Ну типа
        int a=0 __attribute__((visible_only_for:{shit1,shit2,shit3}));
        
        void shit1(void)
        {
          a = 666;
        }
        
        void shit2(void)
        {
          a = 1488;
        }
        
        void shit3(void)
        {
          if(a == 666) printf ("SOTONA\n");
          if(a == 1488) printf ("HITLER\n");
        }
        
        // а для других функций эта переменная a будет незанятой и ее можно как локальную использовать. Можно через манглинг хуйнуть
        Ответить
        • > перечислить, какие именно функции имеют доступ к этой вот глобальной переменной
          Ну static в сишку слава богу завезли. И единицы трансляции тоже. Так что юзай и наслаждайся инкапсуляцией ;)
          Ответить
          • В рамках одной единицы трансляции, глобальные перменные одни для всех, а это не всегда хорошо. Например, если я решу добавить глобальных переменных, мне надо такое название придумывать, которое бы не использовали локальные переменные в функцях, которые есть в той самой области видимости. А static переменная, объявленная внутри функции, видна только этой функцией, и никому больше.
            Ответить
            • Кто мешает сделать ещё одну единицу трансляции?

              > не использовали локальные переменные в функцях
              Приписывай к глобалкам префикс g_, например.
              Ответить
              • А если есть локальная переменная с префиксом g?

                double g_constant = 6.67408e-11
                Ответить
                • А нехуй было сокращать - gravity_constant.

                  А то ещё подумаешь, что в g_constant лежит не G, а g которое 9.8...
                  Ответить
              • Чем больше единиц трансляции, тем хреновей оно будет оптимизировать. Interprocedural optimization (IPO) например есть, и чтобы оно работало, надо чтобы компилятор все видел в пределах одной единицы трансляции. Хотя там вроде какой-то Link-time optimization (LTO) есть, который это должен все решать, но я так подозреваю что там оно оптимизирует не так хорошо (надо будет исследовать этот вопрос). Вот в жабовском HotSpot вообще интересный подход https://habrahabr.ru/post/305894/ и еще чтоб суперкомпиляция-специализация как у Турчина в РЕФАЛ-е http://keldysh.ru/papers/2008/prep12/prep2008_12.html#_Toc193602742
                Ответить
    • > дорогая операция
      Хех, на tiny 13 эта "дорогая операция" съедала, емнип, 25% флеша.
      Ответить
    • > Break;

      Регистронезависимость в Си?
      Ответить

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