Адресация ОЗУ

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Прорезались зубы
Сообщения: 246
Зарегистрирован: Пт ноя 22, 2013 22:06:15
Откуда: Липецк

Сообщение igor48 »

Подскажите, правильно ли я понял систему адресации STM32.
Если у нас имеется некая 32-х разрядная переменная с присвоенным адресом в ОЗУ 0x20000000, то реально она хранится по четырем адресам в виде четырех байт:
0x20000000 – младший байт
0x20000001 – второй байт
0x20000002 – третий байт
0x20000003 – старший байт
Т.е. ОЗУ как бы восьмиразрядное.
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение Myp3ik »

ОЗУ имеет побайтовый доступ. Например у TMS320 адресация двухбайтная и к отдельному байту в памяти обратиться нельзя.

"ЦПУ Cortex поддерживает режимы адресации для слов, полуслов, байт и может
осуществлять фрагментированный доступ к данным." (Мартин М. Инсайдерское руководство по STM32)
Иван Сусанин - первый полупроводник :solder:
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Т.е. ОЗУ как бы восьмиразрядное
С чего вдруг??? Это определяется шиной... Но обращаться можно как к байту, слову или полуслову...
"Я не даю готовых решений, я заставляю думать!"(С)
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

igor48 писал(а):Подскажите, правильно ли я понял систему адресации STM32.
Если у нас имеется некая 32-х разрядная переменная с присвоенным адресом в ОЗУ 0x20000000, то реально она хранится по четырем адресам в виде четырех байт:
0x20000000 – младший байт
0x20000001 – второй байт
0x20000002 – третий байт
0x20000003 – старший байт
Т.е. ОЗУ как бы восьмиразрядное.
Можно считать, что так так и есть. Это порядок хранения данных "младший-старший". Сама архитектура ARM поддерживает и его, и порядок "старший-младший", но на практике последний если и встречается, то очень редко.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Та ну??? А STM8??? Не такая уж и редкость...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Прорезались зубы
Сообщения: 246
Зарегистрирован: Пт ноя 22, 2013 22:06:15
Откуда: Липецк

Сообщение igor48 »

Т.е. слово или полуслово можно привязывать к любому адресу?
Например, в СИ установив указатель uint32_t* на 0x20000000, мы считаем 4 байта с 0x20000000 по 0x20000003. Установив его же на 0x20000001, мы считаем 4 байта с 0x20000001 по 0x20000004.
Таким образом, какую бы разрядность реально ОЗУ не имело, для пользователя по принципу доступа оно выглядит как восьмиразрядное?
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение Myp3ik »

Получается, что да :shock:
Иван Сусанин - первый полупроводник :solder:
Прорезались зубы
Сообщения: 246
Зарегистрирован: Пт ноя 22, 2013 22:06:15
Откуда: Липецк

Сообщение igor48 »

Спасибо!
А то что-то совсем мозг вскипел, когда разбирался с битбэндингом.
А может кто нибудь предположить, почему имеем такую странную формулу для вычисления адреса доступа к биту:

BB_ADDR_SRAM = SRAM_BB_BASE + ((SRAM_ADDR - SRAM_BASE) *32) + (BIT * 4)

где: SRAM_BASE — начальный адрес области ОЗУ (0x20000000);
SRAM_BB_BASE — начальный адрес области доступа к битам ОЗУ (0x22000000);
SRAM_ADDR – адрес изменяемого ОЗУ;
BIT – номер изменяемого бита в адресе.

Получается, что в области доступа к битам используется только каждый четвертый адрес ОЗУ, а три - пропускаем.
Это что за фигня такая?
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Посмотрите другие формулы...
Возможно четыре адреса используются каждый для своей операции - для чтения, установки в ноль, установки в единицу и инвертирования бита. Если нет, то эта фигня, которую придумали разработчики по каким-то своим причинам.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

igor48 писал(а):для пользователя по принципу доступа оно выглядит как восьмиразрядное?
Что вы как попугай заладили...
Нет... не восьмиразрядное... Просто у вас есть возможность доступа как к байту, слову и полуслову... но не всегда...
"Я не даю готовых решений, я заставляю думать!"(С)
Прорезались зубы
Сообщения: 246
Зарегистрирован: Пт ноя 22, 2013 22:06:15
Откуда: Липецк

Сообщение igor48 »

HHIMERA писал(а):Что вы как попугай заладили...
Нет... не восьмиразрядное...
Уважаемый HHIMERA!
Ну что вы так невнимательно читаете, а потом горячитесь.
В первый раз я написал: "как бы восьмиразрядное". Во второй раз уточнил: " ... по принципу доступа оно выглядит как...".
Чувствуете разницу. Никто и не утверждает, что оно восьмиразрядное по архитектуре.
Просто в классическом 32-х разрядном ОЗУ изменение адреса на 1 ведет к смещению данных на 32 бита, а здесь это ведет к смещению на 8 бит. И какая там реальная ширина шины данных - хоть 1, хоть 128 бит - это влияет только на скорость считывания.
А вот при размещении 32-х битных переменных в ОЗУ надо учитывать, что адресация у них будет с шагом 4, иначе будут перекрываться.
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Ох уж эти "классики"!!!
Не надо плодить сущности и подменять понятия... и всё...

