Новый микроконтроллер toshiba предлагает самую большую в своем классе внутрикристальную sram-память

Организация памяти микроконтроллера

 

Большинство современных микроконтроллеров имеют Гарвардскую архитектуру и содержат 3 вида  памяти:

  • память программ FLASH;
  • оперативная память (ОЗУ) SRAM (Static RAM);
  • энергонезависимая память данных EEPROM.

Адресные пространства указанных видов памяти, как правило, разделены. Способы адресации и доступа к этим областям памяти также различны.

Такая структура позволяет центральному процессору работать одновременно как с памятью программ, так и с памятью данных, что существенно увеличивает производительность.

Каждая из областей памяти данных (SRAM и EEPROM) также расположена в своем адресном пространстве.

Память программ

Память программ представляет собой электрически стираемое ППЗУ (FLASH) и может поддерживать команды с разрядностью больше 8 бит. В некоторых микроконтроллерах память программ разделена на 2 секции:

  • секцию загрузчика (Boot Program);
  • секцию прикладных программ (Application Program).

Память программ чаще всего является электрически перепрограммиру­емой, количество циклов перезаписи превышает 10 тысяч.

Большинство микроконтроллеров поддерживают внутрисхемное программирование, т. е. загрузку программы в микроконтроллер можно осуществлять после монтажа на плату посредством специального разъема программирования.

Для адресации памяти программ используется счетчик команд (Program Counter – PC).

В памяти программ также находится вектор сброса — в момент подачи питания микроконтроллер начинает выполнение программы с этого адреса, и здесь размещается команда перехода к началу исполняемой программы. Кроме того, память программ содержит таблицу векторов прерываний.

При возникновении прерывания после сохранения в стеке текущего значения счетчика команд происходит выполнение команды, расположенной по адресу соответствующего вектора. Поэтому по данным адресам располагаются команды перехода к подпрограммам обработки прерываний.

Положение вектора сброса и таблицы векторов прерываний может быть перенесено из секции прикладных программ в секцию загрузчика.

В некоторых случаях память программ может использоваться не только для хранения кода программы, но и для хранения различных констант.

Оперативная память

Оперативная память, как правило, содержит 3 области:

  • регистры общего назначения;
  • служебные регистры;
  • память для хранения данных.

Регистры общего назначения (РОН) находятся в непосредственной близости к АЛУ. Однако в микроконтроллерах некоторых фирм (в частности, PIC фирмы Microchip) имеется только один рабочий регистр, играющий роль одного из операндов в командах.

Применение набора регистров общего назначения в сочетании с конвейерной обработкой позволяет АЛУ выполнять одну операцию (извлечение операндов из набора регистров, выполнение команды и запись результата обратно в регистр) за один такт.

Служебные регистры имеют свои имя, адрес и назначение. Они предназначены для конфигурации и обслуживания периферийных узлов микроконтроллера. Краткая характеристика служебных регистров должна быть приведена в руководстве по использованию микроконтроллера (Data Sheet).

Среди служебных регистров есть, как правило, один регистр, используемый наиболее часто в процессе выполнения программ. Это регистр состояния. Он содержит набор флагов, показывающих текущее состояние микроконтроллера.

Большинство флагов автоматически устанавливаются в «1» или сбрасываются в «0» при наступлении определенных событий (в соответствии с результатом выполнения команд). Все биты этого регистра доступны как для чтения, так и для записи. Эта информация анализируется при выполнении условных переходов.

При возникновении прерываний содержимое регистра состояния необходимо сохранять программно (чаще всего это является «заботой» компилятора).

Остальная часть оперативной памяти предназначена для хранения пользовательских данных.

Энергонезависимая память данных

Энергонезависимая память данных (EEPROM) организована таким образом, что содержимое каждого байта отдельно может быть считано или записано. Количество циклов перезаписи энергонезависимой памяти превышает 100 тысяч. Энергонезависимая память предназначена для хранения настроек и конфигурации программы, то есть тех данных, которые должны сохраняться при пропадании питания.

Чтение и запись данных в EEPROM, как правило, осуществляется посредством использования соответствующих регистров из области служебных регистров SRAM. Как правило, это:

  • регистр адреса при обращении к EEPROM;
  • регистр данных, считанных/записанных в EEPROM;
  • регистр управления чтением-записью EEPROM.

Назад

Назад: Программирование микроконтроллеров

Источник: https://prog-cpp.ru/micro-memory/

ReRAM – что это – ещё одна новая технология памяти

После нескольких лет некоторого затишья, когда новостей об успехах в одной из перспективных технологий памяти ReRAM не было почти никаких, наконец то появились обнадеживающие заявления.

Так, ряд компаний объявил, что удалось преодолеть возникшие сложности и они готовы начать промышленное производство чипов.

ReRAM – что это за технология, что сулит ее применение, каковы перспективы ее использования? Разберемся…

Суть технологии

Сначала выясним, что это такое – ReRAM. Как следует из названия, ReRAM (Resistive RAM) использует изменение сопротивления ячейки для хранения и считывания из нее информации.

Принцип действия таков. Между двумя электродами расположен слой диэлектрика. Изначально он имеет высокое сопротивление. При определенном воздействии на него (например, прикладывании напряжения определенного уровня), в нем появляются токопроводящие нити, т. е., фактически, он перестает быть диэлектриком. При изменении полярности приложенного напряжения эти токопроводящие линии разрушаются.

Приложив меньшее напряжение, можно определить проходящий через ячейку ток, и по его уровню узнать, какое значение (0 или 1) в ней хранится, т. е. выполнить операцию чтения. Среди явных достоинств то, что ReRAM – память с произвольным доступом, т. е., в отличие от используемой сейчас NAND, есть доступ к отдельной ячейке, а не к страницам данных.

Технология ReRAM не так проста, как хотелось бы, но процесс производства хоть и имеет свои особенности, но не слишком сложен. Тут можно провести аналогии с альтернативной памятью STT-MRAM.

Изготовление во многом схожее, выполняется в основном на backend-of-line (BEOL) фабрике, где на уже подготовленную пластину со сформированным нижним электродом наносятся слои ячеек, осуществляется их соединение и завершается изготовление чипа.

Можно сказать, что основная проблема состоит не в изготовлении микросхемы, а обеспечении ее работоспособности и достижения нужных характеристик.

Существует несколько разновидностей такой памяти, различающихся применением различных материалов для изготовления ячеек. Основными считаются OxRAM и CBRAM. Объединяет их то, что используются два электрода, верхний и нижний, между ними находится слой меняющего свои свойства диэлектрика, и вот в нем-то как раз и кроются различия.

OxRAM (Oxide-based ReRAM – металл-оксидная RAM)

OxRAM (Oxide-based ReRAM – металл-оксидная RAM). В качестве носителя заряда выступают вакансии кислорода. При приложении к электродам положительного напряжения возникает диффузия атомов кислорода и в диэлектрическом слое возникают токопроводящие линии.

