首页 > 应用与设计 > 电器 > Service Robots > 服务型机器人 > TI机器人系统学习套件(TI-RSLK) >

服务型机器人

最新课程

热门课程

TI-RSLK 模块 3 - 讲座视频 - ARM Cortex M 架构

大家好, 我是 Jon Valvano。 在本次讲座中, 我们将讨论结构。 我们将讨论总线、 RISK、寄存器。 在本次讲座中,我们 要做的最重要的事情是, 观看计算机是 如何访问内存的。 因此,我坚信, 您对处理器的 工作方式了解的越多, 您就越了解 Cortex M 实际上是如何执行 软件的,也就越有可能 成为更加优秀的 嵌入式系统工程师。 好的。 那么,让我们开始吧。 结构是 计算机的 各种组件 连接在 一起的方式。 正如我说过的,我们 有一个 Cortex M 处理器。 这是执行 软件的实体。 我们有两种类型的内存。 我们有可电擦除 可编程的只读内存。 有时我们将其称为闪存, 有时我们将其称为 ROM。 它位于该只读 内存中,我们的 指令、操作码和 机器码就存储在 该只读内存中。 另一种类型的内存是 称为随机存取内存的 读取/写入内存。 该磁盘包含我们 执行时的数据。 计算机的 其他组件 是输入端口 和输出端口。 正如我说过的, 结构是这里的 组件在计算机内 连接在一起的 方式。 因此,Cortex M 是哈佛 结构,因为它具有 用于提取操作码的总线, 该总线与另一条总线 -- 第二条总线 -- 是相分离的,它使用该第二条 总线在内存中进行读取和写入。 因此,哈佛结构 具有两条总线, 一条用于提取操作码, 另一条用于提取数据。 这之所以很重要, 是因为它可以使 您的计算机具有 很快的运行速度, 因为它可以同时 执行多个操作。 而冯·诺依曼 结构是单条总线, 它使用该总线 访问它的所有 组件。 Cortex M 不仅 具有两条总线, 它实际上具有 一大堆总线。 有一条完全用于 调试的总线, 还有一条用于某些 内部外设的总线。 那么,您需要从该 幻灯片中获取的 信息是,Cortex M 非常复杂。 此外,它针对速度进行了优化。 该特定结构的 第二个优势 是精简的 指令集结构。 这意味着它 具有很少的指令。 它事实上是 200 条, 有些人可能认为 该数量很多, 但 200 不算多。 从某种意义上 来说,RISK 结构 具有所有固定 长度的指令。 事实上,在您的 Thumb-2 结构中, 在 Cortex M 上的 Thumb-2 指令集中, 大多数指令的 长度是 16 位。 少量指令具有 32 位的长度。 这已经足够接近 该规则,可以将 Cortex M 分类为 RISK 处理器。 现在,对于 RISK 处理器, 您可以说的是,由于 指令非常非常简单, 因此大多数指令 在一个或两个 总线周期中执行。 因此,我们将以每秒 4800 万个周期的速度 运行。 这意味着 我们每秒 将执行大约 2400 万条指令。 我们将看到,这是 一个加载存储结构。 因此,将有一条 用于将数据 从内存提取到 处理器中的指令, 还有另一条用于获取 数据并将其存储到 内存中的指令。 这是经典的 RISK 过程。 然后,我们将看到大量的 寄存器和很少数量的 寻址模式。 现在,与 RISK 相反的 是复杂指令集计算机 或 CISC,它们 具有大量的指令, 其长度和执行 时间都是可变的, 许多指令 可以访问内存。 寄存器通常 是专用的, 但我们将讨论 RISK 处理器。 您将看到的是, 当它分解为 机器码时, 有大量的 指令。 但它仍将具有 很快的执行速度。 这正是该节讨论的重点。 那么,我们讨论了 存在大量的寄存器。 它们在这里。 您的 Cortex M 上有 16 个 寄存器。每个寄存器的 宽度为 32 位。 这是一个 32 位结构。 我们将看到, 寄存器 R0 用于存储 函数参数。 因此,如果您有 单个函数参数, 它将在 R0 中传递。 如果您有第二个参数, 它将在 R1 中传递。 第三个参数在 R2 中传递, 第四个参数在 R3 中传递。 现在,函数的 返回参数将 在 R0 中返回。 现在,让我们看看 其他一些寄存器。 寄存器 13 是堆栈指针。 我们将在几张 幻灯片中看到堆栈。 它非常重要。 堆栈是 临时信息, 我们可以将其 用于局部变量 或临时存储。 连接寄存器 用于函数调用。 我们也将看到它。 寄存器R14 是连接寄存器, 而最重要的 寄存器可能是 寄存器R15。 它是程序计数器。 它是一个指向 ROM 的东西, 我们将从该 ROM 里面提取 我们的操作码。 该幻灯片中的 重点是,数据 在软件中非常 重要,您需要 知道数据可能 存在于许多位置。 如果它存在于寄存器中, 这意味着它具有很高的速度。 因为寄存器不位于 内存中,它们位于 处理器中,它们的 速度非常块,并且 它们是临时的。 如果我们将数据放置在 RAM 中, 它会长时间地保存在那里, 直到我们关闭电源, 因为 RAM 具有易失性。 因此,如果我们将信息放置 在 RAM 中,并且我们关闭电源, 那么该信息将丢失。 不过,它的 速度也很快, 我可以对其进行读取/写入。 请注意,ROM 具有 非易失性,它是 我们放置常量 和程序的地方。 非易失性 意味着, 当电源打开并关闭后, 它不会丢失其信息。 有时,我们可以看到 数据位于 I/O 端口中。 因此,您学习 结构的原因之一 是弄清您的 数据位于何处 并确定您的数据 是临时的还是永久的。 正如我们以前 所指出的,程序、 命令、指令位于 ROM 中,程序计数器 会指向它们。 好的。 那么,让我们来谈谈内存。 我们已看到它是 哈佛结构,这样 当它提取操作码时, 它使用 ICode 总线, 当它提取 RAM 或 I/O 端口时, 它将使用系统总线。 即使这样,即使 有多条总线, 也仅有单个地址空间。 您可以看到 地址本身为 32 位,这意味着 整个地址空间的 大小为 2 的 32 次方或 4 千兆字节。 计算机中的每个 地址宽度为 8 位。 这将在下一张幻灯片中 为我们带来一个问题。 我们将向您展示 如何访问多个字节, 如何访问 32 位值,即使 它存在于四个不同的地址, 也可以访问它。 但请记住,程序 计数器指向 ROM, ROM 中包含 机器码和 所有常量。 其他寄存器 将指向 RAM, 我们的数据 就存储在这里。 那么,我们的程序存储在 ROM 中, 我们的数据存储在 RAM 中。 ROM 具有非易失性, 而 RAM 具有易失性。 I/O 设备还将存在于 该内存映射中。 因此,您将看到 I/O 端口,您知道, 端口 1、端口 2、端口 3 -- 我们将在后续讲座中 讨论该话题 -- 存在于这里的 同一地址空间中。 我要向您指出, 该图不是按比例 绘制的。 如果您看看实际上 可以访问的字节 总数,就可以看到 大约为 400,000 个稍微 不同的位置,这些 位置将是可以访问的。 但有 40 亿个 可能的地址。 因此,大部分 地址空间是空的。 那么,再说一次,通过该幻灯片,您 可以了解到程序存储在 ROM 中, 数据存储在 RAM 中。 我们必须弄清 如何提取 32 位 数据,即使 内存空间的 可寻址访问是 按字节寻址的, 每次 8 位。 那么,可以通过两种方法来实现它。 如果您获取一个 32 位的数字, 有一个 32 位的数字, 分解为十六进制数。 这将需要四个 字节的存储空间 和四个不同的地址 来存储该 32 位数字。 那么,可以通过 两种方法来实现它。 我们可以采用这里的 最高有效字节, 将其作为第一个字节。 然后,将第二高有效 字节作为第二个字节, 将第三高有效字节作为 第三个字节,将最低有效字节 作为最后一个字节。 如果我们这么做, 这称为大端字节序。 请注意,事实上 Cortex M 并未采用这种方法。 才采用了相反的方法。 它采用小端字节序来实现它。 它采用最低有效字节, 首先在其中存储数据, 然后将第二低有效字节作为第二个字节, 将第三低有效字节作为第三个字节, 将最高有效字节 作为最后一个字节。 这称为小端字节序。 好的。 如果我希望访问 16 位 值,将发生类似的情况。 它使用两个字节 并采用小端字节序, 我们的 Cortex M 采用的 正是该方法,它将 首先在最低有效字节中存储 数据,然后在最高有效字节中 存储数据。 再说一次,认识到 这一点对您非常重要, 因为您将查看 内存的内部 -- 我的数据在 哪里 -- 它可以 分解为多个字节。 它将首先在最低有效 字节中存储数据。 请注意,有些内容 并不遵守该规则。 换句话说,字符串是 一个 ASCII 字符序列。 这里有一个 J、一个 O 以及一个 N,然后 是 null,这意味着 字符串的结尾。 如果我有一个字符串, 它是一个数字序列, 那么它始终首先存储第一个字符。 这是 J。然后存储 第二个字符,接下来 存储第三个字符, 最后存储 null 字符。 无论计算机采用大端 字节序还是采用小端 字节序,都是如此。 在您的固有 理解中,计算机的 工作方式是不是如何 从内存中提取数据? 如何将数据从内存 转移到处理器呢? 它是通过寻址模式完成的。 因此,对于如何将数据 转移到处理器中而言, 寻址模式正是 该转移过程。 我们将首先讨论最简单的寻址 模式,该模式称为立即寻址。 立即寻址在这里 由该#号表示。 立即寻址模式 意味着数据 本身以指令的 机器码进行 编码。 那么,这是这些 32 位指令之一, 它显然位于 ROM 中。 程序计数器 指向机器码。 当这执行时,该特定的 指令所做的是,它获取 值 100 并将其 存储在寄存器的 32 个位中。 但是,如果我 查看机器码, 我可以看到 100 等于 0x64。 我可以看到嵌入到 机器码中的数字 100。 那么,这是立即 寻址模式,其中 数据位于 指令本身中。 有几条指令 采用立即 寻址模式。 将数据提取到处理器 中的最常见方式是使用 变址寻址模式。 这之所以 很重要, 是因为作为 一名程序员, 您需要了解指针 和数据之间的区别, 指针是一个地址, 而数据是一个值。 正是在这条 简单的指令中, 我们可以看到 这两项操作。 因此,在变址 寻址模式中, 我们会通过某种 方式获取一个指针。 那么,这是一个寄存器。 它可以是这些 寄存器中的任何一个。 在该寄存器中,我们 将存储一个地址, 而不是一个数字。 那么,这是一个 RAM 地址。 它将指向 RAM。 这是实际值, 这里的指令 将在该地址提取 相应的内容, 并将其存储到该寄存器中。 那么,当该指令 执行时,12345678 -- 再说一遍,这采用小端 字节序进行存储 -- 该值会加载到 寄存器 R0 中。 我们可以看到,它 是这些 16 位指令之一, 它的运行速度很快。 有一个变址寻址模式 版本,其中,再说一次, R1 是地址,但我 要添加偏移地址。 因此,对于 R4 中的 地址,我们要向其 添加 4,以获得另一个地址。 请注意,它不会修改 R1 如果 R1 等于 20000004,我向其添加 4, 我得到 20000008。 该指令将提取 这个值,87654321, 它是一个值。 那么,请注意这是 一个地址,它表示 指针,这是其数据。 因此,它处于 变址寻址模式, 对我而言,这是最强大的 用于从内存提取数据 或将数据回写 到内存中的方法。 现在,我们有一整套 使用相对于程序寻址的 方法。 请注意,事实上,相对于 程序寻址的方法是,我们 获取程序计数器,然后 我们向其添加偏移地址。 因此,它实际上是采用偏移 地址的变址寻址模式。 但我们要将其称为 相对于 PC 寻址,因为我们 知道,它是相对于 程序计数器而言的。 因此,再说一次, 您必须了解的是, 我将如何 访问内存。 因此,这里的 伪操作,该 .field 将获取 Count 的值, 该符号表模式 是其地址,因此 在 ROM 中的该位置, 它将是一个 32 位值。 在这里 -- 这是 30,这是 ROM。 这是 ROM。 这是 RAM。 那么,这是 ROM。 这是 RAM。 因此,存储到 ROM 中的是一个 32 位值,它是 Count 的地址。 在这里的指令中,我们 将提取 Count 的地址。 请注意,它是 相对于 PC 的, 地址与程序一起 存储在这里。 那么,这里的第一条 指令将首先提取 -- 首先提取地址,这样 R1 现在就指向该变量。 第二条指令 是我们在 前一张幻灯片中 看到的指令,它将 提取值。 例如,如果 count 等于 5, 这里的第二条指令会 将该 5 传递到寄存器中。 第三条指令使用 立即寻址模式和 寄存器寻址模式, 并采用 R1,将 R1 添加到它,向其添加 1, 然后将其存储回去。 因此,它会将这递增到 6。 这是第三条指令。 第四条指令 是存储指令。 它将获取该 6,然后 将其存储回到该位置。 我希望您 在这里看到的是如何访问变量。 我们将首先 获取其地址。 然后,我们 将获取其值。 它将执行 两条指令。 但再说一次,它的运行速度很快。 我之所以向您提出这个话题, 是因为,顺便说一下,看看步骤 3。 让我们把这里放大, 请注意,在步骤3处, 该变量的值位于 两个不同的位置。 它位于 R0 中,它 仍位于内存中。 但这两个值 是不同的。 当我们转向 中断时,这将 成为一个问题。 我们将向您 展示如何解决它。 好的。 总之,我们 讨论了 RISC 与 CISC。 我们讨论了小端 字节序与大端字节序。 请记住,Cortex M 确实 采用了小端字节序。 您需要了解的 最重要的事情是 -- 那么,如果我有一个 称为 x 的变量,我想 访问该变量, 我将创建一个 指向该变量的 指针,一个 32 位 指针。 然后,当我执行时, 我将选择一个寄存器 -- 无论选择哪个都没有关系 -- 我将采用 相对于 PC 寻址, 我将引入 指向它的 指针,从而 使 R0 指向它。 然后我可以读取或写入。 在本例中,我要使用 变址寻址来读取它。 因此,我们应该认识到 如何访问数据,这一点 对我们而言非常重要。 关于结构的内容就是这样了, 我强烈建议您 在本次课程中 始终打开您的 Cortex M 手册, 确保您了解 您的计算机在做什么。 我认为,您越是了解您的 计算机的行为,您就越有可能 成为更加优秀的 嵌入式系统工程师。 那么,在下一个 视频中,我们将 看到 Cortex M 上的 部分指令。 374