ПИК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
.

Так что... он "как бы" шестнадцатиразрядный??? А "выглядит как"...
"Я не даю готовых решений, я заставляю думать!"(С)
Прорезались зубы
Сообщения: 246
Зарегистрирован: Пт ноя 22, 2013 22:06:15
Откуда: Липецк

Сообщение igor48 »

HHIMERA
Вот вы цитируете (официальный русский перевод):
"Чтобы предотвратить смещение счетчика команд на один байт относительно команд микроконтроллера в памяти программ, младший бит регистра PLC всегда равен «0». Для адресации команд в памяти программ к счетчику команд всегда прибавляется число 2. "

Здесь, очевидно, речь идет о том, что память микроконтроллеров PIC18 адресуется побайтно, а команды в памяти программ сохраняются как два или четыре байта. Поэтому, чтобы всегда правильно делать выборку кода команды из памяти программ, счетчик команд имеет приращение 2, а младший бит PC всегда читается как «0».

Чет я не понял, где вы здесь усмотрели, что: Так что... он "как бы" шестнадцатиразрядный???
Разрядность микроконтроллера никогда не определялясь длиною команды. Этак PIC16 четырнадцатиразрядным будет.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

А может кто нибудь предположить, почему имеем такую странную формулу для вычисления адреса доступа к биту:

BB_ADDR_SRAM = SRAM_BB_BASE + ((SRAM_ADDR - SRAM_BASE) *32) + (BIT * 4)

Код: Выделить всё

#ifndef _BitBand_h_
#define _BitBand_h_
#include "stm32f10x_lib.h"
/* Private define ------------------------------------------------------------*/
#define RAM_BASE		0x20000000
#define RAM_BB_BASE		0x22000000
#define PERI_BASE		0x40000000  
#define PERI_BB_BASE	0x42000000
/* Private macro -------------------------------------------------------------*/

#define  Var_ResetBit_BB(VarAddr, BitNumber)    \
          (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)) = 0)
   
#define Var_SetBit_BB(VarAddr, BitNumber)       \
          (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)) = 1)

#define Var_GetBit_BB(VarAddr, BitNumber)       \
          (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)))

#define  Perif_ResetBit_BB(VarAddr, BitNumber)    \
          (*(vu32 *) (PERI_BB_BASE | ((VarAddr - PERI_BASE) << 5) | ((BitNumber) << 2)) = 0)
   
#define Perif_SetBit_BB(VarAddr, BitNumber)       \
          (*(vu32 *) (PERI_BB_BASE | ((VarAddr - PERI_BASE) << 5) | ((BitNumber) << 2)) = 1)

#define Perif_GetBit_BB(VarAddr, BitNumber)       \
          (*(vu32 *) (PERI_BB_BASE | ((VarAddr - PERI_BASE) << 5) | ((BitNumber) << 2)))

#define Perif_ToggleBit_BB(VarAddr, BitNumber)\
	  (*(vu32 *) (PERI_BB_BASE | ((VarAddr - PERI_BASE) << 5) | ((BitNumber) << 2)) = 1 -\
          (*(vu32 *) (PERI_BB_BASE | ((VarAddr - PERI_BASE) << 5) | ((BitNumber) << 2))))

//---------------------------------------------------------------------------------
//	example            clear GPIOC->5 bit 
//	                   Perif_ResetBit_BB(&(u32)(GPIOC->ODR),5);
//	#define CLOCK 5
//	#define PORT_CLOCK GPIOC
//	#define CLOCK_LOW() Perif_ResetBit_BB((u32)&(PORT_CLOCK->ODR),CLOCK);
//	#define CLOCK_HI() Perif_SetBit_BB((u32)&(PORT_CLOCK->ODR),CLOCK);
//  #define BITTST1(PORT_CLOCK,CLOCK) Perif_GetBit_BB((u32)&(PORT_CLOCK->IDR), CLOCK)
//---------------------------------------------------------------------------------

#endif //_BitBand_h_

 
сча меня Стас достанет за переопределенные константы...
Вложения
bit_band_memory_alias.jpg
(31.66 КБ) 556 скачиваний
Контактная информация:
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

igor48 писал(а):Установив его же на 0x20000001, мы считаем 4 байта с 0x20000001 по 0x20000004.
igor48 писал(а):Получается, что в области доступа к битам используется только каждый четвертый адрес ОЗУ, а три - пропускаем.
Это что за фигня такая?
Не все процессоры позволяют обращаться к слову (полуслову) по невыровненному по границе слова (полуслова) адресу. Например, STM32F0xxx (Cortex-M0) не может. При таком обращении (не выровненом на границу) будет сгенерировано исключение.
Прорезались зубы
Сообщения: 246
Зарегистрирован: Пт ноя 22, 2013 22:06:15
Откуда: Липецк

Сообщение igor48 »

Да! Похоже, что по поводу «выглядит как восьмиразрядная» я все-таки был неправ. Тогда все встает на свои места. Обращаться к отдельному биту можно только по адресу 32-х разрядного слова, а адреса слов идут с шагом 4. Теперь к формуле битбэндинга вопросов нет. Спасибо, что направили на верный путь.
Ответить

Вернуться в «ARM»