В качестве активного слоя используются различные соединения. Так, Panasonic использует пентаоксид тантала (Ta2O5). Сейчас более выигрышным является двуслойная ассиметричная структура Ta2O5/TaO2-x. Может использоваться диоксид гафния HfO2 или другие соединения.

В прошлом году Panasonic в кооперации с Fujitsu продемонстрировали второе поколение такой памяти. Если в первом варианте использовался 180-нанометровый техпроцесс, то сейчас готовится переход на 40-нм техпроцесс. В более тонком техпроцессе используются те же материалы для изготовления слоев ячейки, но их количество и расположение несколько отличается.

Panasonic использует архитектуру 1T1R (one-transistor one-resistor – один-транзистор один-резистор). Одним из недостатков ее является то, что транзистор довольно велик по размерам, чтобы обеспечить нужное значение тока. Это ограничивает возможности уменьшения ячеек и повышение плотности их размещения на кристалле.

Существуют и альтернативные варианты, например, 1D1R (один диод Шоттки и один резистор), 2D1R (два диода и резистор) и т. п. Эти структуры предназначены для снижения ошибок считывания из ячеек, когда возникает риск возникновения токов утечки через соседние ячейки с низким сопротивлением.

Есть и еще один недостаток. Долговечность ячеек не так высока, как хотелось бы, хотя она выше, чем у NAND памяти. Связано это, судя по всему, с изменением свойств ячейки после многих тысяч переключений. Физика этих изменений пока не вполне ясна.

