Добрый день! Помогите разобраться с кашей в голове. Вопрос связан с памятью микроконтроллера(например в stm32f407). В микроконтроллере имеется FLASH, RAM и регистровая память. Главный вопрос: физически, это несколько разных памяти? FLASH имеет ограниченный ресурс записи/стирания, а RAM не имеет почему? Регистровая память насколько я понял тоже не имеет ресурса? Почему считывания с RAM осуществляется быстрее чем с FLASH? Если легче обьяснить по аналогии какой-то памяти, то обьясните по аналогии FLASH, с FLASH мне все понятно. У меня нет четкого представления и правильно понимания как это памяти физически существуют, и как с ним обращаться можно а как нельзя.
Проще всего провести аналогию с обычным компьютером. Регистры в процессоре. RAM это основная память куда программы загружаются и где работают. Они без напряжения питания теряют информацию. А ещё есть FLASH на SSD, где информация хранится без напряжения питания. Плата за хранение данных без напряжения - ограниченное количество записей.
В микроконтроллере абсолютно то же самое, только всё запихнули в одну микросхему. Разница только в том, что программа может из flash выполняться.
Ha аглицком теxно-арго "flash" (вcпышка ? ) означает электрическим полем перезаписываемую как-бы-пocтоянную память с хранением эл.заряда в так называемом "плaвaющем" затворе пoлевого транзистора. При перезаписи происходит "туннелирование" зарядов, чтo постепенно ухудшает диэлектрик. Bпрочем дабы не троллить местную рыбу Baм бы пo-xopoшему надо бы поизучать "мат.часть". Hy a Random-Acsess-Memory cуть Память-c-Произвольным-Доступом( нo в pyccкоязычной литepaтуре принято нaзывать "Oперативнoe-Зaпоминающее-Уcтройство ) построена на триггераx (нe путать c чeтвериггерами ! ) Peгистры тоже - вooбще peгистр суть нecколько триггеров ( 4 или 8 или 16 или 32 )
_________________ < виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
В микроконтроллере имеется FLASH, RAM и регистровая память. Главный вопрос: физически, это несколько разных памяти?
Да. Впрочем, "регистровая" это не совсем память, хотя и используется для хранения информации. Но в большей степени это часть процессора.
maksimdag0 писал(а):
FLASH имеет ограниченный ресурс записи/стирания, а RAM не имеет почему?
Именно потому что разные технологии. Флеш (и eeprom), как и сказал petrenko, хранят информацию в количестве электронов, проскочивших сквозь диэлектрик к слою проводника, расположенному между каналом транзистора и его затвором. Если электроном много - транзистор открыт, если мало - закрыт. Сами по себе электроны через диэлектрик не бегают (на то он и диэлектрик), но под действием высокого напряжения все же могут туннелировать. Но это со временем разрушает диэлектрик. А ОЗУ - схема на обычных транзисторах, работающих в обычных режимах. Где-нибудь в усилителе или блоке питания транзисторы ведь без ограничений переключаются. Вот и здесь так же.
maksimdag0 писал(а):
Почему считывания с RAM осуществляется быстрее чем с FLASH?
На самом деле, хороший вопрос. Казалось бы, тоже транзистор, пусть и странной конструкции. Что мешает считать с него информацию мгновенно. Возможно, ради увеличения плотности хранения, в одном транзисторе хранят не один бит, а несколько - разными величинами заряда в затворе. Тогда лишнее время уходит на декодирование. В "компьютерных" флешках это применяется, но в контроллерных - не знаю. Возможно, сама конструкция такого транзистора увеличивает паразитную емкость (хотя в ОЗУ сравнимого объема это почему-то не мешает).
petrenko писал(а):
Hy a Random-Acsess-Memory построена на триггераx
В тех схемах, которые я находил, разница между ОЗУ и регистрами все же есть. Регистры это именно регистры (D-триггеры со всей нужной обвязкой, то есть куча транзисторов). А ячейка ОЗУ - два встречно включенных инвертора, и запись происходит, когда сигнал записи "передавливает" выход одного из них. То есть гораздо более простая штука.
maksimdag0 писал(а):
У меня нет четкого представления и правильно понимания как это памяти физически существуют, и как с ним обращаться можно а как нельзя.
Ну неправильно к ним обращаться это еще надо постараться. К регистрам у вас будет доступ только если вы пишете на ассемблере, и работа с ними вообще не похожа на работу с памятью. Если же пишете на Си, с ними работает компилятор. В ОЗУ будут временные переменные, которые существуют только от включения до выключения, а то и меньше. А в ПЗУ (flash) - статические данные, которые меняться не будут. Код программы, какие-то константы. Случайно перезаписать вы их не сможете: в большинстве контроллеров это специальный сложный процесс. --- А, еще есть регистры периферии, к которым доступ тоже через общее пространство памяти, так называемые Memory-Mapped Input-Output, MMIO. Но они могут быть организованы вообще как угодно.
"регистровая" это не совсем память, хотя и используется для хранения информации. Но в большей степени это часть процессора.
в некоторых mcs регистры это часть аддресного пространства встроенной ram, напр в avr.
и еще замечание - мгновенно считать (и записать) данные, даже когда это простой бинарный бит мешают емкости и индуктивности и сопротивления проводников в схемах. в любых. нужно некое время, сейчас для ядер быстрых процессоров оно измеряется десятками и сотнями pS.
простейшая ячейка cmos sram это 4транзистора триггера хранения (2 закольцованных инвертора) и минимум 1 транзистор выбора этой ячейки в 2мерной матрице (чаще 2 транзистора для ускорения переключения) тоесть 5-6 транзисторов на ячейку=бит.
в случае dram и nvram сама ячейка упрощается с 4 до 1 транзистора с плавающим затвором, либо вообще до конденсатора (затвора без транзистора под ним для dram), в случае nvram усложняется коммутация ячейки для записи, в сумме 1(dram) -3(nvram) транзистора на ячейку. ну и такие ячейки могут хранить до 3 бит (8 уровней потенциала).
и еще замечание - мгновенно считать (и записать) данные, даже когда это простой бинарный бит мешают емкости и индуктивности и сопротивления проводников в схемах. в любых. нужно некое время, сейчас для ядер быстрых процессоров оно измеряется десятками и сотнями pS.
Но конвейеризация эту проблему частично устраняет.
AlexS4 писал(а):
простейшая ячейка
Самое интересное все-таки с флеш. Почему из SRAM чтение "мгновенное", а из флеша, при том же объеме - медленное.
В ОЗУ будут временные переменные, которые существуют только от включения до выключения, а то и меньше. А в ПЗУ (flash) - статические данные, которые меняться не будут. Код программы, какие-то константы. Случайно перезаписать вы их не сможете: в большинстве контроллеров это специальный сложный процесс.
Но конвейеризация эту проблему частично устраняет.
конвейеризация как и любое другое распараллеливание процессов увы не могут сделать реакцию алгоритма мгновенной, никогда , только (иногда) ускорить, до определенных пределов. теоретический предел это автомат выражденый до 1 огромной логической функции и соответственно времени срабатывания этого огромного логического элемента который, как мы знаем, всегда можно представить 2ступенчатой схемой ORxN-AND (или ANDxN-OR), и кстати увеличение схемы неизбежно увеличивает задержки... так что ооочень "частично" .
Добавлено after 14 minutes 37 seconds:
COKPOWEHEU писал(а):
Самое интересное все-таки с флеш. Почему из SRAM чтение "мгновенное", а из флеша, при том же объеме - медленное.
если сравнивать одинаковые архитектуры доступа, и одинаковый техпроцесс, и одинаковую емкость, и хранение только бинарных данных во флэше, то SRAM по скорости чтения будет даже чуть проигрывать флэшу из-за ~ в 2раза менее плотной упаковки (5-6 транзисторов против 3) (тоесть увеличение задержек ~ в квадратный корень из ~2 раз на 2мерной структуре, при прочих равных)
просто архитектуры доступа у встроенной в msc sram и у флэш диска с sata интерфейсом оочень разные...
Ни разу не видел, чтобы этим (адресацией регистров AVR через память) кто-то пользовался.
Запустите компилятор для STM8 - увидите.
Спасибо, но настраивать компилятор под новую архитектуру ради подобной проверки что-то не хочется. Лучше так, в двух словах скажите что именно я там должен увидеть.
jcxz писал(а):
FRAM/MRAM ломает всю вашу логику.
Каким образом? Ну, не говоря о том, что многие вещи я сознательно упрощал для ТСа.
AlexS4 писал(а):
конвейеризация как и любое другое распараллеливание процессов увы не могут сделать реакцию алгоритма мгновенной
Она может сделать так, чтобы к моменту выполнения команды данные уже были готовы. А что весь цикл выполнения команды может занимать больше одного такта, и вообще может быть сдвинут, это другой вопрос.
AlexS4 писал(а):
если сравнивать одинаковые архитектуры доступа, и одинаковый техпроцесс, и одинаковую емкость, и хранение только бинарных данных во флэше, то SRAM по скорости чтения будет даже чуть проигрывать флэшу из-за ~ в 2раза менее плотной упаковки
Про sata мы вообще не говорим, какой sata внутри контроллера. Нет, я говорю про встроенную флеш и встроенную ОЗУ. В stm32 для работы из флеш на максимальной скорости приходится вводить несколько wait-state-ов. А из RAM - нет. При том, что объемы памяти почти одинаковые.
Спасибо, но настраивать компилятор под новую архитектуру ради подобной проверки что-то не хочется. Лучше так, в двух словах скажите что именно я там должен увидеть.
Цитата:
Адреса регистров CPU в STM8: Регистры процессора (CPU) отображены в нулевую страницу памяти (адреса 0x00–0x3F), что позволяет к ним быстро обращаться.
Регистр Адрес Описание CCR (Condition Code Register) 0x7B00 Регистр флагов A (Accumulator) 0x7B01 Аккумулятор XH (High byte of X register) 0x7B02 Старший байт регистра X XL (Low byte of X register) 0x7B03 Младший байт регистра X YH (High byte of Y register) 0x7B04 Старший байт регистра Y YL (Low byte of Y register) 0x7B05 Младший байт регистра Y SPH (High byte of Stack Pointer) 0x7B06 Старший байт указателя стека SPL (Low byte of Stack Pointer) 0x7B07 Младший байт указателя стека Эти регистры можно читать и записывать, но чаще всего используются внутренне ядром.
Быстрый доступ через короткие адреса: Некоторые из этих регистров можно также адресовать в нулевой странице (0x00–0x3F) для более эффективного доступа.
Пример:
CCR доступен по адресу 0x00 A доступен по адресу 0x01 XH и XL доступны по 0x02 и 0x03
Кроме того - IAR для STM8 создаёт ещё несколько виртуальных регистров. В качестве которых выступают младшие адреса ОЗУ.
Тем, что на МК, имеющих FRAM вместо FLASH, программист сам может назначать - какая часть FRAM у него в программе == volatile memory (ОЗУ), а какая == non-volatile memory (ПЗУ). Т.е. - нет жёсткой зависимости: ОЗУ/ПЗУ <=> FRAM. Скорее это больше будет зависеть от настроек модуля защиты памяти. И сиё вельми удобно.
В stm32 для работы из флеш на максимальной скорости приходится вводить несколько wait-state-ов. А из RAM - нет.
Это на STM32. А на ней свет клином не сошёлся. Например XMC4xxx просто имеют шину к FLASH шириной = 256 бит. Что позволяет блоку предвыборки на линейных участках кода успевать читать код почти без задержек на макс.скорости. Хотя wait states там тоже есть. Скорее - для ветвлений и чтения const-данных.
PS: Tiva от TI насколько помню - тоже имеют 256-битную шину к FLASH.
Это на STM32. А на ней свет клином не сошёлся. Например XMC4xxx просто имеют шину к FLASH шириной = 256 бит. Что позволяет блоку предвыборки на линейных участках кода успевать читать код почти без задержек на макс.скорости.
STM32 c 256-ти битной шиной к флешу тоже есть, но у них частота 550 MHz, а не 144, как у XMC4xxx, потому и 3WS может быть.
Тем, что на МК, имеющих FRAM вместо FLASH, программист сам может назначать - какая часть FRAM у него в программе == volatile memory (ОЗУ), а какая == non-volatile memory (ПЗУ).
В тех исчезающе редких случаях, когда контроллер вообще оборудован FRAM - возможно. Но таких мало. Да и вообще, мы в теме по stm32.
jcxz писал(а):
апример XMC4xxx просто имеют шину к FLASH шириной = 256 бит. Что позволяет блоку предвыборки
В stm32 тоже ширина шины команд намного больше 32 бит и тоже есть блок предвыборки. Но это все костыли, чтобы хоть как-то компенсировать медленный доступ к флеш. А вопрос-то был не про костыли, а про физику.
Добрый вечер! Замотался последние дни, не было времени почитать, ответить. Сейчас, хоть в 1:50 почитал все, наверное нужно будет на свежую голову еще прочитать все)
Кажется я не правильно понимаю что такое конретно"регистровая память", ведь под этим выражением я имел в виду регистры периферии. Я так понял "регистрвоая память" это регистры, которые находятся в процессоре "R0, R1, R2 и тд"? Если да, то регистры периферии прцоессора(например FPU, NVIC) они относятся "к регистровой памяти"? регистры процессора и регистры периферии по технологии одинковые? Возможно вопрос глупый, но сейчас особо голова не варит, и пока каша в голове не ушла, не судите строго.
ажением я имел в виду регистры периферии. Я так понял "регистрвоая память" это регистры, которые находятся в процессоре "R0, R1, R2 и тд"? Если да, то регистры периферии прцоессора(например FPU, NVIC) они относятся "к регистровой памяти"? регистры процессора и регистры периферии по технологии одинковые? Возможно вопрос глупый, но сейчас особо голова не варит, и пока каша в голове не ушла, не судите строго.
Если вы говорите "память" то подразумеваете именно временное хранение некого числа. Т.е., функционал запомнить без изменений и вернуть когда надо. И это действительно обычные GPR (General-Purpose Registers, т.е. регистры общего назначения). Но если вы говорите за то, что значение в регистре должно хранить настройку аппаратуры, то это уже не GPR а SFR (Sepcial Function Register, т.е. регистр особой функции) и предназначен он не временно хранить какое-то число а хранить настройку или статус оборудования. А вот находиться SFR может как внутри ядра процессора (например, уже упомянутый NVIC для ARM) так и снаружи него на стороне оборудования (например, UART или SPI).
_________________ Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ Актуальность репозитория: 6 декабря 2025 года Если чего-то не хватает с сайта st.com - пишите, докачаю.
Кажется я не правильно понимаю что такое конретно"регистровая память", ведь под этим выражением я имел в виду регистры периферии. Я так понял "регистрвоая память" это регистры, которые находятся в процессоре "R0, R1, R2 и тд"?
Есть такая электронная схема - регистр. Соответственно под регистровой памятью логично рассматривать именно память, собранную из регистров. Для сравнение, SRAM собрана не на регистрах, а на встречно включенных инверторах. DRAM вообще на одном конденсаторе. Flash на одном транзисторе необычной структуры.
maksimdag0 писал(а):
я имел в виду регистры периферии
Регистры периферии могут быть устроены как угодно. Скажем, GPIO->IDR наверняка будет не регистром, а массивом повторителей с ножек порта. GPIO->ODR - регистром. GPIO->BSRR - специальной схемой, которая обращается к тому же GPIO->ODR. И это только примеры регистров GPIO - самой простой периферии.
maksimdag0 писал(а):
то регистры периферии прцоессора(например FPU, NVIC) они относятся "к регистровой памяти"?
Так периферии или процессора? Еще раз: регистры процессора (r0, r1, ft0 (не знаю используются ли в arm специальные FPU-регистры) и т.п.) это регистры, они устроены по одному принципу. А периферия (GPIO, Timer, NVIC) - каждая по-своему, в зависимости от задачи.
maksimdag0 писал(а):
К чему бы не обращались, к RAM, FLASH и или регистрам, мы всегда обращаемся через общее пространство памяти, разве нет?
Строго говоря, не всегда. Скажем, к регистрам в ARM обратиться через память, кажется, нельзя. В AVR к периферии можно обратиться как через память, так и специальными инструкциями in, out, sbi, ... В risc-v есть специальные ядерные CSR-регистры, к которым обращение возможно только через специальные инструкции.
Есть такая электронная схема - регистр. Соответственно под регистровой памятью логично рассматривать именно память, собранную из регистров. Для сравнение, SRAM собрана не на регистрах, а на встречно включенных инверторах.
увы, регистровыми (или буфферными) называются микросхемы dram, внутри которых на шинах адреснов и/или данных стоят регистры-буферы, позволяющие изменить диаграмы доступа так, что схема становится менее чувствительной к емкости шины, за счет удлииннения некоторых фаз обмена, и соответственно позволяет навешать побольше чипов на 1 шину. например в серверных мамках обычно до 24 модулей c буфферными чипами а в бытовых - только 2-4 безбуферных модуля.
а применение кольца слабеньких инверторов для хранения бита - это оптимизация: всего 4+1 или 4+2 транзистора, если взять набор(регистр) из rs триггеров то транзисторов на бит ячейки станет 8+5 - это в 2+! раза больше. ...а если взять d триггер то вообще
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения