这是一个大话题,我无法给出简单的答案,但是...
通过进行一些分而治之,您可以更接近此答案,并且由于另一个答案试图从硬件的角度来解决这个问题,因此我将从高层的SW角度尝试。
如果您用c代码(非常高的抽象水平)编写某些软件,您将不会真正看到正在发生的事情,而不会真正理解您所要求的所有爱好者的东西。
但是无论如何,让我们从那里开始。
一个仅包含变量的简单程序。
int main(void)
{
int i=0;
while(1) {
i++;
}
}
然后,我们需要获取汇编代码,以便我们了解发生了什么。此步骤可以在您使用的任何平台上完成,但为简单起见,我在PC上使用了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
subl $16, %esp
在这一点上,不同的体系结构和x86有所不同,arm,pic有所不同...但是由于我的示例是x86。
在此级别上,当您阅读副本时,大多数操作看起来就像是在移动数字,从某种意义上说,这就是发生的事情。我们有一个预先定义的程序,我们可以通过该程序,该程序存储在某种闪存中,通常是某种电子逻辑,它将捕获一个逻辑电平。
如果您看到某种“ 触发器”每时每刻都 ”,那么您就很接近了,那么我们需要很多。在这里,我们开始查找您的1和0。
然后,为了使某些动作发生,我们添加了一些很酷的逻辑,可以将一个数字转换为另一个数字(CPU本身)。
然后,我们一次只执行一个程序,就知道我们在哪里,我们有一个程序计数器(PC)。然后将数字向前和向后移动,并将它们存储在另一个带有触发器的网格中。
但是,让我们再次回到特定示例中,为了更好地了解CPU,我们可以看一下ALU和这张简化的图片。从中可以看到,当我们将数据移入该逻辑块并使用OP引脚选择某些操作时,我们将在输出端获得新的结果。反过来,我们可以移回内存中的某个位置。
诅咒您的ALU在MCU的CPU部分比这要复杂得多,但它的工作原理相同。
在这一点上,我们可以看到一些逻辑电路在一侧完成“工作”,而另一侧则进行一些存储。存储分为两部分,一部分用于程序,另一部分用于数据。但是我们实际上是如何“移动”的,这些必须以某种方式连接起来...
这是我们将这些部分与一些总线相连的地方。
总线只是将不同部分连接在一起的一些电线,然后控制逻辑告诉内存哪些数据要发送到该总线上,以及CPU的哪个部分应侦听已发送的数据。这是通过一些并行控制线完成的,这些控制线将启用/禁用不同的部件。
...
因此,如果您选择mcu并剖析了一个很小的程序,并且只要您不了解正在发生的事情,就可以对其进行剖析,直到有了一个可以用来创建“ mcu”的漂亮小难题为止。
并且不要忘了阅读您的MCU的数据表,并查看它是由什么样的零件制成的,例如什么样的内存,ALU,总线等。
希望这有所帮助 ???
祝好运