Насколько 8-битные микроконтроллеры отличаются от 32-битных микроконтроллеров, когда дело доходит до их программирования


19

Итак, на данный момент у нас есть 8-битные, 16-битные и 32-битные микроконтроллеры в этом мире. Все они часто используются. Насколько отличается программирование 8-битных и 16-битных микроконтроллеров? Я имею в виду, это требует другой техники или навыка? Например, возьмем микрочип. Что нового нужно узнать человеку, если он хочет перейти с 8-разрядных микроконтроллеров на 32-разрядные?


Нет. Конечно, существуют разные проблемы, но они в основном связаны с уровнем детализации устройства. Например, разрешен ли доступ для слова без выравнивания? (На ARM это не так - пока на x86 это так). Этот вопрос недостаточно конкретен.
Крис Страттон

Ух, ребята, спасибо за ответы. Таким образом, на самом деле есть очень важные различия, которые мы должны учитывать при программировании 32-битных процессоров по сравнению с 8-битными процессорами. Здесь я имел в виду C, так как думаю, что большинство людей не вникает в Assembly для программирования по причинам, которые мы все знаем очень хорошо. Спасибо за подробные ответы, я действительно ценю это.
Quant231

С 32-битными UC есть намного больше опций и намного больше регистров, которые вы должны получить правильно. Я думаю, это зависит от того, что вы делаете. Тем не менее, в эти дни вы можете получить плату разработки, компилятор, отладчик, IDE примерно за 50 долларов. В те времена это стоило около 1000 долларов.

Ответы:


33

В общем, переход с микроконтроллеров с 8 на 16 на 32 бита означает, что у вас будет меньше ограничений на ресурсы, особенно на память, и ширину регистров, используемых для выполнения арифметических и логических операций. 8, 16 и 32-битные моникеры, как правило, относятся как к размеру внутренних и внешних шин данных, так и к размеру внутреннего регистра (ов), используемых для арифметических и логических операций (раньше они назывались только одним или двумя, называемыми аккумуляторами). В настоящее время обычно есть банки регистрации 16 или 32).

Размеры портов ввода / вывода также обычно соответствуют размеру шины данных, поэтому 8-битный микро будет иметь 8-битные порты, 16-битный будет иметь 16-битные порты и т. Д.

Несмотря на наличие 8-битной шины данных, многие 8-битные микроконтроллеры имеют 16-битную адресную шину и могут адресовать 2 ^ 16 или 64 Кбайт памяти (это не значит, что они реализованы где-то рядом). Но некоторые 8-битные микро, как младшие PIC, могут иметь только очень ограниченное пространство ОЗУ (например, 96 байтов на PIC16).

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

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

Наряду с различными размерами памяти размер стека. В младших микросхемах это может быть реализовано в специальной области памяти и быть очень маленьким (многие PIC16 имеют 8-уровневый глубокий стек вызовов). В 16-битных и 32-битных микросхемах стек обычно будет составлять ОЗУ и ограничиваться только размером ОЗУ.

Существуют также огромные различия в объеме памяти - как программной, так и оперативной памяти - реализованной на различных устройствах. 8-разрядные микросхемы могут иметь только несколько сотен байтов ОЗУ и несколько тысяч байт памяти программ (или намного меньше - например, PIC10F320 имеет только 256 14-разрядных слов флэш-памяти и 64 байта ОЗУ). 16-разрядные микросхемы могут иметь несколько тысяч байтов оперативной памяти и десятки тысяч байтов памяти программ. 32-разрядные микросхемы часто имеют более 64 КБ ОЗУ и, возможно, 1/2 МБ или более памяти программ (PIC32MZ2048 имеет 2 МБ флэш-памяти и 512 КБ ОЗУ; недавно выпущенный PIC32MZ2064DAH176, оптимизированный для графики, имеет 2 МБ флэш-памяти и колоссальные 32 МБ оперативной памяти).

Если вы программируете на ассемблере, ограничения размера регистра будут очень очевидны, например, добавление двух 32-разрядных чисел - это рутина на 8-разрядном микроконтроллере, но тривиальное на 32-разрядном. Если вы программируете на C, это будет в значительной степени прозрачно, но, конечно, базовый скомпилированный код будет намного больше для 8-битного.

Я сказал в значительной степени прозрачно, потому что размер различных типов данных C может отличаться от одного размера микро к другому; например, компилятор, который предназначается для 8 или 16-битного микро, может использовать «int» для обозначения 16-битной переменной со знаком, а на 32-битном микро это будет 32-битная переменная. Поэтому многие программы используют #defines для явного определения желаемого размера, например, «UINT16» для 16-битной переменной без знака.

Если вы программируете на C, самое большое влияние окажет размер ваших переменных. Например, если вы знаете, что переменная всегда будет меньше 256 (или в диапазоне от -128 до 127, если она подписана), то вам следует использовать 8-битный (без знака или символ) на 8-битном микро (например, PIC16). ) поскольку использование большего размера будет очень неэффективным. Аналогично, 16-битные переменные на 16-битном микро (например, PIC24). Если вы используете 32-битный микро (PIC32), то это не имеет никакого значения, так как набор команд MIPS содержит инструкции байтов, слов и двойных слов. Однако на некоторых 32-битных микро, если у них нет таких инструкций, манипулирование 8-битной переменной может быть менее эффективным, чем 32-битная из-за маскировки.

