什么是跳台?

时间:2008-09-07 01:40:28

标签: c++ c memory embedded

有人可以解释跳转表的机制吗?为什么在嵌入式系统中需要它?

7 个答案:

答案 0 :(得分:46)

跳转表可以是函数指针数组,也可以是机器代码跳转指令数组。如果您有一组相对静态的函数(例如系统调用或类的虚函数),那么您可以创建此表一次并使用数组中的简单索引调用函数。这意味着检索指针并调用函数或跳转到机器代码,具体取决于所使用的表的类型。

在嵌入式编程中执行此操作的好处是:

  1. 索引比机器代码或指针更节省内存,因此在受限制的环境中可以节省内存。
  2. 对于任何特定函数,索引将保持稳定,更改函数只需要交换函数指针。
  3. 如果确实为访问该表而花费了一点点性能,但这并不比任何其他虚拟函数调用差。

答案 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)

From Wikipedia

  

在计算机编程中,一个分支   桌子(有时称为跳跃   表)用于描述一个术语   有效的转移方法   程序控制(分支)到另一个   程序的一部分(或不同的   可能是动态的程序   使用分支表)   说明。分支表   施工时常用   用汇编语言编程但是   也可以由编译器生成。

     

分支表由一个序列组成   无条件分支列表   分支的说明   使用乘法创建的偏移量   指令的顺序索引   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]