В общем, переход с микроконтроллеров с 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.