в противном случае оптимизатор был неотключаем вообще и тотально,
И это правильно. Имеет смысл один раз выставить оптимизацию на максимум (по размеру или скорости). Правильно написанная программа должна работать с любыми ключами оптимизации.
Martian, доступ к регистрам обязан быть волатильным, иначе будут неописуемые косяки.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Да? А по-моему, надо. А эти ваши "укажи волители и всё будет хорошо", "включи оптимизатор и всё будет работать" или "делать надо так, чтобы работало всегда при любых опциях" - так что ли, учить надо? Показывая крайне частные, и зачастую не имеющие практического смысла примеры, притом, без объяснения, почему? А также без приведения и других вариантов, дающих тот же эффект справа. Но зачем? Новичку так ничего не будет понятно, он просто шаблонно и бездумно повторит. А неновичку сообщения о каких-то там доступах к регистру с косяками не нужно. VladislavS, скажите мне, почему надо делать чтение из регистра волатильным? Что именно плохого, если нет? И, кстати, на ноль делить можно.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
почему надо делать чтение из регистра волатильным? Что именно плохого, если нет?
регистр, как правило, связан с аппаратурой, .е. его значение может измениться в любой момент, т.е. даже между двумя подряд идущими считываниями. компилятор об этом знать не может, поэтому может посчитать, что вместо двух подряд идущих считываний можно сделать одно и использовать результат дважды, т.е. он как бы может закэшировать считанные данные и второй раз к регистру уже не обращаться. volatile обязывает его всякий раз, когда встречается имя этой переменной, осуществлять реальный физический доступ к соответствующей области памяти. даже в таком случае:
Код:
volatile uint32_t *reg = 123456;
*reg;
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
ARV, если посмотреть на foo1() с моей картинки, то видно, что он может вообще ни одного чтения не сделать. Он как бы говорит: "Мальчик, ты дурак? Возьми конфетку (true) и иди отсюда."
Рекомендую прочесть http://www.pic24.ru/doku.php/osa/articl ... r_chainiks - это более полно объясняет, чем неполные ответы на форуме (я не говорю - плохие, просто неполные). К сожалению, статьи про методы оптимизации и использования оптимизаторов не могу порекомендовать, не попадалась.
jcxz, uint32_t *ptr = 0x40020000; // объявляем указатель *ptr = 1024; // по адресу указателя пишем новое значение. Проверил в CubeIDE, компилируется и работает в железе.
И что? Вы увидели, что в данном конкретном компиляторе с данными конкретными ключами оптимизации - работает. И что? Не понятно, что хотели этим сказать.....
Прекрасно неволатильно читаю из регистров без косяков. Всяких, описуемых и нет.
Попробуйте немного оторваться от клавиатуры, включить голову и подумать почему именно так происходит. И почему происходит как в примере VladislavS. Вроде как всё должно быть само собой понятным.
скажите мне, почему надо делать чтение из регистра волатильным? Что именно плохого, если нет?
Надо делать (обязательно) его таким, только если важен сам факт чтения. Если же важно только прочитанное значение - не надо (не обязательно). Опять-же советую подумать над этим. Т.е. - задействовать голову, а не пальцы на клавиатуре.
jcxz, спасибо за совет подумать, но, боюсь, он лишний - всё это уже обдумано-продумано. Я задал вопрос не потому, что нуждаюсь в ответе, а потому, что на подобные вопросы начинающих отвечают неверно, неполно и неправильно, и с ужасными (да-да) примерами. Вот Вы активно пометили мнение о правильной программе, обязанной работать при любых уровнях оптимизации. Может, тогда Вы мне ответите, зачем тогда куча уровней оптимизации? Показать бы такое мнение чувакам из Микрочипа, которые вечно оговаривают условие успешной компиляции и работоспособности...
VladislavS, ну вот, уже ближе к телу ) С XC8 там достаточно много подобного было. Один фреймворк усб чего стоил. Сейчас, правда, не знаю, давно ушел от пиков, может, теперь у них всё идеально.
Зарегистрирован: Пн ноя 04, 2019 09:58:29 Сообщений: 102 Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения:0
Добрый вечер. Переписал все библиотеки для дисплейчика SSD1306 128х64 с ардуиновского на чистый С++. Дело конечно кропотное. Прошел весь тест. Всё работает. Приобрел некоторый практический опыт программирования (классы, темплеты ну и пр.) Вопрос у меня скорее организационный - архив 3.3M не загружается (там и модель в Протеусе) Как быть господа коты?
Для таких вещей есть сосфорж, гитхаб, битбакет, гитлаб и т.д., и т.п.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Зарегистрирован: Пн ноя 04, 2019 09:58:29 Сообщений: 102 Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения:0
Добрый вечер. Экспериментально установил, что если; #define MIN(a,b) (((a)<(b))?(a):(b)) #define MAX(a,b) (((a)>(b))?(a):(b)) компилятор выдает; Program Memory Usage : 16374 bytes 50,0 % Full а если; inline static bool MIN( auto a, auto b ){ return (((a)<(b))?(a):(b)); } inline static bool MAX( auto a, auto b ){ return (((a)>(b))?(a):(b)); } то; Program Memory Usage : 15016 bytes 45,8 % Full Говорил в миру один - "макросы зло!"
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения