Atmega8 LTO (перенос кода с ардуино)
- Войдите на сайт для отправки комментариев
Приветствую всех, это даже не вопрос - а спросить совет.
Так как в очередном проекте «целую 328ю ардуину нано использовать жалко», решил купить atmega8 (она и дешевле). Для компиляции проекта использовал MiniCore ядро. Но! Не могу понять (атмега8 ещё едет), после установки MiniCore появилось много дополнительных настроек. Одна из них LTO. Как я понял из гугла - это оптимизатор, не уменьшающий скорость работы кода, но сокращающий объём исполняемо кода. При включении данной опции мой код сократился на 1кб с лишним (что существенно).
Собственно вопрос - включать данную опцию или нет? Может кто более детально сможет объяснить в чем сокральный смысл оптимизации (ну так, по простому)? Достаточно просто ответов - используй ее или наоборот. То есть целый 1 килобайт из 8 сохранить для дополнительного кода круто, но чем это чревато? Или как? Я запутался...
в чем сокральный смысл
сокрали фсё просто. так и живем.
ЗЫ: пипец! еще одного в гугле забанили.... шо "корпорация добра" делает!!! уму не постижимо!
Вы обычным, из коробки, IDE для какой-нибудь UNO пользовались?
Так вот там LTO включено безо всяких опций.
Если пользовалиcь и пока ещё живы, то пользуйтесь и дальше.
Вот здесь я кратко объяснял что такое LTO
В след. раз заказывай Atmega88. По поведению/регистрам/программированию не отличается от 328, а просто 8 имеет в некоторых моментах существенные различия.
А по LTO - я всегда включаю. Ну, и тебе советую.
Спасибо всем ответившим, считаю вопрос закрытым.
ЗЫ: Дракула, хороший человек, опечатался я (или ошибся). Прошу прощения.
Зато мега8 откалибрована при 5в intrc 1мгц!) Для самоделок временами можно и без кварца.
Да я и на 88 ни разу кварец не ставил. И она, кста, на 3.3В прекрасно работает на своих 8 МГц.
Да, 88-я как раз таки на 3в и калибруется. А вот на 5в иногда приходится подстраивать.
просто 8 имеет в некоторых моментах существенные различия.
Кажется я понял о чем ты говорил.
Компилирую (ради интереса) проект с энкодером под ATmega8. На 328й меге для работы прерываний (энкодер подключен к выводам 2 и 3 платы ардуино нано) использую вот такой код:
При компиляции получаю вот такие ошибки:
Дальше я полез в интернет и "накопал" другой код. Деда, посмотри пожалуйста, правильно я все сделал?
Просто ATmega8A еще едут из китая, проверить нет возможности. Но код стал прекрасно компилироваться:
Я, пока еще, не понимаю все эти регистры и тп. :-(
Код пока не смотрел, но сказать хочу.
Atmega8 это древняя серия, можно сказать, родоначальнег Atmega16 и Atmega32. У их опорное напряжение ADC 2.56В, таймер0 не имеет режима работы по совпадению, WDT работает через жо, и т.д. А вот Atmega88 какрас рашшыряется до 168 и 328 вапще без проблем, ибо кроме памяти в 8Кб ничем от их не отличается.
Знать бы это перед тем как заказывать... ((( Ну уже поздно, буду пока ATmega8A пользовать... (((
Знать бы это перед тем как заказывать... ((( Ну уже поздно, буду пока ATmega8A пользовать... (((
Не сы, Atmega8 тоже годная для поделок, у мня на их и бочка в теплице наполняется и приемники работают.
Все же я посмотрел даташит (на сколько мне сейчас мозгов хватает на него смотреть: https://static.chipdip.ru/lib/292/DOC000292159.pdf ) и изменил код в setup ():
Я думаю - так правильнее будет, если я верно даташит понял?
А ещё, если можно, простыми словами объясните что происходит когда применяются операторы:
Биты установить и биты сбросить по маске, которая в скобочках.
Спасибо. А сами "настройки" из #12 правильно установил?
А кто ж его знает. Вернее кто с восьмёркой работал может знает. Я нет.
Вот только хочу предупредить что в строке
нолики ставят исключительно что бы помнить какие биты куда пошли. На конечный результат они не влияют. Больше того, если в регистре была единица, она единицей и останется.
А кто ж его знает. Вернее кто с восьмёркой работал может знает. Я нет.
Вот только хочу предупредить что в строке
нолики ставят исключительно что бы помнить какие биты куда пошли. На конечный результат они не влияют. Больше того, если в регистре была единица, она единицей и останется.
Я чтобы не забыть и оставил их, а предварительно все в ноль сбрасываю строкой выше (ну как я понял).
Мда, нада деда ждать. Он точно с ней работал.
А вопрос то в чём?
Смысл ждать камни, если в Proteus есть Atmega8 ? Хоть обтестируйся ...
А кто ж его знает. Вернее кто с восьмёркой работал может знает. Я нет.
Вот только хочу предупредить что в строке
нолики ставят исключительно что бы помнить какие биты куда пошли. На конечный результат они не влияют. Больше того, если в регистре была единица, она единицей и останется.
Я чтобы не забыть и оставил их, а предварительно все в ноль сбрасываю строкой выше (ну как я понял).
А сбрасывать в 0 строкой выше вовсе необязательно. Гораздо проще в текущей строке заменить "|=" на "=".
А вопрос то в чём?
Вопрос: Правильно ли я выставил "биты" в #12 для активации внешних прерываний (у пинов, куда подключен энкодер)?
Я не знаю, отродясь энкодер на прерывания не вешал. Опрашиваю его раз в 5 мс, да и сё.
А сбрасывать в 0 строкой выше вовсе необязательно. Гораздо проще в текущей строке заменить "|=" на "=".
Так то оно да, но регистр 8 бит и поменяв на = обнулите остальные биты. Если они нули то ладно, а если нет?
А сбрасывать в 0 строкой выше вовсе необязательно. Гораздо проще в текущей строке заменить "|=" на "=".
Так то оно да, но регистр 8 бит и поменяв на = обнулите остальные биты. Если они нули то ладно, а если нет?
Тоже не читатель, а писатель?
Ясно же написано:
...а предварительно все в ноль сбрасываю
Upd. Приношу свои извинения, это я не читатель, а писатель - поверил человеку на слово, не проверив, что на словах и в коде у него далеко не одно и то же.
PS. Кстати, на STM32 эта операция решена изящно - там одновременную установку и в нули, и в единицы можно осуществить единственной записью в порт.
Не во всех. В f1 можно. В f4 регистр поделили и одной записью стало невозможно.
Я не знаю, отродясь энкодер на прерывания не вешал. Опрашиваю его раз в 5 мс, да и сё.
Можно пример кода как это выглядит?
Я, уже и не помню почему, на внешние прерывания энкодер всегда «вешаю» и все отлично работает.
Можно пример кода как это выглядит?
Да прямо вот так
Походу я не догоняю еще такое решение, поэтому на прерываниях все еще :-D
Так как энкодер это не независимый класс, а унаследованный, текст его приводить смысла нет. Найди тут dtsLibAll\src файл dtsEncoder.h и пробежы глазами, если охота.
Дед! Напиши на mail.ru. Надо обсудить кое что.
Дак я не знаю твой mail.ru. Мой - dap68@mail.ru :)))
Дак я не знаю твой mail.ru. Мой - dap68@mail.ru :)))
не из наших ты...nik182 попробуй )))
Так и вспоминается рассказ А. П. Чехова «Ванька» (1886 г.).......На деревню дедушке...:)))) Напиши на mail.ru прямо в меморис.
Чессно говоря, пока некада мне пробовать, я коробки клею, в пятницу сдавать.
Чессно говоря, пока некада мне пробовать, я коробки клею, в пятницу сдавать.
автоматизировал уже бы
Ну не Добродееву же! А всего лишь нику182.
Чессно говоря, пока некада мне пробовать, я коробки клею, в пятницу сдавать.
На кондитерской фабрике работал давным давно. Так там под Новый год все отделы напрягали по 2000 коробок «собрать» для новогодних подарков. Ад какой то )))) А в феврале, оставшиеся не проданными, нужно было распаковать, конфеты в одну сторону - коробки разобрать и сложить. Капец блин )))))
Дед, ты конфетами торгуешь?)))
На каких F1 и F4? Если брать самые распространенные F103 и F401, то вообще-то все ровно наоборот.
Какие будут ваши доказательства?
Из описания f103: С GPIOx_BSRR всё чуть интереснее, младшие 16 бит отвечают за установку 1, старшие 16 бит за сброс в 0. Чтобы установить 1 в нулевой бит, надо в нулевой бит GPIOx_BSRR записать 1. Чтобы установить 0 в нулевой бит, надо в 16 бит установить 1.
В f411 тоже есть такой регистр. BRR нет. Вот на эти грабли я наступил. И за давностью лет всё перепутал. Приходится брать слова обратно. Оба могут одной 32 битной командой сбрасывать и устанавливать.
Нет.
Нет.
обломал, новый года на носу )))
уже полез искать доказательства :) - в частоности референс на F401. пункт 8.3.5 - но Вы и сами поправились
Наверное сейчас глупость спрошу, но куда деваться?
Забрал я с почты Atmega8A сегодня. Решил проверить - прекрасно читаются и шьются. Ну и решил «моргалку» для теста загрузить:
Ну и сначала долго не понимал, почему все прекрасно компилируется, но не работает?
Полез в интернет и нашел, что объявлять пины нужно по другому (ну то есть даже два варианта) - по номерам выводов ардуино и вот так:
А что это за "макросы" тогда такие и где (как) их применять? Имею ввиду вот это:
Они точно как-то описаны, но я не нашел как именно. Прошу прощения, за возможно, глупый вопрос. :-)
c:\Users\user\Documents\ArduinoData\packages\arduino\hardware\avr\1.8.4\variants\standard и вокруг. Лежат файлы pins_arduino.h для установленных плат.
Полноценный проект невозможно перенести с Атмега328 на Атмега8, так недостаточно ОЗУ, даже на Атмега328.
Проекты надо переносить на Атмегу128, для этого их и сделали, это даст возможность расширять и добавлять новые функции )
Даже на Атмеге328 приходится изворачиваться чтобы влезть в 2к ОЗУ, усложняя и урезая код, так что Атмега16 и Атмега8 это не для проектов.
c:\Users\user\Documents\ArduinoData\packages\arduino\hardware\avr\1.8.4\variants\standard и вокруг. Лежат файлы pins_arduino.h для установленных плат.
Может плохо смотрел, но что-то я в этих .h файлах не нашёл этого описания (кстати, описание по типу PIN_PB0, имеется). Получается где-то в другом месте они описаны?
Полноценный проект невозможно перенести с Атмега328 на Атмега8, так недостаточно ОЗУ, даже на Атмега328.
Плохому танцору всегда что-то мешает )))))
Это не проект, это скетч, тест, хелоу-ворлд))
Нужные функции выполняет, а вы можете и дальше демагогию разводить, если сказать по теме нечего.
Та нормальные эти Мега8, жалко только PCINT нету, в отличие от 88-х. А так всё класс.