大家好,

我是 Jon Valvano。

在本次讲座中, 我们将讨论结构。

我们将讨论总线、 RISK、寄存器。

在本次讲座中,我们 要做的最重要的事情是,

观看计算机是 如何访问内存的。

因此,我坚信, 您对处理器的

工作方式了解的越多, 您就越了解 Cortex M

实际上是如何执行 软件的,也就越有可能

成为更加优秀的 嵌入式系统工程师。

好的。

那么,让我们开始吧。

结构是 计算机的

各种组件 连接在

一起的方式。

正如我说过的,我们 有一个 Cortex M 处理器。

这是执行 软件的实体。

我们有两种类型的内存。

我们有可电擦除 可编程的只读内存。

有时我们将其称为闪存, 有时我们将其称为 ROM。

它位于该只读 内存中,我们的

指令、操作码和 机器码就存储在

该只读内存中。

另一种类型的内存是 称为随机存取内存的

读取/写入内存。

该磁盘包含我们 执行时的数据。

计算机的 其他组件

是输入端口 和输出端口。

正如我说过的, 结构是这里的

组件在计算机内 连接在一起的

方式。

因此,Cortex M 是哈佛 结构,因为它具有

用于提取操作码的总线, 该总线与另一条总线 --

第二条总线 --

是相分离的,它使用该第二条 总线在内存中进行读取和写入。

