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

    +132

    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
    struct 
    {
    	unsigned char * low;  //младшая часть адреса
      	unsigned char * high; //страшая часть адреса(только младших 3 бита)
    } padr;
    
    void filladdr(unsigned int * addr) //подготовка адресных ног МК
    {
    	padr.low = (unsigned char *)addr;
    	padr.high = padr.low + 1;
    	PORTB = *padr.low;
    	PORTE &= 0x8;
    	PORTE |= *padr.high;
    
    }
    
    unsigned char readFromSRAM(unsigned int * adrss)
    {
    	char outD;
    	TRISD = 0xFF;
    	filladdr(adrss);
    	PORTA &= 0xFC;
    	NOP(); // задержка на время доступа
    	outD = PORTD;
    	PORTA |= 0x7;
    	return outD;
    }
    
    void writeToSRAM(unsigned int * adrss, unsigned char * data)
    {
    	TRISD = 0x0;
    	filladdr(adrss);
    	PORTD = *data;
    	PORTA &= 0xF8;
    	NOP();  // задержка на время доступа
    	PORTA |= 0x7;
    	PORTD = 0x0;
    }

    говнокод для работы с 2кб внешней SRAM памяти для микроконтролеров pic

    Запостил: nice_penguin, 02 Января 2011

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

    • а на микроконтролере разве по другому можно?
      где говнокод?

      если у тебя есть не говнокодное решение, то приводи своё, а мы оценим насколько твоё лучше...
      Ответить
      • NOP(); // задержка на время доступа
        Ответить
        • а ты хочешь сделать это через таймер? разрешения частоты таймера не хватит
          Ответить
          • есть делители. Если мало, то есть 16 битный таймер.
            Ответить
            • все равно не хватит, чтобы ты там не думал
              Ответить
            • НОП - это микроскопическая задержка
              таймер с такой мелочью не справится
              Ответить
            • кстати, ты бы лучше код нопа привёл, а не разводил демагогию
              Ответить
              • Смысл такой, ноп это просто типичный asm nop. Наверное нужно было из РПЗ привести выдержку. Разработчик там предлагает приемщику нопы "подбирать на ощуп" . На самом деле, 8-бит таймера даже вполне хватит, так как один ноп - это в районе десятка или сотни наносекунд, в зависимсоти от рабочей частоты.
                Ответить
                • одна ничего не делающая комманда nop срабатывает дольше таймера?
                  Ответить
                  • nop - 1 такт. Если 8 битный таймер без делителя , то он тоже инкрементируется каждый такт. 16 битный каждый четвертый такт.
                    Ответить
                    • в итоге таймер все равно зависит от частоты работы процессора, как и ноп
                      если это не улучшает совместимость для работы на разночастотных кристалах, то зачем "платить больше"?
                      Ответить
                    • я ещё понял бы, если таймер стабильно замерял время, тогда подход оправдан
                      это позволяло бы писать код, который нет необходимости менять, в случае смены частоты кристала
                      Ответить
                • ты же предлагаешь повесить обработчик прерывания, на событие таймера, что-бы дождаться доступа?
                  пока это прерывание вызоветься - пол дня пройдет, а ноп это быстро
                  понятно, почему я вижу тормозящую стиралку у себя дома...
                  Ответить
                  • а кто мешает после каждого прерывания ставить таймер не на 0 а на 255 минус нужное кол-во нопов, если нужно, то заложить туда еще время обработки прерывания?
                    Ответить
                    • ну вот заложишь время обработки прерывания, а оно поменяется на другом кристале и будет, например, србатывать раньше
                      придётся отловить эту ошибку и переписать код
                      это ничем не лучше нопов в таком случае
                      Ответить
                      • одно дело нопы на ощуп ставить, а другое дело пару дейфайнов поменять, на частоту кварца и время доступа памяти. а один NOP - это не решение задачи.
                        Ответить
                        • с таким же успехом можно сделать один дифайн с нужным числом нопов
                          это также, можно указывать числом, если хоть немного владеешь дифайнами
                          Ответить
                          • Т.е. выносить нопы в дефайны это не говнокод по-вашему?
                            Ответить
                            • ты ведь не так давно начал профессионально заниматься микроконтроллерами?
                              Ответить
        • NOP(); // задержка на время доступа

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

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

          ЗЫ это не ПЦ с парой десятков шин и у каждой из них своя частота. тут да надо парится с синхронизацией.
          Ответить
    • какой срам!
      Ответить
    • показать все, что скрытоНашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
      Ответить
    • Это не говнокод, конечно реализация не особо удачная на мой взгляд, но особо поржать не над чем. Против NOP'а ничего против не имею, в некоторых случаях это лучше таймера и я часто подобное встречал у людей, которые уже давно не говнокодеры.
      Ответить
    • говнокод этот не минусуйте, дабы он не "утопился в мусорку"
      что-бы каждый мог зайти и почитать "выводы" по результатам спора о случае из данного говнокода
      Ответить
    • out 70h,al    
      	jmp @delay
      @delay: in al,71h

      ложное говно

      блжад, PHP! форматирование в жопе!
      Ответить

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