二进制数以 2 为基数表示,其工作原理如下:
每条信号线传输一个比特,以高电压表示信号“1”,低电压表示信号“0”,如图7-1 所示。
对于某个给定的单元地址,存储器可以进行两种操作:获取其值或存储新值,如图7-2 所示。存储器包括一条用于设置操作模式的特殊信号线。
CPU
CPU 包括若干称为寄存器的内部存储单元,它能对存储在这些寄存器中的数字执行简单的数学运算,也能在RAM 与寄存器之间传输数据。可以指示CPU 执行以下典型的操作:◎ 将数据从存储位置 220 复制到寄存器 3;◎ 将寄存器 3 与寄存器 1 中的数字相加。CPU 可以执行的所有操作的集合称为指令集,指令集中的每项操作被分配一个数字。计算机代码本质上是表示CPU 操作的数字序列,这些操作以数字的形式存储在RAM 中。输入/ 输出数据、部分计算以及计算机代码都存储在RAM 中。
通过在RAM 中包含重写部分代码的指令,代码甚至可以对自身修改,这是计算机病毒逃避反病毒软件检测的惯用手法。与之类似,生物病毒通过改变自身的DNA以躲避宿主免疫系统的打击。
图7-6 取自Intel 4004 操作手册,显示了部分CPU 指令映射为数字的方法。随着制造工艺的发展,CPU 支持的操作越来越多。现代CPU 的指令集极为庞大,但最重要的指令在几十年前就已存在。在许多个人计算机中,这种程序称为BIOS(基本输入输出系统)。CPU 上电后将继续执行这种“获取- 执行”周期直至关机。然而,如果CPU 只能遵循有序、顺序的操作列表,那么它与一个花哨的计算器并无二致。CPU 的神奇之处在于可以指示它向PC 中写入新值,从而实现执行过程的分支,或“跳转”到存储器的其他位置。这种分支可以是有条件的。以下面这条CPU 指令为例:“如果寄存器1 等于0,将PC设置为地址200”。该指令相当于:
if x = 0 compute_this() else compute_that()仅此而已。无论是打开网站、玩计算机游戏抑或编辑电子表格,所涉及的计算并无区别,都是一系列只能对存储器中的数据求和、比较或移动的简单操作。大量简单的操作组合在一起,就能表达复杂的过程。以经典的《太空侵略者》游戏为例,其代码包括大约3000 条机器指令。
他们认为应该进行以下修改:function factorial(n)
if n > 1
return factorial(n - 1) * n
else
return 1
诚然,在不使用递归的情况下执行factorial 函数将消耗较少的计算资源,但仍然没有理由因此而改变代码。现代编译器将自动重写简单的递归函数,举例如下。function factorial(n)
result ← 1
while n > 1
result ← result * n
n ← n - 1
return result
为避免进行两次x+y 计算,编译器将上述代码重写为:i ← x + y + 1
j ← x + y
应专注于编写清晰且自解释的代码。如果性能出现问题,可以利用分析工具寻找代码中的瓶颈,并尝试改用更好的方法计算存在问题的代码。此外,避免在不必要的微操作上浪费太多时间。但在某些情况下,我们希望跳过编译,接下来将对此进行讨论。t1 ← x + y
i ← t1 + 1
j ← t1
对于时钟频率为1 GHz 的CPU,一个周期的持续时间约为十亿分之一秒,这是光线从本书进入读者眼中所需的时间。处理器与存储器之间的鸿沟
在两个面对面的人之间,声波传播需要大约10 微秒。时间局部性与空间局部性
标准照片在大约4 毫秒内捕捉光线。CPU 无法直接访问第二级存储器。执行保存在第二级存储器中的程序之前,必须将其复制到第一级存储器。实际上,每次启动计算机时,即便是操作系统也要从磁盘复制到RAM,否则CPU 无法运行。
原文标题:新手经常忽略的嵌入式基础知识点,你都掌握了吗?
文章出处:【微信公众号:小麦大叔】欢迎添加关注!文章转载请注明出处。
全部0条评论
快来发表一下你的评论吧 !