因此,哈佛结构 具有两条总线,

一条用于提取操作码, 另一条用于提取数据。

这之所以很重要, 是因为它可以使

您的计算机具有 很快的运行速度,

因为它可以同时 执行多个操作。

而冯·诺依曼 结构是单条总线,

它使用该总线 访问它的所有

组件。

Cortex M 不仅 具有两条总线,

它实际上具有 一大堆总线。

有一条完全用于 调试的总线,

还有一条用于某些 内部外设的总线。

那么,您需要从该 幻灯片中获取的

信息是,Cortex M 非常复杂。

此外,它针对速度进行了优化。

该特定结构的 第二个优势

是精简的 指令集结构。

这意味着它 具有很少的指令。

它事实上是 200 条, 有些人可能认为

该数量很多, 但 200 不算多。

从某种意义上 来说,RISK 结构

具有所有固定 长度的指令。

事实上,在您的 Thumb-2 结构中,

在 Cortex M 上的 Thumb-2 指令集中,

大多数指令的 长度是 16 位。

少量指令具有 32 位的长度。

这已经足够接近 该规则,可以将

Cortex M 分类为 RISK 处理器。

现在,对于 RISK 处理器, 您可以说的是,由于

指令非常非常简单, 因此大多数指令

在一个或两个 总线周期中执行。

