当前位置:首页 > 公众号精选 > wenzi嵌入式软件
[导读]笔者能力有限,如果文中有不对的地方,还请各位朋友能及时地给我指出来,我将不胜感激,谢谢~ 跳转表的概念 引用笔者在 Wikipedia 上看到的关于跳转表的概念, In computer programming, a branch table or jump table is a method of transferring program co

笔者能力有限,如果文中有不对的地方,还请各位朋友能及时地给我指出来,我将不胜感激,谢谢~

跳转表的概念

引用笔者在 Wikipedia 上看到的关于跳转表的概念,

In computer programming, a branch table or jump table is a method of transferring program control (branching) to another part of a program (or a different program that may have been dynamically loaded) using a table of branch or jump instructions

其意思也就是说,跳转表或者也可以被称之为分支表,是一种利用分支或者跳转指令表将程序控制转移到程序另一部分(或者是已经动态加载的其他程序)的方法。关于跳转到程序的另一部分最常用的方法就是使用 switch 语句,但是使用 switch 语句存在的一个弊端就是如果分支过多,会造成程序的冗长,而跳转表刚好能解决这个问题,对于优化程序的结构有很大地帮助。在介绍跳转表之前,笔者在这里先介绍一下跳转表所涉及到的指针数组和函数指针的概念。

指针数组

首先它是一个数组,数组的元素都是指针,如果有如下指针数组的定义:

   
  1. int *p1[5];

那么可以采用如下的一个图表明它的含义: 

函数指针

函数指针的意思就如名称称所示,它是一个指针,一个函数的指针,指向一个函数。比如下面我们就可以定义一个函数指针变量。

   
  1. int (*pf)(int,int);

上述指针变量的意思是定义了一个 pf 的函数指针变量,这个指针变量可以指向的是一个返回值为 int 的,函数两个 int 类型的参数的函数。假设现在我们有一个这样的函数用于两数相加,

   
  1. int add(int num1,int num2);

那么我们可以通过函数指针变量指向这个函数的形式来调用函数,比如这样:

   
  1. pf = add;

  2. pf(5,8);

上述就是关于函数指针的简单叙述。

跳转表

在介绍了指针数组和函数指针后,我们就可以来构建我们的跳转表,比如这样:

   
  1. void (*pf[])(void) = {fna,fnb,fnc,fnd};

其中 fna , fnb , fnc ,fnd 都是返回值和参数都为 void 的函数,上述定义的函数跳转表的意思也就是有一个函数指针数组,这个数组里面存放的都是函数的指针。之所以称之为跳转表,就是因为能通过索引的方式进行调用函数,下面就是在定义了上述调转表后的一个应用:

   
  1. void test(const int jump_index)

  2. {

  3. pf[jump_index]();

  4. }

下面的图片很形象的表达了跳转表的原理:  通过调用 test 函数,带以不同的参数,就可以通过 test 运行不同函数的功能呢,试想一下,如果这里使用 switch 的方式实现上述功能,代码量是不是要多出许多。

应用于嵌入式设备的一个例子

下面的这个例子是笔者在一位国外的网友的帖子下看到的,但是网友并没有给出所有代码,缺少一些较为细节的东西,但是并不影响理解

背景: 有一个工业电源接口盒,现通过一个简单的 ASCII 码助记符来作为命令,该接口盒是通过输入命令的形式执行相关操作,并且通过 RS-232 接口向外返回输入的参数值。

通过背景可以知道我们需要定义一个数组存储命令,代码如下:

   
  1. static const char read_str[] =

  2. "0SV 0SN 0MO 0WF

  3. 1ST 1MF 1CL 1SZ

  4. 2SP 2VO 2CC 2CA";

由于背景中要求需要返回参数并通过 RS-232 串口进行传输,因此通过输入命令后跳转执行的函数都是具有如下返回值和形参的

   
  1. const char *fna(void); 

另外这个函数声明的意思是,函数值类型是 const char *,形参是 void ,返回值类型也与刚刚我们所定义的 read_str 所对应。综上,就可以定义我们的跳转表了,跳转表定义如下:

   
  1. static const char *

  2. (*readfns[sizeof(read_str)/4])(void) =

  3. {

  4. /*这里是伪代码,因为命令太多,所以这样进行表示*/

  5. una,fna,fnb,...

  6. }

