Итак, на данный момент у нас есть 8-битные, 16-битные и 32-битные микроконтроллеры в этом мире. Все они часто используются. Насколько отличается программирование 8-битных и 16-битных микроконтроллеров? Я имею в виду, это требует другой техники или навыка? Например, возьмем микрочип. Что нового нужно узнать человеку, если он хочет перейти с 8-разрядных микроконтроллеров на 32-разрядные?
microcontroller
programming
quantum231
источник
источник
Ответы:
В общем, переход с микроконтроллеров с 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-битными и 32-битными микроконтроллерами заключается в том, что 8-битные часто имеют диапазон памяти и пространство ввода / вывода, к которому можно обращаться в одной инструкции, независимо от контекста выполнения, тогда как 32-битные микроконтроллеры часто требуется последовательность из нескольких инструкций. Например, на типичном 8-битном микроконтроллере (HC05, 8051, PIC-18F и т. Д.) Можно изменить состояние бита порта, используя одну инструкцию. На типичном ARM (32-битном), если содержимое регистра было первоначально неизвестно, потребуется последовательность команд из четырех команд:
В большинстве проектов контроллер тратит подавляющее большинство своего времени, занимаясь чем-то другим, кроме установки или очистки отдельных битов ввода-вывода, поэтому тот факт, что такие операции, как очистка вывода порта, часто требуют большего количества инструкций, не имеет значения. С другой стороны, бывают случаи, когда коду приходится «сильно взрывать» множество манипуляций с портами, и возможность делать такие вещи с помощью одной инструкции может оказаться весьма полезной.
С другой стороны, 32-битные контроллеры неизменно предназначены для эффективного доступа ко многим видам структур данных, которые могут храниться в памяти. Для сравнения, многие 8-битные контроллеры очень неэффективны для доступа к структурам данных, которые не являются статически распределенными. 32-битный контроллер может выполнять в одной инструкции доступ к массиву, что потребует полдюжины или более инструкций на типичном 8-битном контроллере.
источник
region_base[offset]
)Самым большим практическим отличием является объем документации, чтобы полностью понять весь чип. Существуют 8-битные микроконтроллеры, которые содержат почти 1000 страниц документации. Сравните это примерно с 200-300 страницами для 8-битного процессора 1980-х годов и популярных периферийных чипов, с которыми он будет использоваться. 32-разрядное устройство с большим количеством периферийных устройств потребует от 2000 до 10000 страниц документации, чтобы понять эту часть. Детали с современной трехмерной графикой на 20 тыс. Страниц документации.
По моему опыту, для того, чтобы узнать все, что нужно знать о данном современном 32-битном контроллере, требуется примерно в 10 раз больше, чем для современной 8-битной части. Под «всем» я подразумеваю, что вы знаете, как использовать все периферийные устройства, даже нетрадиционными способами, и знаете машинный язык, ассемблер, который использует платформа, а также другие инструменты, ABI (и) и т. Д.
Не исключено, что многие, многие проекты выполнены с частичным пониманием. Иногда это несущественно, иногда нет. Переключение платформ должно осуществляться с пониманием того, что за производительность вы получите краткосрочную и среднесрочную цену, которую вы заплатите за ощутимый прирост производительности от более мощной архитектуры. Проведите юридическую проверку.
источник
Лично я не стал бы слишком беспокоиться об обновлении (8-битной и 32-битной) УК того же семейства, а вы увеличиваете спецификации по всем направлениям. Как правило, я не делаю ничего необычного с типами данных, так как это может быть трудно поддерживать в будущем.
Понижение кода устройства - это отдельная история.
источник
int
32 бита, или даже 64 по этому вопросу, но я ничего не известно о существующих 8-битных компиляторов , которые на самом деле действительно определяютint
быть больше , чем 16 бит, или поощрять 16-битные значения для чего-либо большего.32-битные микроконтроллеры потребляют гораздо больше энергии для одного. И требуют больше поддержки схемотехники.
Один из них на самом деле не переходит на 32-битные от 8-битных ... Вы будете продолжать использовать оба, часто вместе. Суть в том, что вы должны использовать (и учиться) все, что подходит для работы. Изучайте ARM, потому что он прямо сейчас потрясает встроенный мир и будет продолжать это делать. Также изучите AVR или PIC, потому что они потрясающие контроллеры платы.
Вы, вероятно, будете испытывать столько же проблем при переключении с AVR на ARM, сколько с ARM на x86, в любом случае, размер шины на самом деле не имеет большого значения. Все дополнительное оборудование, хотя и делает. Переход от стандартных прерываний к массиву векторных прерываний с 6 уровнями приоритета будет гораздо сложнее, чем вычислить, как считать до четырех миллиардов.
источник