因此,我们将以每秒 4800 万个周期的速度

运行。

这意味着 我们每秒

将执行大约 2400 万条指令。

我们将看到,这是 一个加载存储结构。

因此,将有一条 用于将数据

从内存提取到 处理器中的指令,

还有另一条用于获取 数据并将其存储到

内存中的指令。

这是经典的 RISK 过程。

然后,我们将看到大量的 寄存器和很少数量的

寻址模式。

现在,与 RISK 相反的 是复杂指令集计算机

或 CISC,它们 具有大量的指令,

其长度和执行 时间都是可变的,

许多指令 可以访问内存。

寄存器通常 是专用的,

但我们将讨论 RISK 处理器。

您将看到的是, 当它分解为

机器码时, 有大量的

指令。

但它仍将具有 很快的执行速度。

这正是该节讨论的重点。

那么,我们讨论了 存在大量的寄存器。

它们在这里。

您的 Cortex M 上有 16 个 寄存器。每个寄存器的

宽度为 32 位。

这是一个 32 位结构。

我们将看到, 寄存器 R0 用于存储

函数参数。

因此,如果您有 单个函数参数,

它将在 R0 中传递。

如果您有第二个参数, 它将在 R1 中传递。

第三个参数在 R2 中传递, 第四个参数在 R3 中传递。

现在,函数的 返回参数将

在 R0 中返回。

现在,让我们看看 其他一些寄存器。

寄存器 13 是堆栈指针。

我们将在几张 幻灯片中看到堆栈。

它非常重要。

堆栈是 临时信息,

我们可以将其 用于局部变量

或临时存储。

连接寄存器 用于函数调用。

我们也将看到它。

寄存器R14 是连接寄存器,

而最重要的 寄存器可能是

寄存器R15。

它是程序计数器。

它是一个指向 ROM 的东西, 我们将从该 ROM 里面提取

我们的操作码。

该幻灯片中的 重点是,数据

在软件中非常 重要,您需要

知道数据可能 存在于许多位置。

如果它存在于寄存器中, 这意味着它具有很高的速度。

因为寄存器不位于 内存中,它们位于

处理器中,它们的 速度非常块,并且

它们是临时的。

如果我们将数据放置在 RAM 中, 它会长时间地保存在那里,

直到我们关闭电源, 因为 RAM 具有易失性。

因此,如果我们将信息放置 在 RAM 中,并且我们关闭电源,

那么该信息将丢失。

不过,它的 速度也很快,

我可以对其进行读取/写入。

请注意,ROM 具有 非易失性,它是

我们放置常量 和程序的地方。

非易失性 意味着,

当电源打开并关闭后, 它不会丢失其信息。

有时,我们可以看到 数据位于 I/O 端口中。

因此,您学习 结构的原因之一

是弄清您的 数据位于何处

并确定您的数据 是临时的还是永久的。

正如我们以前 所指出的,程序、

命令、指令位于 ROM 中,程序计数器

会指向它们。

好的。

那么,让我们来谈谈内存。

我们已看到它是 哈佛结构,这样

当它提取操作码时, 它使用 ICode 总线,

当它提取 RAM 或 I/O 端口时,

它将使用系统总线。

即使这样,即使 有多条总线,

也仅有单个地址空间。

您可以看到 地址本身为

32 位,这意味着 整个地址空间的

大小为 2 的 32 次方或 4 千兆字节。

计算机中的每个 地址宽度为 8 位。

这将在下一张幻灯片中 为我们带来一个问题。

我们将向您展示 如何访问多个字节,

如何访问 32 位值,即使 它存在于四个不同的地址,

也可以访问它。

但请记住,程序 计数器指向 ROM,

ROM 中包含 机器码和

所有常量。

其他寄存器 将指向 RAM,

我们的数据 就存储在这里。

那么,我们的程序存储在 ROM 中, 我们的数据存储在 RAM 中。

ROM 具有非易失性, 而 RAM 具有易失性。

I/O 设备还将存在于 该内存映射中。

因此,您将看到 I/O 端口,您知道,

端口 1、端口 2、端口 3 -- 我们将在后续讲座中

讨论该话题 --

存在于这里的 同一地址空间中。

我要向您指出, 该图不是按比例

绘制的。

如果您看看实际上 可以访问的字节

总数,就可以看到 大约为 400,000 个稍微

不同的位置,这些 位置将是可以访问的。

但有 40 亿个 可能的地址。

因此,大部分 地址空间是空的。

那么,再说一次,通过该幻灯片,您 可以了解到程序存储在 ROM 中,

数据存储在 RAM 中。

我们必须弄清 如何提取 32 位

数据,即使 内存空间的

可寻址访问是 按字节寻址的,

每次 8 位。

那么,可以通过两种方法来实现它。

如果您获取一个 32 位的数字,

有一个 32 位的数字,

分解为十六进制数。

这将需要四个 字节的存储空间

和四个不同的地址 来存储该 32 位数字。

那么,可以通过 两种方法来实现它。

我们可以采用这里的 最高有效字节,

将其作为第一个字节。

然后,将第二高有效 字节作为第二个字节,

将第三高有效字节作为 第三个字节,将最低有效字节

作为最后一个字节。

如果我们这么做, 这称为大端字节序。

请注意,事实上 Cortex M 并未采用这种方法。

才采用了相反的方法。

它采用小端字节序来实现它。

它采用最低有效字节, 首先在其中存储数据,

然后将第二低有效字节作为第二个字节, 将第三低有效字节作为第三个字节,

将最高有效字节 作为最后一个字节。

这称为小端字节序。

好的。

如果我希望访问 16 位 值,将发生类似的情况。

它使用两个字节 并采用小端字节序,

我们的 Cortex M 采用的 正是该方法,它将

首先在最低有效字节中存储 数据,然后在最高有效字节中

存储数据。

再说一次,认识到 这一点对您非常重要,

因为您将查看 内存的内部 --

我的数据在 哪里 -- 它可以

分解为多个字节。

它将首先在最低有效 字节中存储数据。

请注意,有些内容 并不遵守该规则。

换句话说,字符串是 一个 ASCII 字符序列。

这里有一个 J、一个 O 以及一个 N,然后

是 null,这意味着 字符串的结尾。

如果我有一个字符串, 它是一个数字序列,

那么它始终首先存储第一个字符。

这是 J。然后存储 第二个字符,接下来

存储第三个字符, 最后存储 null 字符。

无论计算机采用大端 字节序还是采用小端

字节序,都是如此。

在您的固有 理解中,计算机的

工作方式是不是如何 从内存中提取数据?

如何将数据从内存 转移到处理器呢?

它是通过寻址模式完成的。

因此,对于如何将数据 转移到处理器中而言,

寻址模式正是 该转移过程。

我们将首先讨论最简单的寻址 模式,该模式称为立即寻址。

立即寻址在这里 由该#号表示。

立即寻址模式 意味着数据

本身以指令的 机器码进行

编码。

那么,这是这些 32 位指令之一,

它显然位于 ROM 中。

程序计数器 指向机器码。

当这执行时,该特定的 指令所做的是,它获取

值 100 并将其 存储在寄存器的

32 个位中。

但是,如果我 查看机器码,

我可以看到 100 等于 0x64。

我可以看到嵌入到 机器码中的数字 100。

那么,这是立即 寻址模式,其中

数据位于 指令本身中。

有几条指令 采用立即

寻址模式。

将数据提取到处理器 中的最常见方式是使用

变址寻址模式。

这之所以 很重要,

是因为作为 一名程序员,

您需要了解指针 和数据之间的区别,

指针是一个地址, 而数据是一个值。

正是在这条 简单的指令中,

我们可以看到 这两项操作。

因此,在变址 寻址模式中,

我们会通过某种 方式获取一个指针。

那么,这是一个寄存器。

它可以是这些 寄存器中的任何一个。

在该寄存器中,我们 将存储一个地址,

而不是一个数字。

那么,这是一个 RAM 地址。

它将指向 RAM。

这是实际值, 这里的指令

将在该地址提取 相应的内容,

并将其存储到该寄存器中。

那么,当该指令 执行时,12345678 --

再说一遍,这采用小端 字节序进行存储 --

该值会加载到 寄存器 R0 中。