CBRAM (conductive-bridging RAM

В отличие от металл-оксидного варианта, в активный слой из аморфного кремния внедряются атомы меди или серебра для создания токопроводящих мостиков.

При этом один из электродов сделан из инертного металла (например, вольфрама), а второй – из химически активного (например, медь или серебро).

При появлении на электродах напряжения, ионы металла выстраиваются в мостик, по которому и проходит ток. CBRAM требует более низкого напряжения для программирования ячеек.

Одним из основных разработчиков этого варианта ReRAM является стартап Crossbar. Как уверяют представители компании, конкурирующая вариация технологии (OxRAM) имеет ряд недостатков.

Так, соотношение уровней напряжений во включенном и выключенном состояниях не такое большое, как у CBRAM. Это позволяет говорить о лучшей способности CBRAM к переходу на более тонкие техпроцессы.

Сейчас уже практически есть возможность выпускать чипы по 40 нм техпроцессу, и ведутся разработки по переходу на более тонкие, вплоть до 1x нм техпроцессы.

Но более важным является то, что CBRAM имеет более низкие задержки при операциях чтения, а также более высокую производительность при записи. Одновременно ведутся работы над использованием двух различных архитектур – 1T1R и многослойной памяти.

При этом различные варианты ориентированы на различные же сферы применения. 1T1R хорошо показывает себя в качестве встроенной памяти, а многослойная – для построения запоминающих устройств.

В многослойном варианте архитектуры один транзистор может управлять несколькими ячейками, что само по себе позволяет более плотно разместить элементы на кристалле. Так, 4-слойная структура, выполненная по 16 нм техпроцессу, позволяет получить чип емкостью в 32 ГБ.

Кто работает над технологией ReRAM

Как уже упоминалось, активнейшими разработчиками являются Panasonic с Fujitsu и Crossbar. Несколько лет этой темой совместно занимались компании Sony и Micron, но не так давно последняя вышла из этого проекта, т. к. переключилась на разработку вместе с Intel памяти 3D XPoint. Свои исследования ведут HP с Western Digital, 4DS, Adesto.

Тем не менее, ряд разработчиков отдает предпочтение альтернативным технологиям. Так, GlobalFoundries, Toshiba-SK Hynix, Micron и ряд других делают ставку на STT-MRAM. На эту память переключил свои силы и Samsung.

Лицензию на производство памяти ReRAM получил китайский контрактный производитель чипов SMIC, который начал выпуск этой памяти по 40 нм техпроцессу. В ближайшее время ожидается переход на 28 нм техпроцесс. Недавно такие производители, как TSMC и UMC также включили память ReRAM в свои планы выпуска продукции.

Применение

Активная работа над перспективными вариантами памяти основывается на том факте, что используемые сейчас DRAM и NAND имеют свои специфические недостатки. Первая – быстрая, но энергозависима, вторая – не боится отключения напряжения питания, сохраняет данные, но медленная, не имеет побитового доступа к данным, да и с долговечностью не все так уж хорошо.

Альтернативные технологии памяти позволяют объединить достоинства традиционных видов памяти. Это и высокая скорость работы, и побитовый доступ, и сохранность информации при пропадании напряжения, и долговечность, и отсутствие необходимости очистки ячейки перед записью в нее новых данных…

Проблема в сложности новых технологий, необходимости использования новых материалов, порой, непривычных, нового оборудования, новых технологических цепочек. И все же постепенно новые типы памяти появляются и начинают занимать свои ниши. Именно так воспринимаются перспективы применения новых технологий. Каждая из них займет свое место.

Наиболее близки к промышленному производству и применению 3D XPoint и STT-MRAM. Хотя, собственно, почему близки? 3D XPoint уже используется в накопителях Intel Optane, STT-MRAM также постепенно начинает применяться. На той или иной стадии завершения разработки памяти на нанотрубках, FRAM, да и герой сегодняшнего рассказа – ReRAM.

Например, производимые Fujitsu-Panasonic чипы емкостью 4 Мб имеют большую плотность размещения ячеек, чем EEPROM. Учитывая это, а также то, что ReRAM потребляет меньше энергии, делает применение ее экономически выгодным там, где не требуются высокие скорости записи, но стоимость является одним из важных критериев. Как пример – замена EEPROM.

В то же время MRAM, учитывая высокую скорость работы, ориентируется на применение в микроконтроллерах, в различных устройствах, в том числе, в перспективе, для возможной замены NAND в устройствах хранения и т. п.

Источник: https://andiriney.ru/reram-chto-eto/

Типы памяти встраиваемых систем

Рисунок 1. Типы памяти, часто встречающиеся во встроенных системах

Типы озу (ram)

   Семейство ОЗУ содержит два важных типа запоминающих устройств: статическое ОЗУ (SRAM) и динамическое ОЗУ (DRAM). Главное различие между ними – это долговечность хранимых ими данных.

SRAM сохраняет свое содержимое до тех пор, пока к микросхеме подается энергия. Если же энергия отключена, или временно отсутствует, содержимое чипа будет потеряно навсегда.

DRAM, с другой стороны, имеет чрезвычайно короткий период продолжительности работы данных – обычно около четырех миллисекунд, даже если энергия подается непрерывно.

   Словом, SRAM имеет все свойства памяти, с которыми ассоциируется слово RAM. В сравнении с ней, DRAM кажется, как будто бы, бесполезной. Сама по себе, она таковой и является.

Однако можно использовать простой элемент конструкции, именуемый контроллером DRAM, для того, чтобы DRAM вела себя скорее как SRAM. Работа контроллера DRAM заключается в периодическом обновлении данных, хранящихся в DRAM.

Обновляя данные до того, как они исчезнут, содержимое памяти может сохраняться так долго, как это необходимо. Таким образом, DRAM так же эффективна, как и SRAM.

   Решая, какой тип ОЗУ использовать, разработчик системы должен  учесть время доступа и стоимость. SRAM устройства предлагают чрезвычайно малое время доступа (примерно  в четыре раза быстрее, чем DRAM) но гораздо дороже при производстве.

Как правило, SRAM используется только там, где крайне важна скорость доступа. Более низкая цена за байт делает DRAM привлекательной в тех случаях, когда требуется много ОЗУ.

Многие встроенные системы включают оба типа: маленький блок SRAM (несколько килобайт) для важных данных и гораздо больший блок DRAM (может быть, даже мегабайты) для всего остального.

Типы пзу (rom)

   Типы памяти в семействе ПЗУ характерны методами, которые используются для записи на них новых данных (обычно называемых программными) и числом раз, которое они могут быть перезаписаны.

Эта классификация отражает эволюцию ПЗУ от жестко запрограммированных до программируемых, а затем до стираемых и программируемых.

Общая особенность всех этих устройств – это их способность сохранять данные и программы навсегда, даже  во время перебоев в питании.

   Самые первые ПЗУ были прошитыми устройствами, которые содержали заранее запрограммированный набор данных, или инструкций. Содержимое ПЗУ должно было быть определено до производства чипа, так что фактические данные могли быть использованы для компоновки транзисторов внутри микросхемы.

Прошитая память все еще используется, хотя теперь она называется масочным ПЗУ (masked ROMs), чтобы отличать ее от других типов памяти. Главное преимущество масочных ПЗУ – в их низкой стоимости производства. К сожалению, цена низка только тогда, когда требуются большие количества одинаковых ПЗУ.

   На одну ступеньку выше масочных ПЗУ находится PROM (программируемое ПЗУ), которое приобретается в незапрограммированном состоянии. Если посмотреть на содержимое незапрограммированных PROM, то видно, что данные составлены целиком из единиц.

Процесс записи ваших данных на PROM предусматривает специальное оборудование, называемое программирующим устройством.

Программирующее устройство записывает данные на устройство по одному элементу информации единовременно, подавая электрический заряд к входным контактам чипа. Будучи запрограммированным однажды таким образом, содержимое PROM больше никогда изменить не удастся.

Если код, или данные, хранящиеся в PROM, необходимо изменить, находящееся в обращении устройство придется выбросить. В результате PROM известны как однократно программируемые устройства.

   EPROM (стираемое и программируемое ПЗУ) программируется тем же способом, что и PROM. Однако устройства EPROM могут быть очищены и перезаписаны повторно. Чтобы очистить EPROM, вы просто подвергаете устройство сильному воздействию ультрафиолетового излучения.

( Окно в верхней части устройства позволяет свету попасть на полупроводник.) Поступая таким образом, вы, по существу, возвращаете чип в его первоначальное незапрограммированное состояние.

Несмотря на большую стоимость по сравнению с PROM, способность к перепрограммированию, делает EPROM неотъемлемой частью разработки ПО и процесса тестирования.

Гибриды (hybrid)

   По мере развития технологии, в последние годы граница между ОЗУ и ПЗУ стерлась. Теперь некоторые типы памяти сочетают особенности обоих типов. Эти устройства не принадлежат ни к одной из групп и могут быть сообща отнесены к гибридным устройствам памяти.

В гибридную память можно записывать информацию и считывать ее оттуда при необходимости, как и в случае с ОЗУ, а сохранять ее содержимое без электроэнергии, точно также как в ПЗУ. Два типа гибридных устройств – EEPROM и Flash происходят от ПЗУ. Их обычно используют для хранения кода.

  Третий гибрид – NVRAM, является модифицированной версией SRAM. NVRAM, обычно, содержит постоянные данные.

   EEPROM – это электрически стираемая и программируемая память. По сути дела, она подобна EPROM устройствам, но операция стирания происходит при помощи электричества, а не благодаря  воздействию ультрафиолетовых лучей. Любой байт в EEPROM может быть стерт и перезаписан.

Будучи однажды записанными, новые данные останутся в устройстве навсегда, или, по крайней мере, до тех пор, пока не будут удалены при помощи электричества. Главный компромисс при столь улучшенной функциональности – более высокая стоимость, хотя циклы записи также значительно дольше, чем запись в RAM.

Поэтому вряд ли вы захотите использовать EEPROM для  главной системной памяти.

   Флэш-память (Flash memory) сочетает лучшие черты накопительных устройств, описанных выше. Флэш-память имеет высокую плотность, низкую цену, энергонезависимость, скорость (для чтения, но не для записи) и перепрограммирование при помощи электричества. Эти преимущества огромны и, как прямой результат – использование флэш-памяти во встроенных системах резко увеличилось.

С точки зрения ПО, технологии флэш и EEPROM очень похожи. Главное различие в том, что флэш-устройства могут быть очищены сразу в пределах целого сектора, а не байт за байтом. Типичные размеры сектора находятся в промежутке от 256 байт до 16 килобайт. Несмотря на этот недостаток, флэш-память намного популярнее, чем EEPROM и быстро вытесняет также многие другие ROM устройства.

   Третий член в семействе гибридной памяти – NVRAM (энергонезависимая RAM). Энергонезависимость также является характеристикой ROM- устройств и гибридных типов памяти, описанных выше. Однако NVRAM физически сильно отличается от этих устройств. NVRAM – это, как правило, SRAM с резервным аккумулятором. Когда питание включено, NVRAM действует как любая другая SRAM.

При отключении питания NVRAM берет из батареи ровно столько энергии, сколько требуется для сохранения данных. NVRAM достаточно часто встречается во встроенных системах.

Однако она дорого стоит, даже дороже, чем SRAM – из-за наличия батареи, так что ее приложения обычно ограничены способностью хранить несколько сотен байт важной системной информации, которую нельзя сохранить каким-либо другим путем.

Таблица 1 резюмирует особенности каждого типа памяти, описного выше, но имейте в виду, что различные типы памяти служат разным целям. Каждый тип памяти имеет свои сильные и слабые стороны. Сравнение «один к одному» не всегда эффективно.Таблица 1. Характеристики различных типов памяти.Barr, Michael. “Memory Types,” Embedded Systems Programming, May 2001, pp. 103-104.

Источник: http://chipenable.ru/index.php/item/57

AVR GCC: секции памяти (что такое .text, .data, .bss, .noinit?)

Источник: http://microsin.net/programming/avr/avr-gcc-memory-sections.html

MLC или TLC — что лучше для SSD? (а также о V-NAND, 3D NAND и SLC)

23.09.2017  для начинающих

Выбирая твердотельный накопитель SSD для домашнего использования, вы можете столкнуться с такой характеристикой как используемый тип памяти и задаться вопросом о том, что лучше — MLC или TLC (также вам могут встретиться и другие варианты обозначения типа памяти, например, V-NAND или 3D NAND).

В этом обзоре для начинающих пользователей подробно о типах флэш-памяти, используемой в SSD, об их преимуществах и недостатках и о том, какой из вариантов может оказаться более предпочтительным при покупке твердотельного накопителя. Также может быть полезно: Настройка SSD для Windows 10, Как перенести Windows 10 с HDD на SSD.

Типы флэш памяти, используемой в SSD для домашнего использования

В SSD используется флэш-память, представляющая собой специальным образом организованные ячейки памяти на базе полупроводников, которые могут отличаться по типу.

В общих чертах флэш память, используемая в SSD может делиться на следующие типы.

  • По принципу чтения-записи практически все имеющиеся в продаже потребительские SSD имеют тип NAND.
  • По технологии хранения информации память разделяется на SLC (Single-level Cell) и MLC (Multi-level Cell). В первом случае ячейка может хранить один бит информации, во втором — более одного бита. При этом, в SSD для домашнего использования вы не встретите SLC память, только MLC.

В свою очередь, TLC тоже относится к типу MLC, отличие заключается в том, что вместо 2 бит информации может хранить 3 бита информации в ячейке памяти (вместо TLC вы можете встретить обозначение 3-bit MLC или MLC-3). То есть TLC является подвидом MLC памяти.

Что лучше — MLC или TLC

В общем случае, память MLC имеет преимущества над TLC, основные из которых:

  • Более высокую скорость работы.
  • Более продолжительный срок службы.
  • Меньшее энергопотребление.

Недостаток — более высокая цена MLC по сравнению с TLC.

Однако следует иметь в виду, что речь идёт именно об «общем случае», в реальных устройствах, представленных в продаже вы можете увидеть:

  • Равную скорость работы (при прочих равных параметрах) для SSD с памятью TLC и MLC, подключаемых по интерфейсу SATA-3. Более того, отдельные накопители на базе памяти TLC с интерфейсом PCI-E NVMe иногда могут быть быстрее сходных по цене накопителей с памятью PCI-E MLC (однако, если говорить о «топовых», самых дорогих и быстрых SSD, в них всё-таки обычно используется память MLC, но тоже не всегда).
  • Большие гарантийные сроки службы (TBW) для памяти TLC одного производителя (или одной линейки накопителей) по сравнению с памятью MLC другого производителя (или другой линейки SSD).
  • Аналогично с энергопотреблением — например, накопитель SATA-3 с памятью TLC может потреблять в десять раз меньше энергии, чем накопитель PCI-E с памятью MLC. Более того, для одного типа памяти и одного интерфейса подключения разница в электропотреблении также очень сильно отличается в зависимости от конкретного накопителя.

И это не все параметры: скорость, срок службы и энергопотребление будут также отличаться от «поколения» накопителя (более новые, как правило, более совершенны: в настоящее время SSD продолжают развиваться и совершенствоваться), его общего объема и количества свободного места при использовании и даже температурного режима при использовании (для быстрых NVMe накопителей).

В итоге, строгий и точный вердикт о том, что MLC лучше TLC вынести нельзя — например, приобретя более емкий и новый SSD с TLC и лучшим набором характеристик, вы можете выиграть по всем параметрам по сравнению с приобретением накопителя с MLC по аналогичной цене, т.е. следует учитывать все параметры, а начинать анализ с доступного бюджета на покупку (например, если говорить при бюджете до 10000 рублей, обычно накопители с TLC памятью будут предпочтительнее MLC как для SATA, так и для PCI-E устройств).

Накопители SSD с памятью V-NAND, 3D NAND, 3D TLC и т.п

В описаниях SSD накопителей (особенно если речь о Samsung и Intel) в магазинах и обзорах вы можете встретить обозначения V-NAND, 3D-NAND и аналогичные для типов памяти.

Такое обозначение говорит о том, что ячейки флеш-памяти размещены на чипах в несколько слоев (в простых чипах ячейки размещены в одном слое, подробнее — на Википедии), при этом это та же память TLC или MLC, только не везде это обозначается явно: например, для SSD от Samsung вы увидите только то, что используется V-NAND память, однако информацию о том, что в линейке EVO применена V-NAND TLC, а в линейке PRO — V-NAND MLC придется поискать.

Лучше ли 3D NAND чем «плоская» (planar) память? Она дешевле в производстве и тесты говорят о том, что на сегодняшний день для памяти TLC вариант с многослойным размещением обычно более эффективен и надежен (более того, Samsung заявляет о том, что в устройствах их производства память V-NAND TLC обладает лучшими характеристиками производительности и срока службы, чем planar MLC). Однако, для памяти MLC, в том числе в рамках устройств одного производителя это может быть не так.

Т.е. опять же, всё зависит от конкретного устройства, вашего бюджета и других параметров, которые следует изучить перед покупкой SSD.

Конечно, я бы рад рекомендовать Samsung 960 Pro хотя бы на 1 Тб как неплохой вариант для домашнего компьютера или ноутбука, но обычно приобретаются более дешевые диски, для которых приходится внимательно изучать весь набор характеристик и сопоставлять их с тем, что требуется от накопителя.

А вдруг и это будет интересно:

Источник: https://remontka.pro/mlc-tlc-ssd/

Устройство микроконтроллера: АЛУ и организация памяти

Процессорное ядро микроконтроллеров:
– арифметико-логическое устройство
– организация памяти

Доброго дня уважаемые радиолюбители!
Приветствую вас на сайте “Радиолюбитель“

Сегодня (точнее – в течении нескольких статей) мы с вами более подробно рассмотрим основу любого микроконтроллерапроцессорное ядро.

Основные элементы:

1. Арифметико-логическое устройство

АЛУ – сердце (а может быть и ум, с честью и совестью) микроконтроллера.
Здесь мы не будем входить в роль “маньяка-расчленителя” и ковыряться во внутренностях этого устройства.

Усвоим только, что благодаря АЛУ происходит вся работа микроконтроллера.

Если у вас когда-нибудь появится желание более глубже узнать как работает “сердце” микроконтроллера (а будет неплохо, если оно появится), то в книгах замечательных авторов Белова, Рюмика, Евстифеева, Ревича, Баранова и многих других, вы всегда найдете подробный ответ.

2. Память микроконтроллера (организация памяти)

Прежде чем рассматривать память микроконтроллера, немного поговорим о памяти вообще.
Человеческая память – с ней все понятно, – она бывает “твердой” (когда находишься в твердой памяти, а иногда еще и в здравом уме) и, как не прискорбно, – “дырявой”.

А вся информация хранится в так называемых “нейронах” – маленьких ячейках памяти.
У микроконтроллеров почти все также.

Только, если у человека самая маленькая ячейка для хранения информации называется “нейрон”, то для микроконтроллера самая маленькая ячейка памяти для хранения информации называется “бит“.
В одном бите может храниться или одна логическая единица, или один логический ноль.


Бит – минимальная единица измерения объема памяти в микропроцессорной технике.
Следующая основная, или самая распространенная, единица измерения памяти – байт.
Байт – это восемь бит информации.

В одном байте может храниться только восемь нулей и единиц. Максимальное число которое можно записать в байт – 255.

Если в программе вы будете оперировать большими числами то следует знать (чтобы знать сколько байт потребуется для хранения числа), что максимальное число, которое можно записать в: – один байт = 255 – два байта = 65 535 – три байта = 16 777 215 – четыре байта – число величиной более 4 миллиардов (если вы не входите хотя бы в сотню журнала “Форбс”, то четыре байта памяти для хранения чисел вам не понадобятся). Запись в память и чтение из памяти происходит байтами (нельзя записать или считать один бит информации).

Следующая единица измерения – килобайт.

В килобайте помещается 1024 байт информации (именно 1024, а не 1000 байт). Есть еще и большие величины измерения объема памяти (мегабайт, гигабайт), но в микроконтроллерах они пока не применяются.

Я надеюсь, что с единицами измерения электронной памяти нам все понятно:

Организация памяти в микроконтроллере

Микросхемы AVR имеют три вида памяти:
память программ, она же FLASH-память
память данных, она же ОЗУ (оперативно-запоминающее устройство), она же SRAM
энергонезависимая память, она же ЭСППЗУ, она же EEPROM
В микроконтроллере выделяется три адресных пространства в которых располагаются вышеперечисленные разновидности памяти. Память данных при этом (в смысле выделенного адресного пространства) оказалась немного обделенной – ей приходится делить свое адресное пространство с ячейками памяти в которых хранятся регистры общего назначения и регистры ввода/вывода (о них вы подробно узнаете в следующей статье). Эти регистры физически не относятся к памяти данных, но находятся в том же адресном пространстве. Если начальные адреса памяти программ и энергонезависимой памяти начинаются с нулевого адреса, то начальный адрес памяти данных не начинается с нулевого адреса – с нулевого адреса занимают места регистры общего назначения и регистры ввода/вывода, и только за ними следуют адреса ячеек памяти программ.
В некоторых видах МК ATiny память данных отсутствует.

Память программ (FLASH память)

Память программ предназначена для хранения в ней наших программ, а также любых нужных нам данных, которые не меняются в ходе выполнения программы (константы). При выключении питания микроконтроллера, все данные в памяти программ сохраняются.
Память программ, естественно, имеют все микроконтроллеры.

Размер памяти программ, в зависимости от типа МК, варьируется от 1 килобайта до 256 килобайт.

Доступ к памяти программ имеет только программист при программировании МК, у самого МК доступ к памяти программ тоже имеется, но только для чтения данных из памяти, записать туда он ничего не может (мало ли что, вдруг захочет испортить нашу программу).

Правда, у МК семейства Mega есть возможность (с разрешения программиста) вносить изменения в памяти программ, но это отдельная история.
Для памяти программ  есть еще два вида измерения объема памяти – “слово” и “страница“.

Дело в том, что память программ состоит из ячеек состоящих из двух байт. Такая ячейка называется “словом”. А сделано это так потому, что почти все команды МК состоят из двух байт, и, соответственно, для их записи нужно два байта в памяти программ. Каждая команда МК – это одно “слово”.

Есть несколько команд, для записи которых требуется 4 байта в памяти – два слова, но такие команды встречаются в МК у которых память программ больше 8 килобайт.

Таким образом, в одну ячейку памяти программ можно записать:
– любую команду, состоящую из двух байт
– половину команды, состоящей из 4 байт
– две константы, каждая из которых умещается в один байт, или одну шестнадцатиразрядную константу.

При этом, если вы записываете в память три однобайтовых константы, они все равно займут в памяти четыре байта (два слова).
Кроме того, запись в память программ осуществляется не только “словами”, но еще и “страницами”. Размер “страницы” составляет от 64 до 256 байт (чем больше объем памяти программ, тем больше объем “страницы”). Что это значит. Если вы создали маленькую программку, объем которой составляет 11 слов (22 байта), в памяти программ она все равно займет место в одну страницу, т.е. как минимум 64 байта. “Лишние” 42 байта при этом будут заполнены или нулями, или единицами. Вот такие вот,  пироги. Но и это еще не все.

Память программ может иметь три состояния (если можно так выразиться):

1. Вся память находится в распоряжение программиста
В этом случае мы можем забить всю память полностью своей программой и данными. А программа будет стартовать с нулевого адреса памяти.
2. Часть памяти забирает МК
В случае, если при работе МК используются прерывания (а я надеюсь – вы помните, что это такое), часть памяти МК забирает для нужд обработки прерываний и хранит в ней “векторы прерываний“. 
Что это такое.
Когда мы разрешаем МК обрабатывать прерывания, он, начиная с нулевого адреса памяти, забирает часть ячеек для хранения в них адресов, по которым надо перейти МК для выполнения подпрограммы прерывания. Для каждого прерывания МК выделяет два байта памяти (одно слово) в которых хранятся адреса подпрограмм обработки прерываний. Вот эти адреса, которые указывают где находится в памяти подпрограмма обработки того, или иного прерывания, называются “векторами прерываний“. А вся область памяти, в которой хранятся “векторы прерываний”, называется таблицей векторов прерываний. Количество занятых ячеек памяти под прерывания зависит напрямую от количества возможных прерываний данного микроконтроллера (от нескольких штук, до нескольких десятков). Все прерывания располагаются в начале памяти программ, с нулевого адреса, и имеют четкую последовательность. По нулевому адресу всегда располагается вектор прерывания по “сбросу” (Reset). Когда мы включаем устройство, или производим сброс кнопкой, срабатывает прерывание по сбросу. МК считывает с нулевого адреса (с ячейки) адрес, который указывает где в памяти находится начало нашей программы, и перейдя по этому адресу начинает выполнять программу. Сама программа в этом случае будет располагаться в памяти программ сразу за таблицей прерываний.
3. МК забирает еще одну часть памяти программ (точнее не забирает, а выделяет область в конце памяти, в которой программист размещает специальную программу – “загрузчик”).
Такое возможно в МК семейства “MEGA”, у которых есть возможность разрешить МК вносить изменения в памяти программ. Что это значит.
Некоторые МК имеют возможность самопрограммироваться. В практике любителей такая возможность МК используется крайне редко. Возможность перепрограммироваться (самопрограммироваться) нужна, в основном, в случаях промышленного производства какого-то устройства на микроконтроллере, для которого потом может выпускаться обновление программного обеспечения. Мы эту возможность рассматривать не будем, по крайней мере пока. Нам достаточно только знать, что в МК, которые поддерживают самопрограммирование, память программ разделяется на две части:
– верхняя – секция прикладной программы, где располагается наша программа и векторы прерываний
– нижняя – секция загрузчика (Boot Loader Section – по английски), где программист располагает свою программу-загрузчик. Размер секции загрузчика зависит от общего размера памяти программ МК, и может составлять от 128 байт до 4096 байт. Если возможность самопрограммирования МК мы не используем, то эта секция отдается для нашей программы и данных. 
Ну а FLASH-памятью память программ называют потому, что она делается по так называемой Flash-технологии (как и всем нам привычные компьютерные “флешки”)
Память программ допускает 10 тысяч циклов перепрограммирования.

Память данных (Статическое ОЗУ, SRAM)

Оперативно-запоминающее устройство, оно же память данных типа SRAM, предназначена для хранения в ней различных данных, получаемых в результате работы программы.
При выключении питания микроконтроллера, все данные хранящиеся в ней теряются.

Память данных есть почти во всех микроконтроллерах (отсутствует у простейших МК семейства Tiny).
Во всех МК семейства Mega (и части МК семейства Tiny) объем встроенной памяти данных колеблется от 128 байт до 8 килобайт, и почти вся она отдана в наше полное распоряжение.

Только немножко забирает себе МК для организации стека (что это такое узнаем позднее). В некоторых МК предусмотрено подключение внешней памяти (она может быть любого типа – FLASH, SRAM, EEPROM) объемом до 64 килобайт. В случае подключения внешней памяти в таких МК, она становится как-бы продолжением памяти данных.

Запись в  память данных и чтение из нее происходит побайтно, и в отличии от памяти программ в ней нет деления на страницы и слова.

Энергонезависимая память (EEPROM)

Энергонезависимая память также относится к памяти данных, но в отличие от последней имеет несколько особенностей. Предназначена она для хранения данных и констант, которые должны сохраняться при отсутствии питания.
EEPROM имеют все микроконтроллеры.

При выключении питания микроконтроллера все данные, хранящиеся в энергонезависимой памяти сохраняются (поэтому она и называется энергонезависимой).
Объем энергонезависимой памяти, в зависимости от типа МК, колеблется от 64 байт до 4 килобайт.

Запись и чтение информации в память производится побайтно. Однако в старших моделях семейства MEGA, энергонезависимая память, так же как и память программ, имеет страничную запись. Объем страницы небольшой, составляет всего 4 байта.

На практике эта особенность не имеет значения – и запись, и чтение осуществляется все равно побайтно.
Число циклов записи и стирания памяти достигает 100 000.

Главная особенность EEPROM заключается в том, что при записи в нее данных она становится очень “медленной” – запись одного байта может продолжаться от 2 до 4 миллисекунд (это очень низкая скорость), и может случиться, к примеру, что во время записи сработает какое-либо прерывание и в этом случае процесс записи данных будет загублен.
Кроме того, не рекомендуется записывать данные в энергонезависимую память с нулевого адреса  (не помню источника этих сведений, но точно помню, что где-то читал) – возможно повреждение данных в ходе работы МК. Иногда программисты отступают на несколько байт от начала памяти, и только в следующих ячейках начинают запись данных.

Предыдущие статьи:

♦ Микроконтроллер и как его победить
♦ Микроконтроллер и системы счисления
♦ Микроконтроллер и логические операции
♦ Общее устройство микроконтроллера

Следующие статьи:

♦ Регистры общего назначения, регистры ввода/вывода, стек, счетчик команд
♦ Регистр состояния SREG
♦ Порты ввода/вывода микроконтроллера

Источник: http://radio-stv.ru/mikrokontrolleri/ustroystvo-i-programmirovanie-mikrokontrollerov-dlya-nachinayushhih/ustroystvo-mikrokontrollera-alu-i-organizatsiya-pamyati

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}
");let k=document.querySelector(".flat_pm_modal[data-id-modal=\""+a.ID+"\"]");if(-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(k,d):jQuery(k).html(b+d),"px"==a.how.popup.px_s)e.bind(h,()=>{e.scrollTop()>a.how.popup.after&&(e.unbind(h),f.unbind(i),j())}),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{e.unbind(h),f.unbind(i),j()});else{let b=setTimeout(()=>{f.unbind(i),j()},1e3*a.how.popup.after);void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{clearTimeout(b),f.unbind(i),j()})}f.on("click",".flat_pm_modal .flat_pm_crs",()=>{jQuery.arcticmodal("close")})}if(void 0!==a.how.outgoing){let b,c="0"==a.how.outgoing.indent?"":" style=\"bottom:"+a.how.outgoing.indent+"px\"",e="true"==a.how.outgoing.cross?"":"",f=jQuery(window),g="scroll.out"+a.ID,h=void 0===flatPM_getCookie("flat_out_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+a.ID+"_mb"),i=document.createElement("div"),j=jQuery("body"),k=()=>{void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie&&h&&(jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show"),j.on("click",".flat_pm_out[data-id-out=\""+a.ID+"\"] .flat_pm_crs",function(){flatPM_setCookie("flat_out_"+a.ID+"_mb",!1)})),(void 0===a.how.outgoing.cookie||"false"!=a.how.outgoing.cookie)&&jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show")};switch(a.how.outgoing.whence){case"1":b="top";break;case"2":b="bottom";break;case"3":b="left";break;case"4":b="right";}jQuery("body > *").eq(0).before("
"+e+"
");let m=document.querySelector(".flat_pm_out[data-id-out=\""+a.ID+"\"]");-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(m,d):jQuery(m).html(e+d),"px"==a.how.outgoing.px_s?f.bind(g,()=>{f.scrollTop()>a.how.outgoing.after&&(f.unbind(g),k())}):setTimeout(()=>{k()},1e3*a.how.outgoing.after),j.on("click",".flat_pm_out .flat_pm_crs",function(){jQuery(this).parent().removeClass("show").addClass("closed")})}countMode&&(flat_count["block_"+a.ID]={},flat_count["block_"+a.ID].count=1,flat_count["block_"+a.ID].click=0,flat_count["block_"+a.ID].id=a.ID)}catch(a){console.warn(a)}}function flatPM_start(){let a=flat_pm_arr.length;if(0==a)return flat_pm_arr=[],void jQuery(".flat_pm_start, .flat_pm_end").remove();flat_body=flat_body||jQuery("body"),!flat_counter&&countMode&&(flat_counter=!0,flat_body.on("click","[data-flat-id]",function(){let a=jQuery(this),b=a.attr("data-flat-id");flat_count["block_"+b].click++}),flat_body.on("mouseenter","[data-flat-id] iframe",function(){let a=jQuery(this),b=a.closest("[data-flat-id]").attr("data-flat-id");flat_iframe=b}).on("mouseleave","[data-flat-id] iframe",function(){flat_iframe=-1}),jQuery(window).on("beforeunload",()=>{jQuery.isEmptyObject(flat_count)||jQuery.ajax({async:!1,type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:"flat_pm_block_counter",arr:flat_count}}})}).on("blur",()=>{-1!=flat_iframe&&flat_count["block_"+flat_iframe].click++})),flat_userVars.init();for(let b=0;bflat_userVars.textlen||void 0!==a.chapter_sub&&a.chapter_subflat_userVars.titlelen||void 0!==a.title_sub&&a.title_subc&&cc&&c>d&&(b=flatPM_addDays(b,-1)),b>e||cd||c-1!=flat_userVars.referer.indexOf(a))||void 0!==a.referer.referer_disabled&&-1!=a.referer.referer_disabled.findIndex(a=>-1!=flat_userVars.referer.indexOf(a)))&&(c=!0),c||void 0===a.browser||(void 0===a.browser.browser_enabled||-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser))&&(void 0===a.browser.browser_disabled||-1==a.browser.browser_disabled.indexOf(flat_userVars.browser)))){if(c&&void 0!==a.browser&&void 0!==a.browser.browser_enabled&&-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser)&&(c=!1),!c&&(void 0!==a.geo||void 0!==a.role)&&(""==flat_userVars.ccode||""==flat_userVars.country||""==flat_userVars.city||""==flat_userVars.role)){flat_pm_then.push(a),flatPM_setWrap(a),flat_body.hasClass("flat_pm_block_geo_role")||(flat_body.addClass("flat_pm_block_geo_role"),flatPM_ajax("flat_pm_block_geo_role")),c=!0}c||(flatPM_setWrap(a),flatPM_next(a))}}}let b=jQuery(".flatPM_sticky");b.each(function(){let a=jQuery(this),b=a.data("height")||350,c=a.data("top");a.wrap("
");let d=a.parent()[0];flatPM_sticky(this,d,c)}),debugMode||countMode||jQuery("[data-flat-id]:not([data-id-out]):not([data-id-modal])").contents().unwrap(),flat_pm_arr=[],jQuery(".flat_pm_start, .flat_pm_end").remove()}

Здесь представлен перевод документации AVR GCC [1], касающейся секций памяти платформы AVR (будут описаны различные секции, используемые компилятором AVR GCC). Секции иногда также называют сегментами, иногда регионами памяти.

[Общие проблемы при использовании FLASH и SRAM микроконтроллеров AVR]

Все микроконтроллеры AVR имеют память FLASH и память SRAM. Часто считается, что код размещен во FLASH, и данные размещены в SRAM, но это не совсем так.

Для того, чтобы понять, как используются разные виды памяти AVR в Вашем приложении, полезно добавить в makefile вызов утилиты avr-size. К примеру, Вы можете запустить её из директории, где собираете код проекта:

H:src
anduinolcd>avr-size –mcu=at90usb162 –format=avr .build/firmware.elf AVR Memory Usage —————- Device: at90usb162
Program: 1604 bytes (9.8% Full) (.text + .data + .bootloader)
Data: 62 bytes (12.1% Full) (.data + .bss + .noinit)

В отчете программы avr-size можно увидеть имена .text, .data, .bss и .noinit. Это сегменты памяти AVR GCC, вот краткое описание их назначения:

.text, .initN, .finiN Код выполняемой программы (FLASH).
.data, .bss, .noinit Данные переменных программы (SRAM).
.eeprom Данные энергонезависимых переменных (EEPROM).

Секция .text размещена только во FLASH, и представляет Ваш код плюс код инициализации (init code), сгенерированный AVR-GCC. Секция .

data размещена как во FLASH, так и в SRAM, и она представляет данные, которые копируются из FLASH в SRAM после сброса или включения питания – это соответствует глобальным переменным, которые имеют инициализацию. Секция .

bss появляется только в SRAM, и представляет ячейки SRAM, которые очищаются при сбросе или включении питания – это соответствует глобальным переменным без инициализации.

Реальную работу по копированию данных и инициализации ячеек SRAM при сбросе (включении питания) выполняют функции __do_clear_bss() и __do_copy_data() времени выполнения C. Это код, который выполняется после сброса, но до вызова функции main().

Обычно дешевые микроконтроллеры AVR имеют достаточно памяти FLASH, но довольно мало SRAM.

Например, микроконтроллер AT90USB162, используемый в макетных платах AVR-USB162 и Nanduino, имеют 12 килобайт памяти (свободной от USB бутлоадера, которую можно использовать), но только 512 байт SRAM.

Таким образом, иногда важна проблема экономии SRAM. К сожалению, SRAM часто используется в программе весьма неочевидными способами. Например:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include “supergizmo.h” #include “lcd.h” #define STATE_IDLE 0 #define STATE_READING 1 #define STATE_WRITING 2 uint8 state = STATE_IDLE; int main() { superGizmoInit(); lcdInit(); lcdPrintString(“SuperGizmo v1.0
“); for ( ; ; ) { switch ( state ) { case STATE_IDLE: : break; case STATE_READING: : break; case STATE_WRITING: : break; } } }

Вы могли бы подумать, что этот код использует только 1 байт SRAM для хранения байта состояния uint8 state. Но в действительности строка “SuperGizmo v1.0
” будет размещена в секции .data, которая подразумевает изначальное хранение во FLASH, и последующее копирование в SRAM после сброса RESET. Эта строка займет 17 байт (15 символов, символ новой строки и терминатор NUL) драгоценной SRAM.

Чтобы обойти проблему, Вам нужно обеспечить хранение символов строки именно во FLASH, и исключить её копирование в SRAM. Вместо вызова:

lcdPrintString(“SuperGizmo v1.0
“);

нужно сделать так (подробнее см. [4]):

#include : lcdPrintFlashString(PSTR(“SuperGizmo v1.0
“));