Как указал участник форума vsz, в системах, где у вас есть переменная, которая больше, чем размер регистра по умолчанию (например, 16-битная переменная на 8-битном микро), и эта переменная является общей для двух потоков или для базового потока и обработчик прерываний, необходимо выполнить любую операцию (включая только чтение) над атомарной переменной , то есть сделать так, чтобы она выполнялась как одна инструкция. Это называется критическим разделом. Стандартный способ смягчить это - окружить критическую секцию парой прерываний отключения / включения.

Таким образом, при переходе от 32-разрядных систем к 16-разрядным или от 16-разрядных к 8-разрядным любые операции над переменными этого типа, которые теперь больше, чем размер регистра по умолчанию (но не ранее), должны рассматриваться как критические. раздел.

Еще одно основное отличие от одного процессора PIC к другому заключается в обработке периферийных устройств. Это связано не столько с размером слова, сколько с типом и количеством ресурсов, выделенных для каждого чипа. В общем, Microchip пытался сделать программирование одного и того же периферийного устройства, используемого на разных чипах, максимально похожим (например, timer0), но всегда будут различия. Использование их периферийных библиотек в значительной степени скрывает эти различия. И последнее отличие - обработка прерываний. Опять же, здесь есть помощь из библиотек Microchip.


Возможно, стоит отметить, что на уровне ассемблера 8-разрядные процессоры, как правило, имеют меньше регистров и меньше ортогональных инструкций (AVR - более исключение RISCy), что является следствием конструктивных ограничений при их разработке. 32-битные процессоры, как правило, являются потомками RISC (Renesas RX, современный CISC, является одним исключением, а ColdFire Freescale происходит от m68k).
Пол А. Клейтон

9
Чтобы не начинать новый ответ только для этого дополнения, я думаю, что важно добавить, что переход с 32-разрядного на 16-разрядный режим с 16 на 8 может вызвать неприятные сюрпризы, поскольку арифметика перестает быть атомарной. Если вы добавляете два 16-битных числа на 8-битном микроконтроллере и используете их в прерывании, вы должны позаботиться о том, чтобы сделать их поточно-ориентированными, в противном случае вы можете добавить только половину из них до запуска прерывания, что приведет недопустимое значение в вашей программе обработки прерываний.
вс

2
@vsz - Хорошо, забыл об этом. Обычно следует отключать прерывания при любом доступе (включая только чтение) к любой изменчивой переменной, которая больше, чем размер регистра по умолчанию.
tcrosley

1
Правда ли, что 32-битные контроллеры обычно имеют 32-битные интерфейсы ввода / вывода? Я думаю, что в любом случае это чаще всего просто последовательная связь.
Клабаккио

1
@clabacchio Мой опыт показывает, что все регистры портов ввода / вывода определены как 32-разрядные, но иногда верхние 16 битов 16-31 не используются, поэтому параллельный порт по-прежнему имеет 16 физических выводов. В других случаях, таких как регистр RTCC, используются все 32 бита.
tcrosley

8

Одно общее различие между 8-битными и 32-битными микроконтроллерами заключается в том, что 8-битные часто имеют диапазон памяти и пространство ввода / вывода, к которому можно обращаться в одной инструкции, независимо от контекста выполнения, тогда как 32-битные микроконтроллеры часто требуется последовательность из нескольких инструкций. Например, на типичном 8-битном микроконтроллере (HC05, 8051, PIC-18F и т. Д.) Можно изменить состояние бита порта, используя одну инструкцию. На типичном ARM (32-битном), если содержимое регистра было первоначально неизвестно, потребуется последовательность команд из четырех команд:

    ldr  r0,=GPIOA
    ldrh r1,[r0+GPIO_DDR]
    ior  r1,#64
    strh r1,[r0+GPIO_DDR]

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

С другой стороны, 32-битные контроллеры неизменно предназначены для эффективного доступа ко многим видам структур данных, которые могут храниться в памяти. Для сравнения, многие 8-битные контроллеры очень неэффективны для доступа к структурам данных, которые не являются статически распределенными. 32-битный контроллер может выполнять в одной инструкции доступ к массиву, что потребует полдюжины или более инструкций на типичном 8-битном контроллере.


Я полагаю, вы имели в виду "бит-бэнг". Возможно, стоит отметить, что ARM поддерживает регионы битовой полосы (где текстовые операции являются однобитовыми операциями), а специфичное для приложения расширение MCU для MIPS предоставляет атомарно установленный / сбрасываемый бит в байтовых инструкциях (ASET / ACLR).
Пол А. Клейтон,

@ PaulA.Clayton: я действительно не смотрел MIPS за последние 20 лет; Что касается областей с битовой полосой, я никогда не придумывал, как использовать их в разумно выглядящем коде, и даже если бы я мог их использовать, они сохранили бы только одну инструкцию, если бы не использовались какие-то безумные хитрости программирования, в этом случае они могут сохранить два [загрузить R0 четным или нечетным адресом в зависимости от того, должен ли бит быть установлен или очищен, и отрегулировать смещение инструкции сохранения в соответствии с необходимостью для компенсации]. Кстати, у вас есть идеи, почему битовая полоса использует адреса слов?
суперкат

