Это большая тема, и я не могу дать простой ответ, но ...
Вы можете немного приблизиться к этому ответу, выполнив несколько разделений и побед, и, поскольку другой ответ пытается атаковать эту проблему с точки зрения hw, я попробую с точки зрения SW высокого уровня.
Если вы пишете какое-то программное обеспечение, скажем, на языке c (очень высокий уровень абстракции), вы на самом деле не видите, что происходит, на самом деле не понимаете всего того, о чем вы спрашиваете.
Но давайте все равно начнем.
Простая программа, которая просто включает переменную.
int main(void)
{
int i=0;
while(1) {
i++;
}
}
Затем нам нужно получить код на ассемблере, чтобы мы могли понять, что происходит. Этот шаг можно выполнить на любой платформе, которую вы используете, но для простоты я использую gcc на ПК (но это не имеет значения ...)
gcc -O0 -S main.c -o main.lst
Тогда мы получим что-то вроде этого:
.file "main.c"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $0, -4(%ebp)
.L2:
addl $1, -4(%ebp)
jmp .L2
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
Затем вы пытаетесь понять каждую строку кода и то, что он делает.
И тогда вы начинаете изучать, как каждая инструкция реализуется ... Например, субл
subl $16, %esp
На данный момент все по-разному на разных архитектурах и x86, arm, pic вроде бы разные ... Но так как мой пример был x86.
И на этом уровне, когда вы читаете копию, большинство действий будет выглядеть так, будто вы просто перемещаете числа, и в некотором смысле это то, что происходит. У нас есть предопределенная программа, которую мы выполняем, эта программа хранится в некоторой флэш-памяти, которая обычно представляет собой какую-то электронную логику, которая захватывает один логический уровень.
Если вы видите какой-то « триггер » для каждого бита, то вы как бы близки, и тогда нам нужно много таких. Здесь мы начинаем находить ваши единицы и нули.
Затем, чтобы произошло какое-то действие, мы добавляем некоторую классную логику, которая может преобразовать одно число в другое число (сам процессор).
И затем мы следуем программе по одному шагу за раз, и чтобы узнать, где мы находимся, у нас есть счетчик программ (ПК). И перемещайте числа назад и на четвертое и сохраняйте их в другой памяти, которая также является своего рода решеткой с триггерами.
Но давайте снова вернемся к какому-то конкретному примеру, чтобы немного лучше понять процессор, мы можем взглянуть на ALU и эту упрощенную картину . Вы можете видеть, что когда мы перемещаем данные в этот логический блок и выбираем какую-либо операцию с контактами OP, мы получим новый результат на выходе. Что мы в свою очередь можем вернуться в какое-то место в памяти.
И проклясть ваш ALU в вашей части CPU вашего MCU намного сложнее, чем этот, но он работает по тому же базовому принципу.
В этот момент мы можем видеть некоторую логическую схему, которая выполняет «работу» с одной стороны, и некоторое хранилище с другой стороны. И хранилище состоит из двух частей, одна для программы и одна для данных. Но как мы на самом деле «двигаемся» тогда, это должно быть каким-то образом связано ...
И здесь мы соединяем эти части с каким-то автобусом.
Шина - это просто несколько проводов, которые соединяют различные части вместе, и затем логика управления сообщает памяти, какие данные отправлять на эту шину, и какую часть ЦП следует прослушивать, чтобы эти данные были отправлены. И это делается с помощью нескольких параллельных линий управления, которые будут включать / отключать различные части.
...
Поэтому, если вы выбираете mcu по своему выбору и анализируете очень маленькую программу, и пока вы не понимаете, что происходит, вы анализируете ее еще больше, пока у вас не получится симпатичная маленькая головоломка, которую можно использовать для создания «mcu».
И не забудьте прочитать таблицу данных для вашего mcu и посмотреть, с какими частями он был сделан, например, с какой памятью, alu, bus и т. Д. И т. Д.
Надеюсь, это поможет немного ???
Удачи