В результате строка будет размещена в секции .text вместе с кодом программы, и обращение к строке будет осуществлено через указатель на память программ (program memory pointer). Таким методом можно исключить лишние затраты SRAM, но к сожалению размещение данных в секции .text создает 2 проблемы.

Во-первых, поскольку AVR использует гарвардскую архитектуру, указатель на память программ (FLASH) абсолютно отличается от указателя на память данных (SRAM).

AVR имеет специальную машинную инструкцию LPM (Load Program Memory, загрузка из памяти программ) для доступа к данным, сохраненным в FLASH, потому что обычные машинные инструкции для доступа к SRAM тут не работают.

В результате нужно написать отдельные реализации функций – одна реализация для работы с указателями на обычные данные (data-memory), другая реализация для работы с указателями (program-memory):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include < avr/pgmspace.h > void lcdPrintFlashString(const char *str) { char ch = pgm_read_byte(str); while ( ch ) { lcdPrintChar(ch); str++; ch = pgm_read_byte(str); } } void lcdPrintString(const char *str) { while ( *str ) { lcdPrintChar(*str); str++; } }

Во-вторых, не будет оптимизации по нескольким одинаковым выражениям PSTR(“…”).

Каждый раз, когда в коде программы будет найдено такое определение строки, для каждого из них будет выделено отдельное место в FLASH, независимо от содержания строки.

