0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式软件架构设计之表驱动法

汽车电子技术 来源:大橙子疯嵌入式 作者:大橙子疯 2023-02-15 15:47 次阅读

前言

刚开始编程时,往往会碰到一些根据不同条件执行不同功能的情况,通常都是采用if-else或者switch-case的方式,如果有很多的情况需要区分,则会有很多的else if或者case的代码处理,整个功能实现完成后,一看代码可能会有很多的else if或者case,为了避免这种情况,本编介绍一种开发方法-- 表驱动方法

表驱动方法是一种使你可以在表中查找信息,而不必用逻辑语句(if-elseswitch-case)来把他们找出来的方法。事实上,任何信息都可以通过表来挑选。在简单的情况下,逻辑语句往往更简单而且更直接。但随着逻辑链的复杂,表就变得越来越富于吸引力了。表驱动编程的意义在于 逻辑与数据的分离

可以简单的理解的就是用同样的方式处理不同的数据,表驱动方法具有以下特点:

  • 可读性强,数据处理流程一目了然。
  • 便于维护,只需要增、删数据索引和方法就可以实现功能。
  • 精简代码,降低圈复杂度。减少 if-else、switch-case 使用。
  • 在一定程度上可以提升程序运行速度。

实现

首先,看一个简单的例子,没有采用表驱动方法的代码,根据输入的数字得到字符串。

void GetTimeString(int weak, char *pszTime)
{
    if (weak == 1)
    {
        sprintf(pszTime, "星期一");
    }
    else if (weak == 2)
    {
        sprintf(pszTime, "星期二");
    }
    else if (weak == 3)
    {
        sprintf(pszTime, "星期三");
    }
    else if (weak == 4)
    {
        sprintf(pszTime, "星期四");
    }
    else if (weak == 5)
    {
        sprintf(pszTime, "星期五");
    }
    else if (weak == 6)
    {
        sprintf(pszTime, "星期六");
    }
    else if (weak == 7)
    {
        sprintf(pszTime, "星期日");
    }
    else
    {
        sprintf(pszTime, "未知");
    }
}

采用表驱动方法后,代码得到精简,可读性增强(if-else过多会导致屏幕不够一眼看的),且在一定程度上提高了程序运行速度(若是 7 则不需要多次if判断)

void GetTimeString(int weak, char *pszTime)
{
    const char *arrpszTime[7] = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};

    if (weak >= 1 && weak <= 7)
    {
        sprintf(pszTime, "%s", arrpszTime[weak - 1]);
    }
    else
    {
        sprintf(pszTime, "未知");
    }
}

适用场景

学会了简单的表驱动编程后,但是在实际开发中还是不知道在什么情况下使用,那么什么情况下适合表驱动开发呢?

  1. 常见的有驱动开发,比如采用了多个相同的驱动芯片,但是引脚等不同,可能有些人调试完其中一个驱动后,会拷贝一份再修改引脚等,这样无疑是浪费了 Flash 空间,此时采用表驱动方式将引脚等作为数据,驱动作为逻辑,只采用一份驱动代码,可以无限扩展多个驱动芯片。
  2. EEPROM 数据处理,通常包括地址、数据值、最大值、最小值和默认值等,他们的方式处理是一样的,可以将需要保存的数据做成一个数组表,通过相同的函数处理这些数据。
  3. 按键、菜单、LED等等模块都可以采用表驱动的方式处理,比如按键将引脚、按下电平、当前状态等作为数据,菜单将每个选项和函数指针等作为数据。
  4. 其他等等经过思考后能够转成数据的情况。

代码参考:

按键 :按键管理表,包含引脚、按下电平、当前状态等

https://gitee.com/const-zpc/FML_KEY.git

菜单 :菜单选项表,包含菜单选项名称、子菜单、函数指针【后续的动作】等

https://gitee.com/const-zpc/menu.git

OLED :字库数据表,包含字体索引、字体数据等

https://gitee.com/const-zpc/STM32_OLED.git

ESP8266 :AT指令数据表,包含指令、期望响应、时间和函数指针【后续的动作】等

https://gitee.com/const-zpc/esp8266.git
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3441

    浏览量

    92406
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66784
  • Case
    +关注

    关注

    0

    文章

    24

    浏览量

    13305
