Программирование Различия между микроконтроллером и микропроцессором?

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

Например, Atmel ATtiny2313... я видел несколько учебных пособий, некоторые называют это микропроцессором, некоторые называют его микроконтроллером?

Что он? и программирует ли их (в основном) то же самое? (в сборе)

@Kellenjb: Было бы так, если бы он не спрашивал о различиях в программировании. Я думаю, что это достаточно отличается, чтобы не закрыть.
@ BG100 принятый ответ действительно объяснил только разницу, а не разницу в программировании.

Ответы (6)

Это действительно два вопроса в одном...

Во-первых, в чем разница между микроконтроллером и микропроцессором?

Микропроцессор — это чисто ЦП, который следует набору инструкций, считываемых с внешней шины памяти. Он управляет внешними периферийными устройствами (такими как экран, клавиатура, мышь, жесткий диск и т. д.) через внешнюю коммуникационную шину. Когда вы программируете микропроцессор, ваша программа является внешней по отношению к устройству. В компьютере эта память изначально представляет собой загрузочное ПЗУ BIOS, которое сначала считывает операционную систему с жесткого диска в оперативную память, а затем продолжает выполнять ее оттуда.

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

Во-вторых, программирование микроконтроллера и микропроцессора одно и то же?

В чем-то да, а в чем-то нет.

Язык ассемблера — это широкий термин, описывающий набор инструкций, которые ЦП может понять напрямую. Когда вы «компилируете» язык ассемблера, он на самом деле ничего не компилирует, все, что он делает, это преобразует его в последовательность байтов, которые представляют команды и плагины в некоторых относительных местах памяти. Это характерно как для микропроцессоров, так и для микроконтроллеров.

Однако разные типы ЦП понимают разный набор инструкций ЦП. Например, если вы пишете программу на ассемблере, которая работает с микроконтроллером pic 16F877, она будет полной ерундой для микропроцессора или любого другого микроконтроллера, не входящего в семейство микроконтроллеров pic 16Fxxx.

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

Ну, я имел в виду, что да, ASM будет разным для каждого..... но команды/и т. д. обычно одинаковы (или выполняются одинаково) между MC и MP... Я имею в виду, что у MC есть MP так что я бы предположил так .. (минус память)
@Sauron: Нет, не совсем... хотя некоторые команды могут быть одинаковыми для разных устройств, например add, mov, sub и т. д., они, вероятно, реализованы по-разному и не будут переноситься между устройствами.
Отличный ответ, который, вероятно, мог бы помочь мне, когда я начинал свой класс микропроцессоров.
ну, я имел в виду... Например, поскольку микроконтроллер имеет ЦП внутри него... инструкции по сборке больше нацелены на фактический ЦП, а не на компоненты вокруг него.
@Sauron: Да, это правильно.

Разница в том, что микроконтроллер включает в себя встроенную память, такую ​​как флэш-память EEPROM и ОЗУ, и периферийные устройства, такие как параллельный и последовательный ввод-вывод. С первыми микропроцессорами все это были внешние устройства. Вместо микропроцессоров ввода-вывода к их контактам были подведены шина адреса и данных.
То, как вы пишете код для обоих, одинаково.

Чтобы проиллюстрировать это: существуют архитектуры (например, ARM), в которых один и тот же ЦП доступен в качестве микроконтроллера (со всей памятью для кода и данных на кристалле), микропроцессора (вся внешняя память для кода и данных) или гибрида (некоторые память на чипе, но для большинства приложений вы добавите внешнюю память). ЦП тот же, поэтому программирование (в смысле инструкций ЦП) такое же.

О, хорошо, это имеет больше смысла, но ASM для каждого из них в основном одинаков?
Вы имеете в виду, что если я научусь программировать для серии Cortex M, я смогу кодировать и для серии Cortex A??
В основном да на оба вопроса, инструкции asm одинаковы (хотя могут быть небольшие различия, точно так же, как различные версии ARM могут добавлять определенные инструкции). Но всякий раз, когда вы используете что-то вне ЦП (кэш, контроллер прерываний, периферийные устройства и т. д.), будут большие различия.

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

Примеры семейств микротроллеров, использующих гарвардскую архитектуру, включают: AVR, Intel 8051, PIC (кроме PIC32, см. ниже) и ARM Cortex-M3. Заметным исключением являются процессоры Freescale, такие как HCS08, которые используют архитектуру фон Неймана, как и Parallax Propeller.

Это влияет на программирование несколькими способами (примеры, показанные ниже, используют C):

Может быть несколько типов оперативной памяти, каждая со своим адресным пространством. Например, у процессора 8051 внешние данные (xdata) адресуются отдельно от первых 256 байт ОЗУ, хотя оба они реализованы на одном чипе. Поэтому нужно использовать квалификаторы для объявлений переменных, таких какunsigned int xdata foo;

Если константы объявлены в памяти кода, может потребоваться их копирование в ОЗУ, прежде чем к ним можно будет получить доступ. Или должен быть способ доступа к кодовой памяти, как если бы это были данные — например, квалификатор кода для 8051 или функция PIC Program Space Visiblity (PSV).

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

Вы не можете выполнять код из оперативной памяти в строгой гарвардской архитектуре, поэтому не может быть никакого самомодифицирующегося кода (если не считать перепрошивку программной памяти на лету). Однако PIC32 имеет модифицированную гарвардскую архитектуру, которая позволяет выполнять код в оперативной памяти. Parallax Propeller на самом деле использует свою способность модифицировать код для выполнения возврата из подпрограммы, поскольку у него нет аппаратного стека.

Микроконтроллер, как правило, представляет собой однокристальное решение для обеспечения вычислений и периферийных функций.

Микропроцессор обеспечивает вычислительные функции, но не периферийные функции.

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

Для данной архитектуры (скажем, процессоров и микроконтроллеров на базе x86) «вычислительное» кодирование будет идентичным. Но то, как вы получаете доступ к периферийным функциям, будет различаться, и поэтому у вас будет очень разное аппаратное кодирование, основанное на том, как периферийные функции реализованы на вашем целевом оборудовании.

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

Некоторые микроконтроллеры используют те же наборы инструкций, что и популярные микропроцессоры. Набор инструкций 68000, используемый в оригинальных линейках персональных компьютеров Macintosh, Amiga и Atari ST, также использовался в некоторых микроконтроллерах. Несмотря на то, что набор инструкций, используемый Macintosh и платой управления на базе 68HC340, одинаков, программирование для этих двух платформ может сильно различаться. На Macintosh к тому времени, когда пользовательская программа запустится, большая часть системы уже будет «настроена». Код, которому требуется блок памяти, может загрузить в регистры необходимое количество и выполнить инструкцию «A-trap». Затем ОС Macintosh вернет указатель на часть памяти, которая ранее не была выделена для какой-либо другой цели, и пометит эту область памяти, чтобы она не использовалась. t быть выделен снова, пока не будет получено указание, что исходный получатель больше не нуждается в нем. Напротив, на плате с 68HC340 и 128 КБ ОЗУ нет необходимости или возможности «запрашивать» ОЗУ. Когда программа запустится, она «получит» 128 КБ, которую сможет использовать по своему усмотрению; ничто другое не будет его использовать, но, с другой стороны, пользовательская программа должна отслеживать, какие области она использует для каких целей, поскольку ничто другое не будет отслеживать это.

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

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

Микроконтроллер: полный модуль, который содержит микропроцессор с внутренней памятью в дополнение к другим модулям.

Добро пожаловать в EE.SE, Майк. Используйте <enter> x 2 для разрыва абзаца. Я исправил это для вас.