Многократного дублирования одинаковых данных можно избежать, если декларировать строку в одном месте, отдельно, и потом обращаться к ней по имени несколько раз:

#include : const char LONG_LINE[] PROGMEM = “Это очень большая строка, правда-правда!
“; lcdPrintFlashString(LONG_LINE); lcdPrintFlashString(LONG_LINE);

Эта техника сохранения статических данных в памяти FLASH полезна не только для символов и строк; её можно использовать для статических данных любого вида. Например, Вы можете написать эффективную подпрограмму вычисления контрольной суммы CRC32, которая использует предварительно скомпилированную таблицу, размещенную в памяти программ:

static const uint32 lookupTable[] PROGMEM = { 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, : };
uint32 crc32Calc(const uint8 *buf, uint16 len) { const uint8 *p; uint32 crc = 0xffffffff; for ( p = buf; len > 0; ++p, –len ) { crc = (crc 24) ^ *p]); } return ~crc; }

[Секция .text]

Секция .text содержит реальные машинные инструкции, которые составляют Вашу программу. В эту секцию также входят секции .initN и .finiN, описанные далее.

Примечание: утилита avr-size (входящая в состав бинарных утилит binutils на платформе Unix, и которая также есть и в WinAVR), не учитывает место кода инициализации .data, входящего в .text.