una,fnb 等都是与 fna 同类型的函数。说到这里,比较关键的代码就说完了,如下是整个处理过程的代码:

   
  1. const char *fna(void);


  2. static void process_read(const char *buf)

  3. {

  4. char *cmdptr;

  5. unsigned char offset;

  6. const char *replyptr;


  7. static const char read_str[] =

  8. "0SV 0SN 0MO 0WF

  9. 1ST 1MF 1CL 1SZ

  10. 2SP 2VO 2CC 2CA";


  11. static const char *

  12. (*readfns[sizeof(read_str)/4])(void) =

  13. {

  14. /*这里是伪代码,因为命令太多,所以这样进行表示*/

  15. una,fnb,fnc,...

  16. }


  17. /*cmdptr获得的是当前输入字符的地址*/

  18. cmdptr = strstr(read_str,buf);


  19. if (cmdptr != NULL)

  20. {

  21. /*(当前地址 - 数组基地址)/4 = 索引*/

  22. offset = (cmdptr - read_str) / 4;


  23. replyptr = (*readfns[offset])();

  24. }

  25. }

上述 strstr 函数的功能是返回一个输入字符串与数组中字符串匹配的元素的地址。最后根据索引值调用相应的函数执行,所以也就实现了背景中所述的根据输入命令执行相应操作的功能,如果命令有很多个,可想而知使用 switch 将是多么冗长的一段代码。

总结

通过上述的例子,很清楚地展示了跳转表在优化代码结构上的强大作用,如果有一组操作所对应的函数具有相同的函数返回值和相同的形参,应该考虑使用跳转表,它将帮助你写出漂亮的代码。

您的建议是对我最大地提升,您的在看是对我最大的鼓励

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

Linux操作系统是一个强大而广泛使用的开源操作系统。它具有稳定性、安全性和灵活性等优点,并且被广泛应用于服务器、嵌入式设备和个人电脑等领域。本文将介绍Linux操作系统的定义、特点和基本使用指南,帮助读者深入了解Lin...

关键字: Linux操作系统 服务器 嵌入式设备

最安全可靠的嵌入式操作系统 Ubuntu 专为机器人和物联网工业应用,并提供实时计算(Real-Time)功能。 倫敦2022年6月20日 /美通社/ -- 20...

关键字: CORE UBUNTU 物联网 嵌入式设备

来自IAR Systems和Secure Thingz的增强型解决方案可支持大批量的、安全的设备的开发和生产,可实现设备的自动上线以及与微软Azure云服务的集成

关键字: IAR Systems 物联网 嵌入式设备

IPort-1模块的嵌入式设备网络解决方案 0  概述鉴于原来RS232、RS485的串口设备已不再适应信息化的步伐。从串口到网口的转化,从电平级别的串口通信到以太网甚至Internet方

关键字: 嵌入式设备

从科研、金融、零售到工业、农业等越来越多的行业与业务场景正在应用人工智能提升效率,降低成本。人工智能在产业升级、改善人类生活等方面发挥着越来越重要的作用。当在实际业务场景中部署AI模型时,会面临一个部署方案设计的问题:不...

关键字: 嵌入式设备 AI

前阵子,英飞凌公司(Infineon)正式收购赛普拉斯(Cypress)的新闻刷屏了朋友圈。 日前,2020年6月17日英飞凌宣布推出Semper Secure,进一步拓展其屡获认可的Semper NOR闪存系列,而这得...

关键字: 嵌入式设备 物联网设备 工业物联网

物联网是IT行业的主要影响趋势之一,因为它为改变人们与设备,接口以及将对象连接到互联网的方式提供了巨大的可能性。 嵌入式行业的潜力是无限的,并且会随着时间而增长。自然,它为IT解决方案提

关键字: 物联网 嵌入式设备 嵌入式系统 应用程序

(文章来源:电子工程网) 我们几乎每天都能听说某个大型零售商或银行机构的安全漏洞遭到了攻击。展望不久的将来,我们只能无奈地预计,随着黑客使用的工具越来越复杂,以及他们能够盗取的信息价值不

关键字: 信息安全 MCU 嵌入式设备 黑客

有别于一般泛用型的PC架构,嵌入式系统的定义,是为特定用途所设计的IT系统,近年来嵌入式在特定领域的发展加速,与过去相较,无论是深度或广度都有长足进展,主要原因除了IT技术本身的精进外,应用产业

关键字: 物联网 嵌入式设计 嵌入式设备 嵌入式系统

有别于一般泛用型的PC架构,嵌入式系统的定义,是为特定用途所设计的IT系统,近年来嵌入式在特定领域的发展加速,与过去相较,无论是深度或广度都有长足进展,主要原因除了IT技术本身的精进外,应用产业

关键字: 嵌入式 物联网 AI 嵌入式设备
关闭
关闭