【问题标题】:What is a jump table?什么是跳台?
【发布时间】:2010-09-08 01:28:15
【问题描述】:

谁能解释一下跳转表的机制以及为什么在嵌入式系统中需要它?

【问题讨论】:

    标签: c++ c memory embedded


    【解决方案1】:

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

    在嵌入式编程中这样做的好处是:

    1. 索引比机器代码或指针更节省内存,因此在受限环境中可以节省内存。
    2. 对于任何特定函数,索引都将保持稳定,更改函数只需要换出函数指针。

    如果确实会花费您一点点访问表的性能,但这并不比任何其他虚函数调用差。

    【讨论】:

      【解决方案2】:

      跳转表,也称为分支表,是一系列指令,全部无条件跳转到代码中的另一点。

      你可以把它们想象成一个switch(或select)语句,所有的case都被填满了:

      MyJump(int c)
      {
         switch(state)
         {
            case 0:
               goto func0label;
            case 1:
               goto func1label;
            case 2:
               goto func2label;
         }
      }
      

      请注意,没有返回 - 它跳转到的代码将执行返回,它会跳回到调用 myjump 的位置。

      这对于您根据状态变量执行某些代码的状态机很有用。还有很多很多其他用途,但这是主要用途之一。

      它用于您不想浪费时间摆弄堆栈并希望节省代码空间的地方。它尤其适用于速度极其重要的中断处理程序,并且导致中断的外围设备仅由单个变量知道。这类似于带有中断控制器的处理器中的向量表。

      一种用途是使用 0.60 美元的微控制器并为视频应用生成复合 (TV) 信号。微型并不强大-实际上它的速度几乎不足以写入每条扫描线。将使用跳转表来绘制字符,因为从内存中加载位图需要很长时间,并使用 for() 循环将位图推出。相反,有一个单独的跳转到字母和扫描行,然后是 8 条左右的指令,它们实际上将数据直接写入端口。

      -亚当

      【讨论】:

      • 我的理解是switch-cases实际上是编译成跳转表的?这似乎是一个多余的解释(跳转表就像开关,又像跳转表,又像开关......)
      【解决方案3】:

      From Wikipedia:

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

      一个分支表由一个序列组成 无条件分支列表 分支到的指令 使用通过乘法创建的偏移量 指令的顺序索引 长度(内存中的字节数 被每个分支指令占用)。 它利用了机器 分支代码指令有一个 固定长度,可以执行 大多数人非常有效 硬件,并且是最有用的时候 处理可能的原始数据值 很容易转换为顺序 指数值。鉴于这样的数据,一个 分支表可以非常 高效的;它通常由 以下步骤:可选地验证 输入数据,以确保它是 可接受的;将数据转化为 分支表的偏移量,这 通常涉及乘法或 转移它以考虑到 指令长度;并分支到 由基址组成的地址 表和生成的偏移量:this 通常涉及添加 偏移到程序计数器上 注册。

      【讨论】:

        【解决方案4】:

        跳转表在finite state machines 中通常(但不限于)使用,以使其成为数据驱动的。

        而不是嵌套的 switch/case

          switch (state)
             case A:
               switch (event):
                 case e1: ....
                 case e2: ....
             case B:
               switch (event):
                 case e3: ....
                 case e1: ....
        

        您可以创建一个二维数组或函数指针,然后调用handleEvent[state][event]

        【讨论】:

          【解决方案5】:

          here 描述了一个跳转表,但简而言之,它是 CPU 应根据特定条件跳转到的地址数组。例如,C switch 语句通常实现为跳转表,其中每个跳转条目将转到特定的“case”标签。

          在内存使用非常宝贵的嵌入式系统中,使用跳转表而不是更占用内存的方法(如大量 if-else-if)可以更好地服务于许多结构。

          【讨论】:

            【解决方案6】:

            Wikipedia 总结得很好:

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

            ... 使用分支表和其他原始 数据编码在早期很常见 内存还没有的计算天数 昂贵,CPU 速度较慢,并且 紧凑的数据表示和 替代品的有效选择是 重要的。如今,它们很常见 用于嵌入式编程和 操作系统开发。

            换句话说,当您的系统内存和/或 CPU 极度受限时使用它是一个有用的结构,嵌入式平台中经常出现这种情况。

            【讨论】:

              【解决方案7】:

              跳转表,通常称为分支表,通常仅由机器使用。

              编译器创建一个汇编程序中所有标签的列表,并将所有标签链接到一个内存位置。一个跳转表几乎是一个参考卡,一个函数或变量或任何标签可能存储在内存中。

              所以当一个函数执行完毕后,它会跳回到之前的内存位置或跳转到下一个函数,等等。

              如果您谈论的是我认为的自己,您不仅需要在嵌入式系统中使用它们,而且在任何类型的编译/解释环境中都需要它们。

              布赖恩·詹福卡罗

              【讨论】:

                猜你喜欢
                • 2014-05-24
                • 1970-01-01
                • 1970-01-01
                • 2015-11-18
                • 1970-01-01
                • 2014-05-28
                • 1970-01-01
                • 2018-03-22
                • 1970-01-01
                相关资源
                最近更新 更多