我们可以看到,它 是这些 16 位指令之一,

它的运行速度很快。

有一个变址寻址模式 版本,其中,再说一次,

R1 是地址,但我 要添加偏移地址。

因此,对于 R4 中的 地址,我们要向其

添加 4,以获得另一个地址。

请注意,它不会修改 R1

如果 R1 等于 20000004,我向其添加 4,

我得到 20000008。

该指令将提取 这个值,87654321,

它是一个值。

那么,请注意这是 一个地址,它表示

指针,这是其数据。

因此,它处于 变址寻址模式,

对我而言,这是最强大的 用于从内存提取数据

或将数据回写 到内存中的方法。

现在,我们有一整套 使用相对于程序寻址的

方法。

请注意,事实上,相对于 程序寻址的方法是,我们

获取程序计数器,然后 我们向其添加偏移地址。

因此,它实际上是采用偏移 地址的变址寻址模式。

但我们要将其称为 相对于 PC 寻址,因为我们

知道,它是相对于 程序计数器而言的。

因此,再说一次, 您必须了解的是,

我将如何 访问内存。

因此,这里的 伪操作,该 .field

将获取 Count 的值, 该符号表模式

是其地址,因此 在 ROM 中的该位置,

它将是一个 32 位值。

在这里 -- 这是 30,这是 ROM。

这是 ROM。

这是 RAM。

那么,这是 ROM。

这是 RAM。

因此,存储到 ROM 中的是一个 32 位值,它是 Count 的地址。

在这里的指令中,我们 将提取 Count 的地址。

请注意,它是 相对于 PC 的,

地址与程序一起 存储在这里。

那么,这里的第一条 指令将首先提取 --

首先提取地址,这样 R1 现在就指向该变量。

第二条指令 是我们在

前一张幻灯片中 看到的指令,它将

提取值。

例如,如果 count 等于 5,

这里的第二条指令会 将该 5 传递到寄存器中。

第三条指令使用 立即寻址模式和

寄存器寻址模式, 并采用 R1,将 R1

添加到它,向其添加 1, 然后将其存储回去。

因此,它会将这递增到 6。

这是第三条指令。

第四条指令 是存储指令。

它将获取该 6,然后 将其存储回到该位置。

我希望您 在这里看到的是如何访问变量。

我们将首先 获取其地址。

然后,我们 将获取其值。

它将执行 两条指令。

但再说一次,它的运行速度很快。

我之所以向您提出这个话题, 是因为,顺便说一下,看看步骤 3。

让我们把这里放大, 请注意,在步骤3处,

该变量的值位于 两个不同的位置。

它位于 R0 中,它 仍位于内存中。

但这两个值 是不同的。

当我们转向 中断时,这将

成为一个问题。

我们将向您 展示如何解决它。

好的。

总之,我们 讨论了 RISC 与 CISC。

我们讨论了小端 字节序与大端字节序。

请记住,Cortex M 确实 采用了小端字节序。

您需要了解的 最重要的事情是 --

那么,如果我有一个 称为 x 的变量,我想

访问该变量, 我将创建一个

指向该变量的 指针,一个 32 位

指针。

然后,当我执行时, 我将选择一个寄存器 --

无论选择哪个都没有关系 --

我将采用 相对于 PC 寻址,

我将引入 指向它的

指针,从而 使 R0 指向它。

然后我可以读取或写入。

在本例中,我要使用 变址寻址来读取它。

因此,我们应该认识到 如何访问数据,这一点

对我们而言非常重要。

关于结构的内容就是这样了, 我强烈建议您

在本次课程中 始终打开您的

Cortex M 手册, 确保您了解

您的计算机在做什么。

我认为,您越是了解您的 计算机的行为,您就越有可能

成为更加优秀的 嵌入式系统工程师。

那么,在下一个 视频中,我们将

看到 Cortex M 上的 部分指令。 374

视频报错
手机看
扫码用手机观看
收藏本课程

相关下载

查看全部

视频简介

TI-RSLK 模块 3 - 讲座视频 - ARM Cortex M 架构

所属课程:TI机器人系统学习套件(TI-RSLK) 发布时间:2018.08.27 视频集数:69 本节视频时长:20:08
了解处理器的工作原理对于嵌入式系统的设计而言至关重要,例如你的机器人中所使用的处理器。
已有6人参与了讨论去论坛跟帖交流