收藏 人收藏

    评论

    相关推荐

    诚聘嵌入式软件架构

    ,本科以上学历;2、三年以上嵌入式软件系统架构设计经验,同时有通信行业软件开发经验;3、精通C/C++语言,精通数据结构;熟悉QT\linux\android
    发表于 03-01 10:20

    诚聘嵌入式软件工程师

    等CPU,精通SPI,I2C,UART,USB,CAN,SD卡等外设驱动的开发;4、精通Linux、RTOS等操作系统,对操作系统运行机制、设备驱动模型有深刻理解;5、有丰富的嵌入式系统的软硬件
    发表于 03-10 10:31

    嵌入式系统的软件架构设计!

    软件架构设计!2. 嵌入式环境下软件设计的特点要谈嵌入式软件
    发表于 08-10 07:46

    嵌入式软件架构设计的相关资料分享

    嵌入式软件架构的设计大多数嵌入式程序员学习编程,都是从开发板的附带例程开始。之后工作也会继续参考那些例程,很多编程习惯、方式也会受之影响。其实开发板式的编程方式与工作中实际需求的并不完
    发表于 10-28 06:15

    为何要进行嵌入式软件架构设计?如何设计?

    为何要进行嵌入式软件架构设计?如何进行嵌入式软件架构设计?
    发表于 11-01 06:31

    嵌入式软件架构设计的目的及思路

    【1】架构设计的目的1.应用的代码逻辑清晰,且避免重复造轮子。2.方便软件的移植。3.最大限度地复用。4.高内聚低耦合。 【2】嵌入式架构思路1.功能模块化设计获得需求------->
    发表于 11-08 06:41

    嵌入式UI架构设计相关资料下载

    嵌入式UI架构设计漫谈
    发表于 11-08 07:49

    嵌入式系统中的架构设计的理解

    【阅读这篇文章,你能了解到什么】1. 从事嵌入式开发12年的我,对架构设计的理解;2. 对嵌入式系统中的架构设计要刻意训练;3. 嵌入式系统
    发表于 11-08 08:23

    决定嵌入式系统软件架构的因素和架构的影响

    嵌入式系统软件架构设计目录1.前言42.决定架构的因素和架构的影响42.1.常见的误解52.1.1.小型的系统不需要
    发表于 11-08 06:54

    嵌入式软件架构设计的资料大合集

    一、感慨近公司新招了一个做嵌入式软件开发开发的童鞋,该童鞋是从上海的某一个上市公司出来的,因为我们这边人手不够,因此把他安排了去负责一个新产品的研发,前期让他负责加速度计、NB-IOT、舵机、外置
    发表于 11-09 07:50

    嵌入式软件架构设计资料分享

    作为程序员,我觉得如果要走的更远必须要成为工程师,毕竟年龄和资历都摆在那里了。所以就让我这个老程序员浅谈一下嵌入式软件架构设计。我参考的也是一篇博文。原图如下![在这里插入图片描述](?x-oss-process=image/w
    发表于 12-24 07:09

    嵌入式软件架构设

    嵌入式软件架构的设计,帮助我们建立合理,有效的软件架构
    发表于 11-09 17:34 19次下载

    嵌入式软件架构设

    【1】架构设计的目的1.应用的代码逻辑清晰,且避免重复造轮子。2.方便软件的移植。3.最大限度地复用。4.高内聚低耦合。 【2】嵌入式架构思路1.功能模块化设计  获得需求------
    发表于 11-03 16:36 10次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b><b class='flag-5'>架构设</b>计

    嵌入式UI架构设计漫谈

    嵌入式UI架构设计漫谈
    发表于 11-03 17:36 15次下载
    <b class='flag-5'>嵌入式</b>UI<b class='flag-5'>架构设</b>计漫谈

    嵌入式系统软件架构设

    嵌入式系统软件架构设计目录1.前言42.决定架构的因素和架构的影响42.1.常见的误解52.1.1.小型的系统不需要
    发表于 11-03 18:21 29次下载
    <b class='flag-5'>嵌入式</b>系统<b class='flag-5'>软件</b><b class='flag-5'>架构设</b>计