Поэтому чтобы узнать, сколько на самом деле занимает программа во FLASH нужно сложить размер .text и кода инициализации .data (но не .bss). Чтобы узнать занимаемое место в SRAM, нужно сложить размер .data и .bss.

[Секция .data]

Эта секция содержит статические инициализированные данные, которые были определены в Вашем коде. К примеру, следующие строки программы приведут к выделению пространства в сегменте .data:

char err_str[] = “Ваша программа умерла страшной смертью!”; struct point pt = { 1, 1 };

Можно указать линкеру, с какого адреса SRAM будет начинаться секция .data. Это достигается добавлением -Wl,-Tdata,addr к команде avr-gcc, используемой для линковки (link) Вашей программы.

Адрес addr должен быть не просто смещением относительно начала SRAM, нужно к реальному адресу SRAM добавить 0x800000, чтобы линкер знал, что адрес принадлежит адресному пространству SRAM. К примеру, если хотите, чтобы секция .

data начиналась с 0x1100, нужно линкеру передать адрес 0x801100.

Примечание: когда в программе используете вызовы malloc (они могут даже происходить из кода библиотеки), то понадобятся дополнительные настройки распределения памяти SRAM [2].

[Секция .bss]

В секции .bss появляются неинициализированные глобальные или статические переменные.

