Т.е и так тоже можно? *(__IO uint32_t*)0x40000000 = 0x5555AAAA;
Получается 0x40000000 это тот адрес, который лежит в указателе, а *(__IO uint32_t*)0x40000000 это обращение по этому адресу, который лежит в указателе?
Не совсем понял, какой указатель. В Вашей записи он присутствует неявно (к нему приводится число 0x40000000), но он тут же разыменовывается. Но вообще гляньте на предыдущей странице моё последнее сообщение в конце.
Указатель - не обязательно переменная. В нашем случае он константа, численно равная 0x40000000. А уже там, по этому адресу, лежит переменная.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Указатель - не обязательно переменная. В нашем случае он константа, численно равная 0x40000000.
Вот! Именно это никто не говорит в курсах про Си. Там явно и однозначно говорят, что указатель это такая переменная, которая.. бла бла. А то, что он может быть константой я нигде не видел! И теперь у меня колапс головного мозга, как уложить то, что просто константа (по сути цифра) может тоже быть указателем.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Вся эта конструкция (volatile uint32_t*)0x40000004 - это и есть тот самый ptr. Отдельное имя ему выделять не обязательно. Удобнее выделить отдельное имя сразу для *ptr
Добавлено after 3 minutes 38 seconds:
СКАЗОЧНИК писал(а):
Именно это никто не говорит в курсах про Си. Там явно и однозначно говорят, что указатель это такая переменная, которая.. бла бла
Вы так говорите, как будто не использовали никогда константных строк или константных массивов.
А ведь разницы никакой нет. Когда мы пишем, например, const int buf[] = {5, 3, 4, 2}; - мы ведь точно так же имеем buf - константный указатель. Просто в этом случае компилятор где-то разместит этот массив в памяти (во flash-памяти, например) и присвоит buf-у константный указатель на это место. А в наших примерах мы можем делать это руками, так как адреса периферий фиксированные.
Видимо, я очень плохо соображаю в Си. что так и есть. Даже констаный массив, который Вы описали имеет имя. И я его вижу именно по имени, а не цифрами в виде адреса. ))))))) А то, что потом с ним сделает компилятор уже его дело. В наших же вышеуказанных примерах, имен все равно нету. Есть конечное объявление (через дефайн) на обращение по указателю. Короче, я понял, что мне не хватает. ) Одного урока по Си, где бы были примеры и варианты использования констант как указателей. Что не обязательно задвать указателю имя, как переменной и что он вообще может не являться перменной. А может быть реальной константой и при этом без имени, а тупо само число. И компилятор все это нормально схавает. Конечно, с учетом среды, где все это используется. Если это программирование для РС, то может и выкинут, если залезть в неразрешенный адрес, а если это МК, то адреса можно посмотреть в рефренс мануале.
Обратите внимание, как при доступе по адресу 0x40000004 был использован базовый адрес 0x40000000 и смещение 4 от него. Точно так же осуществляется доступ к полям структуры смещением от базового адреса.
А может быть реальной константой и при этом без имени, а тупо само число.
Не тупо само число!!! Вы же делаете приведение типа от числа к указателю. Результат этого приведения и есть указатель. Тупо записать в число, конечно же, ничего нельзя.
Добавлено after 4 minutes 15 seconds: А теперь найдите хоть одно отличие
Так нельзя, это синтаксическая ошибка. Разыменовывать просто число нельзя.
А вот разыменовать это же число, приведённое к конкретному указателю - можно. Хотя формально и то и другое - одно и то же число, но в одном случае - это просто число, а во втором - адрес некоторой ячейки.
Кстати, в примере ниже результат будет тоже разный, несмотря на "одно и то же число"
Правильно я понмаю, что превое - это указатель на область памяти в 32 бита с адресом 0x40000000, и в эту область можно нормально записать число 0x5555AAAA, а в два других уже не влезет.? Хоть эта область расположена по этому же адресу...
Ну, тут уже дело техники. ) Сам смысл понятен, что можно от традиционного АВР получить что-то похожее на СТМ. ) И если изначально так бы было, то переход с тех же АВР был бы легче.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 60
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения