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

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

Метки:
  1. Asper Daffy

    Asper Daffy Иксперд

    В коде из поста #30
     
  2. Nekto_nikto

    Nekto_nikto Гик

    Я даже больше скажу в программах, которые пишут для 3 кольца защиты ОС, указатели работают только в виртуальном адресном пространстве, которое выделяется под каждую программу отдельно и для 32 битных систем составляет 4Гб, для 64 битных больше. А с физической памятью т.н. RAM уже работают менеджеры памяти ОС - драйверы, которые уже работают в нулевом кольце защиты, куда у простой программы попросту доступа нет.
     
  3. parovoZZ

    parovoZZ Гуру

    так ты просто не разобрался, так же, как и ТС. Хотя он более уверен в себе:
    Я очень люблю указатели и стараюсь их применять везде, где от них есть выигрыш. Если что не понятно, замучиваю вопросами @Asper Daffy и прочих.
     
  4. parovoZZ

    parovoZZ Гуру

    начнём с того, что там НЕТ прерываний. Прерывания где-то там и там нет никаких setI и clearI)))

    а адрес чего и зачем его возвращать?
     
  5. Asper Daffy

    Asper Daffy Иксперд

    Да, неужели? Ладно, раз Vovka не говорит, я скажу тебе в чём там ошибка, только после твоей реакции "я делал для себя и у меня таких ситуаций не возникнет" как-то даже не хочется. Ну, не возникнет и ладно, мне-то что ...

    В общем, смотри, вот так
    Код (C++):
    uint8_t EEPROM_read(uint16_t ucAddress) {  
         while(EECR & (1<<EEPE));            //.. Ждем завершения предыдущей операции с памятью
         cli();
         EEAR = ucAddress;                //.. Запишем адрес ячейки
         EECR |= (1<<EERE);                //.. Старт чтения EEPROM
         sei();
         return EEDR;                //.. Возвращаем полученные данные
    }
    в волатильной среде не работают - это грубая ошибка. Работают вот так:
    Код (C++):
    uint8_t EEPROM_read(uint16_t ucAddress) {  
         while(EECR & (1<<EEPE));            //.. Ждем завершения предыдущей операции с памятью
         cli();
         EEAR = ucAddress;                //.. Запишем адрес ячейки
         EECR |= (1<<EERE);                //.. Старт чтения EEPROM
          const uint8_t res = EEDR
         sei();
         return res;                //.. Возвращаем полученные данные
    }
    Разницу найди сам и сам же догадайся в чём тут фишка.
     
    SergeiL нравится это.
  6. parovoZZ

    parovoZZ Гуру

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

    почему мы не можем вернуть значение регистра, объявленного как volatile?
     
  7. Asper Daffy

    Asper Daffy Иксперд

    Я же сказал, сам догадайся.

    Вы то всё можете, только кто Вам гарантирует, что между

    sei();

    и операцией чтения регистра в

    return EEDR;

    не произойдёт чего-нибудь, что изменит значение EEDR?

    А так, как я написал - это как раз гарантируется.
     
    SergeiL нравится это.
  8. parovoZZ

    parovoZZ Гуру

    Хм. Сам МК AVR и гарантирует. Потому как после sei() ГАРАНТИРОВАННО выполняется одна инструкция кода и только потом ядро уходит на прерывание, если есть запрос на него (поднят флаг).
     
  9. Asper Daffy

    Asper Daffy Иксперд

    Одна инструкция кода или один оператор С++? Если первое, то кто даст гарантию, что там окажется та самая инструкция? Дизассемблер не предлагать - он не гарантирует, что так будет всегда.
     
  10. parovoZZ

    parovoZZ Гуру

    Одна ИНСТРУКЦИЯ. МК про Си не знает ничего.

    а что там ещё может быть? Следующей инструкцией будет копирование регистра EEDR в РОН. А РОН-ы, как и все остальные регистры МК, объявлены с квалификатором volatile.
     
  11. Asper Daffy

    Asper Daffy Иксперд

    Но код-то на С++ написан.
    Вопрос к компилятору. Может быть много чего. Либо нужно писать на ассемблере в непосредственных командах, либо не полагаться на то, что там будет что-то конкретное.
     
  12. parovoZZ

    parovoZZ Гуру

    я сильно сомневаюсь, что компилятор может позволить себе такие вольности. Вот убрать кусок кода - это да, почудить с циклами...Но чтобы оформить выход из функции через одно место... Ни у IAR, ни у AVRGCC не замечал такого.

    Но подобную конструкцию
    применяю при ветвлении алгоритма внутри функции.
     
  13. Asper Daffy

    Asper Daffy Иксперд

    Если не планируешь менять, всегда добавляй const - не убудет 5 букв написать.
     
  14. a1000

    a1000 Гуру

    Ребята, я читаю эту тему и охреневаю. То-есть медленно превращаюсь в хрен. Правильно написал паровоз
    Все ваши извращения на Си, типа перегруженных функций, указателей, типов переменных и пр.., компилятором будет переведено в ASM. В посте http://forum.amperka.ru/threads/meg...-eeprom-с-адреса-255.21414/page-2#post-273006 я привёл ассемблерный код к которому надо стремиться. Оговорюсь - код не мой, взял из книги DiHalt. Но все магические действия с абстрактными понятиями в придуманной среде Си должны заставить компилятор выдать такой код. По другому работать не будет. Если знать как это работает на низком уровне все вопросы отпадают сами собой.
    Дождались готовности памяти, Кинули в EEAR адрес, выставили бит чтения и забрали результат из EEDR. Всё! Никакой магии. Покайтесь грешники:(:(:(:(:(
     
    parovoZZ нравится это.
  15. SergeiL

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

    ASM прекрасный язык, но есть одно большое НО
    Сколько лет с таким подходом потребуется, например, для написания кода отправки получения данных через Ethernet шилд на MQTT брокер?
    Естественно в свободное время изучая материал. Сколько времени потребуется на отладку этого кода до его безотказной работы.
    А потом вдруг потребовалось, "перенести" этот код, например, на ESP c Wi-FI. Удастся ли? Во что выльются доработки кода?
     
  16. parovoZZ

    parovoZZ Гуру

    Скажи честно - ты этот брокер на Сях сам написал или воспользовался сторонней библиотекой? Я более, чем уверен, что второе. Так вот если бы была библиотека брокера на ASM, то и без разницы. У грамотного ассемблерщика есть библиотеки на все случаи жизни.

    Для таких вещей низкий уровень и надо писать на ASM. Я более, чем уверен, что стек lwIP (или какой там дядя Ляо применил?) так и написан.

    Язык???

    вдруг не потребуется. Промышленные конторы просто так не перескакивают с одного производителя на другого. Впрочем, на Сях при переносе кода проблем будет совсем не меньше. Весь низкий уровень под перезапись.
     
  17. SergeiL

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

    А вот об этом я и писал, но ты не понял. АСМ не для любителя, ну или для любителя которому интересен именно АСМ, а не результат.
    UPD: блин все время забываю про "профессионала" курирующего форум :)
     
    Последнее редактирование: 11 ноя 2020
  18. parovoZZ

    parovoZZ Гуру

    почему?
     
  19. a1000

    a1000 Гуру

    Смотря для какого уровня. Что пишет DI HALT
    Парадоксально, но под микроконтроллеры писать на ассемблере ничуть не сложней чем на Си. В самом деле, программирование контроллера неотделимо от его железа. А когда пишешь на ассемблере, то обращаешься со всей периферией контроллера напрямую, видишь что происходит и как это происходит. Главное, что при этом ты четко понимаешь что, как и зачем ты делаешь. Очень легко отлаживать и работа программы как на ладони. Да и сам ассемблер изучается очень быстро, за считанные дни. Достаточно постоянно иметь перед глазами систему команд и навык программирования алгоритмов. А соответствующее состояние мозга, когда начинаешь мыслить ассемблерными конструкциями наступает очень быстро.
    И это действительно так. Да есть трудности. Математика или работа со строками - ещё то удовольствие. Но есть мощнейшее средство - макросы. Если заниматься ASM плотно и серьёзно можно собрать необходимую коллекцию, что сильно облегчит жизнь. Как писал тот-же DI HALT - Не нравится система команд? Придумай свою с блекджеком и шлюхами!
    Я не агитирую пользоваться только ASM. У Си много преимуществ, особенно в больших проектах. Но заморочки иногда превышают пользу. 10 строк простейшего ассемблерного кода, а тут на 4 страницах спорят над правильностью объявления функции.
     
    parovoZZ и ИгорьК нравится это.
  20. ИгорьК

    ИгорьК Гуру

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