[Секция .eeprom]

В секции .eeprom размещаются переменные памяти EEPROM [3].

[Секция .noinit]

Секция .noinit входит в состав секции .bss (является её частью). В секции .noinit размещены переменные, которые заданы следующим образом:

int foo __attribute__ ((section (“.noinit”)));

Эти переменные не будут проинициализированы нулем при старте, как это делается с обычными данными .bss секции. В секцию .noinit можно поместить только неинициализированные переменные. К примеру, следующий код приведет к ошибке:

int bar __attribute__ ((section (“.noinit”))) = 0xaa;

Можно явно указать линкеру, в какое место SRAM поместить секцию .noinit путем добавления в командную строку -Wl,–section-start=.noinit=0x802000 запуска avr-gcc на этапе линковки. Предположим, что Вам нужно поместить секцию .noinit в SRAM по адресу 0x2000:

$ avr-gcc … -Wl,–section-start=.noinit=0x802000 …

Примечание: поскольку для чипов AVR используется Гарвардская архитектура, Вам нужно вручную добавить 0x800000 к адресу при передаче его линкеру в качестве начала секции. Иначе линкер подумает, что надо поместить секцию .noinit в секцию .text вместо .data/.bss, и выдаст ошибку.

Альтернативно для автоматизации Вы можете написать свой собственный скрипт линковки.

