有人可以解释跳转表的机制吗?为什么在嵌入式系统中需要它?
答案 0 :(得分:46)
跳转表可以是函数指针数组,也可以是机器代码跳转指令数组。如果您有一组相对静态的函数(例如系统调用或类的虚函数),那么您可以创建此表一次并使用数组中的简单索引调用函数。这意味着检索指针并调用函数或跳转到机器代码,具体取决于所使用的表的类型。
在嵌入式编程中执行此操作的好处是:
如果确实为访问该表而花费了一点点性能,但这并不比任何其他虚拟函数调用差。
答案 1 :(得分:22)
跳转表,也称为分支表,是一系列指令,全部无条件地分支到代码中的另一个点。
您可以将它们视为切换所有案例的开关(或选择)语句:
MyJump(int c)
{
switch(state)
{
case 0:
goto func0label;
case 1:
goto func1label;
case 2:
goto func2label;
}
}
请注意,没有返回 - 它跳转到的代码将执行返回,它将跳回myjump被调用的任何地方。
这对于基于状态变量执行某些代码的状态机非常有用。有许多其他用途,但这是主要用途之一。
它用于你不想浪费时间摆弄堆栈,并希望节省代码空间。它尤其适用于速度非常重要的中断处理程序,导致中断的外设只能由单个变量知道。这类似于带有中断控制器的处理器中的向量表。
一种用途是使用0.60美元的微控制器并为视频应用生成复合(TV)信号。 micro并不强大 - 实际上它只是写入每条扫描线的速度还不够快。跳转表将用于绘制字符,因为从内存加载位图需要太长时间,并使用for()循环将位图移出。而是单独跳转到字母和扫描线,然后是大约8个实际将数据直接写入端口的指令。
- 亚当
答案 2 :(得分:1)
跳转表描述为here,但简单地说,它是CPU应根据特定条件跳转到的地址数组。例如,C switch语句通常实现为跳转表,其中每个跳转条目将转到特定的“case”标签。
在内存使用率非常高的嵌入式系统中,使用跳转表而不是更多内存密集型方法(如大量if-else-if)可以更好地服务于许多构造。
答案 3 :(得分:1)
Wikipedia总结得很好:
在计算机编程中,一个分支 桌子(有时称为跳跃 表)用于描述一个术语 有效的转移方法 程序控制(分支)到另一个 程序的一部分(或不同的 可能是动态的程序 使用分支表) 说明。分支表 施工时常用 用汇编语言编程但是 也可以由编译器生成。
...使用分支表和其他原始数据 数据编码在早期很常见 记忆时的计算天数 昂贵,CPU速度较慢 紧凑的数据表示和 有效选择替代品 重要。如今,它们很常见 用于嵌入式编程和 操作系统开发。
换句话说,当您的系统极其受内存和/或CPU限制时,它是一种有用的构造,就像在嵌入式平台中一样。
答案 4 :(得分:0)
在计算机编程中,一个分支 桌子(有时称为跳跃 表)用于描述一个术语 有效的转移方法 程序控制(分支)到另一个 程序的一部分(或不同的 可能是动态的程序 使用分支表) 说明。分支表 施工时常用 用汇编语言编程但是 也可以由编译器生成。
分支表由一个序列组成 无条件分支列表 分支的说明 使用乘法创建的偏移量 指令的顺序索引 length(内存中的字节数) 被每个分支指令占用)。 它利用了机器的事实 分支的代码指令有一个 固定长度,可以执行 大多数人效率极高 硬件,并在最有用的时候 处理可能的原始数据值 很容易转换为顺序 指数值。鉴于此类数据,a 分支表可以非常 高效;它通常由...组成 以下步骤:可选择验证 输入数据以确保它 可接受的;将数据转换为 这是分支表的偏移量 通常涉及乘法或 转移它考虑到 指令长度;分支到 一个由基地组成的地址 表和生成的偏移:这个 经常涉及增加 偏移到程序计数器上 注册
答案 5 :(得分:0)
跳转表(通常称为分支表)通常仅由机器使用。
编译器在汇编程序中创建所有标签的列表,并将所有标签链接到内存位置。跳转表几乎是一个参考卡,其中,函数或变量或标签可能存储在内存中。
因此,当一个函数执行时,它会在完成时跳回到它之前的内存位置或跳转到下一个函数等。
如果你谈论我认为你是什么,你不仅需要它们在嵌入式系统中,而且需要在任何类型的编译/解释环境中。
Brian Gianforcaro
答案 6 :(得分:0)
跳转表通常(但不是唯一地)用于finite state machines以使它们受数据驱动。
而不是嵌套的开关/案例
switch (state)
case A:
switch (event):
case e1: ....
case e2: ....
case B:
switch (event):
case e3: ....
case e1: ....
你可以制作一个二维数组或函数指针,然后调用handleEvent[state][event]