Mega2560 чтение одного байта из eeprom с адреса > 255

Тема в разделе "Arduino & Shields", создана пользователем Vovka, 8 ноя 2020.

Метки:
  1. AlexU

    AlexU Гуру

    Тут проблема-то не в С или каком другом языке, а в том что в представленном коде есть, не сказать чтобы, ошибки, но решения, которые превращают этот код в говнокод, который будет работать корректно только при определённых обстоятельствах. А в общем случае может доставить огромную головную боль разработчику, который будет использовать этот код. А автор этого говнокода вместо того, чтобы прислушаться к советам, гнёт свою линию. Впрочем, это его дело.
    Такой же говнокод можно и на ASM'е сочинять.
    Вот и получилось четыре страницы разговоров...
     
    b707 нравится это.
  2. AlexU

    AlexU Гуру

    Использование C и, в особенности, C++ позволяют уменьшить время разработки программ и трудозатраты, т.к. некоторую часть работы, которую должен делать разработчик, берут на себя. Но при это на разработчика, использующего эти инструменты накладываются дополнительные требования -- он должен знать немного больше, чем разработчик на ASM.
    Как пример, нужно выкопать яму определённой формы. Если яма маленькая, то лопатой можно обойтись. А если большая, то с экскаватором задача будет выполнена быстрее, чем лопатой, хотя и не так филигранно. Но экскаватором нужно уметь пользоваться, поэтому большая часть людей между лопатой и экскаватором, выберет лопату.
     
  3. b707

    b707 Гуру

    Сначала пришел новичок, который не отличает адреса от самих переменных и не может понять. что тип uint8_t* и uint8_t - не одно и тоже.
    А потом набежала толпа "старичков", понимающих в этом чуть более самого ТС, а виноватым почему-то казался язык

    Сколько я видел адептов АСМ - абсолютно все они, БЕЗ ИСКЛЮЧЕНИЙ - знают асм в разы лучше Си.... что и подтвердила эта ветка
     
    AlexU нравится это.
  4. ИгорьК

    ИгорьК Гуру

    Язык, конечно, не виноват - виноваты его применители. Хотя "все на свете связано, все взаимообуслрвлено".

    Написание кода - это дело. Такое же, как вытачивание детали, распиловка дров или управление автомобилем.

    Так вот слово "говнокод" зело прижилось в этом языке, среди тех, кто его применяет, а в других делах что-то не слышно. Типа "говновождение", "говностроительство", etc.

    Кстати, в python или JS словечко "говнокод" - часто применяется?

    Так влияет язык на человеков или не влияет? Вопрос...
     
  5. AlexU

    AlexU Гуру

    Прижилось в любых языках программирования, а не только в этом языке.
    http://govnokod.ru/
    там есть и про JS, и про Python.
    Наговнокодить можно везде, было бы умение.
     
  6. parovoZZ

    parovoZZ Гуру

    совершенство - это не тогда, когда нечего добавить,
    а когда нечего отнять.
    (с) Антуан де Сент-Экзюпери
     
  7. ИгорьК

    ИгорьК Гуру

    Ну, значит это единственная область деятельности, где коллеги друг друга говнюками чествуют.
     
  8. AlexU

    AlexU Гуру

    В случае твоего кода нужно кое-что "отнять", что бы им можно было пользоваться. Но т.к. этим кодом пользуешься только ты, то всё "ок". Есть только одно пожелание -- не надо таким кодом хвастаться. А то, на этом форуме обитает целая куча неокрепших умов, которые, увидев под твоим ником надпись "Гуру", подумают, что ты и в правду умеешь писать хороший код.
     
    Asper Daffy нравится это.
  9. AlexU

    AlexU Гуру

    В этой области не "говнюками", а "гвнокодерами" или "быдлокодерами". В другой области "рукожопами", в третьей -- "водятлами" и т.д.
    В каждой области есть свои "специалисты"...
     
  10. Asper Daffy

    Asper Daffy Иксперд

    Известно, что "настоящий программист напишет фортрановскую программу на любом языке", ну, а настоящий кодер с такой же лёгкостью на любом языке наговнокодит.

    Но только настоящий! Не зря Сан Саныч Зиновьев предупреждал: "Глупости надо обучаться так же, как уму. Очень высокой степени глупости люди достигают лишь в течение длительной жизни и большого числа тренировок"
     
    Andrey12 нравится это.
  11. ИгорьК

    ИгорьК Гуру

    Но только в этой говну даже сайты выделяют и тему обсасывают (пост выше). Это бесспорно.
     
  12. parovoZZ

    parovoZZ Гуру

    конечно, ОК. В выших ардуинах неизвестно что происходит, поэтому и вставляете сотню проверок. Я же весь код прогоняю через дебаггер/симулятор и тестирую различные комбинации его выполнения.
     
  13. SergeiL

    SergeiL Оракул Модератор

    :)
     
    Andrey12 и ИгорьК нравится это.
  14. b707

    b707 Гуру

    Паровоз, ты десяток мартышек за клавиатуру посади - будут тебе "тестировать различные комбинации" клавиш, пока не сложится "Война и мио"... ну или код записи в ЕЕПРОМ, что ты недавно показывал :)
     
    Andrey12 и Asper Daffy нравится это.
  15. parovoZZ

    parovoZZ Гуру

    Пожалуй, я твой опыт перенимать не буду. Ну вот где я возьму 10 мартышек? Посреди осени-зимы?
     
  16. AlexU

    AlexU Гуру

    Народная пословица: "Ему хоть ссы в глаза, всё -- божья роса".
    Доступ в интернет есть? В google или yandex не забанили?
    Понятное дело, что программисты не мало времени проводят за компами и на просторах интернета, да и сайт как-нибудь запилить для них не проблема. А вот автомобилисты -- "за баранкой" и чаще всего отдельный сайт пилить не будут, а возьмут какой-нибудь ресурс типа ВКонтакте и создадут там группу про "водятлов", по аналогии с сайтом govnokod.ru.
    Да и ссылку привёл только для того, что бы увидели, что в JS навертеть можно гораздо больше, чем в С (хотя это так себе показатель). Вы же спрашивали:
    так вот -- отвечаем.

    PS: Само понятие "говнокод" начали обсасывать с Вашей подачи, до этого обсуждали корректность кода одного из пользователей данного форума.
    PPS: И Вы же поддержали холивар на тему "C vs ASM", начатую пользователем a1000:
    К стати в С, нет перегруженных функций.
    PPPS: Мой пост -- это попытка остановить этот холивар, которая оказалась не удачной, из-за того что один из модераторов любит разводить холивары.
     
  17. ИгорьК

    ИгорьК Гуру

    Если бы только :)
    Никакие доводы на вас не действуют, а этот применять не буду, предупредили.
    Ок, ваше право называть чужой код говном - священно. Извините.
     
  18. AlexU

    AlexU Гуру

    В свою очередь прошу извинить за свои резкие высказывания и оcкорбления, если таковые имели место быть (определённый период жизни наложил некоторый отпечаток на стиль общения).
    А так же прошу модераторов, если уж не хотите пресекать холивары в темах (причём, мало имеющих отношение к ним), то хотя бы не поощрайте их своим участием.
     
  19. a1000

    a1000 Гуру

    Как я понял всё из-за этого кода
    Код (C++):
    //... Запись в EEPROM
    void EEPROM_write(uint16_t ucAddress, uint8_t ucData)
    {
        while(EECR & (1<<EEPE));            //.. Ждем завершения предыдущей операции с памятью

        cli();
     
        EECR = (0<<EEPM1)|(0<<EEPM0);            //.. Установим режим работы - стирание и запись за одну операцию длительностью 3.4 мс (Atomic Operation)
     
        EEAR = ucAddress;                //.. Запишем адрес ячейки и данные в регистры
        EEDR = ucData;

        EECR |= (1<<EEMPE);                //.. Установим мастер бит EEMPE
     
        EECR |= (1<<EEPE);                //.. и произведём запись в EEPROM

        sei();
    }


        //... Чтение из EEPROM
    uint8_t EEPROM_read(uint16_t ucAddress)
    {  
         while(EECR & (1<<EEPE));            //.. Ждем завершения предыдущей операции с памятью
         cli();
     
         EEAR = ucAddress;                //.. Запишем адрес ячейки
     
         EECR |= (1<<EERE);                //.. Старт чтения EEPROM
         sei();
     
         return EEDR;                //.. Возвращаем полученные данные
    }
     
    А именно из-за того что в начале функции cli() а в конце sei(). Да, при вызове данных функций из прерывания флаг I установится до выхода из прерывания и может возникнуть вложенное прерывания. Опоненты предлагают сначала сохранить регистр SREG и только потом сбрасывать фтаг I, а в конце функции востановить SREG. Такой подход более универсален и позволяет вызывать эти функции откуда угодно. Но положим руку на сердце, кто из здравомыслящих людей будет проводить чтение или запись EEPROM в прерывании? То что прерывания длжны быть короткими как выстрел записано на подкорку. Паровоз, при написания кода, за этим следит
    Ну а на счёт того сохранять SREG правильнее ибо
    это побочный эфект от попытки создать универсальную среду для всех случаев жизни.
     
  20. akl

    akl Гуру

    а еще мне интересно - нужно ли вообще запрещать прерывания в этих функциях. Если предположить что ни в каких прерываниях ничего связанного с еепром не трогать, то и повредить внезапно возникшее в процессе функции прерывание вроде никак не должно?