Подскажите, правильно ли я понял систему адресации STM32.
Если у нас имеется некая 32-х разрядная переменная с присвоенным адресом в ОЗУ 0x20000000, то реально она хранится по четырем адресам в виде четырех байт:
0x20000000 – младший байт
0x20000001 – второй байт
0x20000002 – третий байт
0x20000003 – старший байт
Т.е. ОЗУ как бы восьмиразрядное.
ОЗУ имеет побайтовый доступ. Например у TMS320 адресация двухбайтная и к отдельному байту в памяти обратиться нельзя.
"ЦПУ Cortex поддерживает режимы адресации для слов, полуслов, байт и может
осуществлять фрагментированный доступ к данным." (Мартин М. Инсайдерское руководство по STM32)
igor48 писал(а):Подскажите, правильно ли я понял систему адресации STM32.
Если у нас имеется некая 32-х разрядная переменная с присвоенным адресом в ОЗУ 0x20000000, то реально она хранится по четырем адресам в виде четырех байт:
0x20000000 – младший байт
0x20000001 – второй байт
0x20000002 – третий байт
0x20000003 – старший байт
Т.е. ОЗУ как бы восьмиразрядное.
Можно считать, что так так и есть. Это порядок хранения данных "младший-старший". Сама архитектура ARM поддерживает и его, и порядок "старший-младший", но на практике последний если и встречается, то очень редко.
Т.е. слово или полуслово можно привязывать к любому адресу?
Например, в СИ установив указатель uint32_t* на 0x20000000, мы считаем 4 байта с 0x20000000 по 0x20000003. Установив его же на 0x20000001, мы считаем 4 байта с 0x20000001 по 0x20000004.
Таким образом, какую бы разрядность реально ОЗУ не имело, для пользователя по принципу доступа оно выглядит как восьмиразрядное?
Спасибо!
А то что-то совсем мозг вскипел, когда разбирался с битбэндингом.
А может кто нибудь предположить, почему имеем такую странную формулу для вычисления адреса доступа к биту:
где: SRAM_BASE — начальный адрес области ОЗУ (0x20000000);
SRAM_BB_BASE — начальный адрес области доступа к битам ОЗУ (0x22000000);
SRAM_ADDR – адрес изменяемого ОЗУ;
BIT – номер изменяемого бита в адресе.
Получается, что в области доступа к битам используется только каждый четвертый адрес ОЗУ, а три - пропускаем.
Это что за фигня такая?
Посмотрите другие формулы...
Возможно четыре адреса используются каждый для своей операции - для чтения, установки в ноль, установки в единицу и инвертирования бита. Если нет, то эта фигня, которую придумали разработчики по каким-то своим причинам.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
HHIMERA писал(а):Что вы как попугай заладили...
Нет... не восьмиразрядное...
Уважаемый HHIMERA!
Ну что вы так невнимательно читаете, а потом горячитесь.
В первый раз я написал: "как бы восьмиразрядное". Во второй раз уточнил: " ... по принципу доступа оно выглядит как...".
Чувствуете разницу. Никто и не утверждает, что оно восьмиразрядное по архитектуре.
Просто в классическом 32-х разрядном ОЗУ изменение адреса на 1 ведет к смещению данных на 32 бита, а здесь это ведет к смещению на 8 бит. И какая там реальная ширина шины данных - хоть 1, хоть 128 бит - это влияет только на скорость считывания.
А вот при размещении 32-х битных переменных в ОЗУ надо учитывать, что адресация у них будет с шагом 4, иначе будут перекрываться.
Ох уж эти "классики"!!!
Не надо плодить сущности и подменять понятия... и всё...
ПИК18... восьмиразрядный, между прочим...
To prevent the PC from becoming misaligned with word
instructions, the Least Significant bit of PCL is fixed to
a value of ‘0’. The PC increments by 2 to address
sequential instructions in the program memory.
Так что... он "как бы" шестнадцатиразрядный??? А "выглядит как"...
"Я не даю готовых решений, я заставляю думать!"(С)
HHIMERA
Вот вы цитируете (официальный русский перевод):
"Чтобы предотвратить смещение счетчика команд на один байт относительно команд микроконтроллера в памяти программ, младший бит регистра PLC всегда равен «0». Для адресации команд в памяти программ к счетчику команд всегда прибавляется число 2. "
Здесь, очевидно, речь идет о том, что память микроконтроллеров PIC18 адресуется побайтно, а команды в памяти программ сохраняются как два или четыре байта. Поэтому, чтобы всегда правильно делать выборку кода команды из памяти программ, счетчик команд имеет приращение 2, а младший бит PC всегда читается как «0».
Чет я не понял, где вы здесь усмотрели, что: Так что... он "как бы" шестнадцатиразрядный???
Разрядность микроконтроллера никогда не определялясь длиною команды. Этак PIC16 четырнадцатиразрядным будет.
igor48 писал(а):Установив его же на 0x20000001, мы считаем 4 байта с 0x20000001 по 0x20000004.
igor48 писал(а):Получается, что в области доступа к битам используется только каждый четвертый адрес ОЗУ, а три - пропускаем.
Это что за фигня такая?
Не все процессоры позволяют обращаться к слову (полуслову) по невыровненному по границе слова (полуслова) адресу. Например, STM32F0xxx (Cortex-M0) не может. При таком обращении (не выровненом на границу) будет сгенерировано исключение.
Да! Похоже, что по поводу «выглядит как восьмиразрядная» я все-таки был неправ. Тогда все встает на свои места. Обращаться к отдельному биту можно только по адресу 32-х разрядного слова, а адреса слов идут с шагом 4. Теперь к формуле битбэндинга вопросов нет. Спасибо, что направили на верный путь.