[Секции .initN (.init0, .init1 и т. д.)]

Эти секции используются для определения кода запуска (startup code), который выполняется при сбросе AVR (включении питания) до входа в функцию main(). Все секции .initN являются составными частями секции .text. Назначение секций .initN – позволить специальным образом разместить некоторые специфичные части кода Вашей программы.

Примечание: иногда удобно думать о секциях .initN и .finiN как о функциях, но в реальности это просто символические имена, которые говорят линкеру, куда приклеить кусок кода, который в реальности не является функцией. Имейте в виду, что примеры для asm и C не могут быть вызваны как функции, в них должен быть произведен прямой переход.

Секции .initN выполняются в порядке от 0 до 9.

.init0:
Неочевидным образом привязано к __init(). Если пользователь определил функцию __init(), то сразу после сброса туда будет произведен безусловный переход.

.init1:
Не используется, задается пользователем.

.init2:
В программах на языке C неочевидным образом привязано к инициализации стека и к очистке регистра нуля __zero_reg__ (r1).

.init3:
Не используется, задается пользователем.

.init4:
Для чипов, у которых память программ ROM больше 64 килобайт, секция .init4 обозначает код, который заботится о копировании содержимого .data из памяти FLASH в память SRAM. Для всех других чипов (у которых размер кода меньше 64 килобайт), этот код, как и код обнуления переменных секции .bss, загружается из libgcc.a.

.init5:
Не используется, задается пользователем.

.init6:
Не используется в программах на C, но используется для конструкторов в программах C++.

.init7:
Не используется, задается пользователем.

.init8:
Не используется, задается пользователем.

.init9:
Делает переход в main().

[Секции .finiN (.fini0, .fini1 и т. д.)]

Эти секции используются для определения кода выхода (exit code), который выполняется после возврата из функции main() или при вызове функции exit(). Все секции .finiN являются составными частями секции .text.

Секции .finiN выполняются в обратном порядке, от 9 до 0.

.fini9:
Не используется, задается пользователем. В этом месте запускается _exit().

.fini8:
Не используется, задается пользователем.

.fini7:
Не используется, задается пользователем.

.fini6:
Не используется для программ на C, но используется для деструкторов программ C++.

.fini5:
Не используется, задается пользователем.

.fini4:
Не используется, задается пользователем.

.fini3:
Не используется, задается пользователем.

.fini2:
Не используется, задается пользователем.

.fini1:
Не используется, задается пользователем.

.fini0:
Переходит в бесконечный цикл после прерывания программы, и после завершения любого кода _exit() (также выполнился код всех секций от .fini9 до .fini1).

[Использование секций в коде ассемблера]

Пример:

#include .section .init1,”ax”,@progbits ldi r0, 0xff out _SFR_IO_ADDR(PORTB), r0 out _SFR_IO_ADDR(DDRB), r0

Примечание: выражения “ax”, @progbits говорят ассемблеру, что секция выделяемая (allocatable, “a”), выполняемая (executable, “x”), и содержит данные (“@progbits”). Для дополнительной инфрмации по директиве .section см. руководство пользователя.

[Использование секций в коде C]

Пример:

#include < avr/io.h > void my_init_portb (void) __attribute__ ((naked)) __attribute__ ((section (“.init3”))); void my_init_portb (void) { PORTB = 0xff; DDRB = 0xff; }

Примечание: в этом примере используется секция .init3, чем обеспечивается, что внутренний регистр __zero_reg__ уже установлен. Генерируемый компилятором код может слепо полагаться на то, что __zero_reg__ сброшен в 0.

[Ссылки]

1. AVR Libc memory sections site:nongnu.org.
2. AVR GCC: области памяти и использование malloc().
3. Сохранение констант в EEPROM при использовании WinAVR (GCC).
4. AVR Studio +gcc: как разместить строки и константы на flash.