@supercat: Word-адресация позволяет получить доступ к областям битовой полосы из C или C ++ с помощью указателя подписки ( region_base[offset])
Бен Фойгт,

@BenVoigt И почему нельзя сделать это с помощью байтовой адресации? (Возможно, одной из возможных причин будет устранение ожидания / надежды на поддержку двух- и четырехбитных операций.)
Пол А. Клейтон,

@BenVoigt: необходимость масштабировать число бит в 4 раза часто будет стоить дополнительной инструкции. На самом деле, то, что я хотел бы видеть, а не область битовой полосы, было бы набором из пары областей, которые бы располагались с фиксированным смещением относительно «обычных» обращений к памяти, но указывали бы, что записи в одну область будет по возможности только «устанавливать» биты, а запись в другие будет только «очищать» биты. Если бы шина имела отдельные управляющие биты «write-ones-enable» и «write-zeroes-enable», можно было бы достичь того, что позволяет битовая полоса, но во многих случаях избегать чтения-изменения-записи.
суперкат

6

Самым большим практическим отличием является объем документации, чтобы полностью понять весь чип. Существуют 8-битные микроконтроллеры, которые содержат почти 1000 страниц документации. Сравните это примерно с 200-300 страницами для 8-битного процессора 1980-х годов и популярных периферийных чипов, с которыми он будет использоваться. 32-разрядное устройство с большим количеством периферийных устройств потребует от 2000 до 10000 страниц документации, чтобы понять эту часть. Детали с современной трехмерной графикой на 20 тыс. Страниц документации.

По моему опыту, для того, чтобы узнать все, что нужно знать о данном современном 32-битном контроллере, требуется примерно в 10 раз больше, чем для современной 8-битной части. Под «всем» я подразумеваю, что вы знаете, как использовать все периферийные устройства, даже нетрадиционными способами, и знаете машинный язык, ассемблер, который использует платформа, а также другие инструменты, ABI (и) и т. Д.

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


3

Лично я не стал бы слишком беспокоиться об обновлении (8-битной и 32-битной) УК того же семейства, а вы увеличиваете спецификации по всем направлениям. Как правило, я не делаю ничего необычного с типами данных, так как это может быть трудно поддерживать в будущем.

Понижение кода устройства - это отдельная история.


3
Размер типов данных определяется компилятором, а не архитектурой процессора. 8-битный процессор может иметь 32-битные целые, хотя для манипулирования ими потребуется несколько инструкций.
Джо Хасс

Хороший комментарий - я удалил первую строку из-за исправления.
Ник Туллос

@JoeHass: компилятор для 8-битный процессор может определить int32 бита, или даже 64 по этому вопросу, но я ничего не известно о существующих 8-битных компиляторов , которые на самом деле действительно определяют intбыть больше , чем 16 бит, или поощрять 16-битные значения для чего-либо большего.
суперкат

-1

32-битные микроконтроллеры потребляют гораздо больше энергии для одного. И требуют больше поддержки схемотехники.

Один из них на самом деле не переходит на 32-битные от 8-битных ... Вы будете продолжать использовать оба, часто вместе. Суть в том, что вы должны использовать (и учиться) все, что подходит для работы. Изучайте ARM, потому что он прямо сейчас потрясает встроенный мир и будет продолжать это делать. Также изучите AVR или PIC, потому что они потрясающие контроллеры платы.

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


4
Я не знаю, правильно ли утверждать, что 32-битные микроконтроллеры по сути более энергоемки. По крайней мере, одна линейка продуктов компании ( Energy Micro ) - это микроконтроллеры со сверхнизким энергопотреблением, и все они основаны на 32-битном ядре ARM.
Коннор Вольф

3
Только что разработал схему stm32l1, которая должна работать 7 лет на cr2032
Скотт Сейдман

2
Можете ли вы обосновать комментарий о том, что 32-битному MCU требуется больше «схем поддержки»? Я думаю, что вы выражаете здесь несколько необоснованных мнений.
Джо Хасс

1
Кроме того, ваш комментарий к векторным прерываниям не имеет особого смысла, так как вы можете получить несколько уровней приоритета в 8-разрядных микроконтроллерах (см. Микроконтроллеры Atmel xmega, которые имеют 3 уровня приоритета), а наличие векторных прерываний не имеет значения, когда каждое аппаратное устройство имеет его. собственные независимые векторы в любом случае.
Коннор Вольф

2
Я использую 32-разрядный процессор Cortex-M0 для управления интеллектуальным зарядным устройством для электромобиля. Он использует один источник питания 3,3 В. Он имеет внутренний генератор и PLL, поэтому мне даже не нужен кристалл. Я использую 28-контактный DIP-пакет, но я могу получить Cortex-M0 в 8-контактном DIP, если захочу. Как это может быть более сложным, чем типичный PIC или AVR?
Джо Хасс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.