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

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

3天内不再提示

采用回调函数的方式优化嵌入式系统命令解析

玩转单片机与嵌入式 来源:玩转单片机与嵌入式 2023-11-14 09:19 次阅读

嵌入式系统开发中,命令解析是一个关键的环节,它负责解析用户或其他系统发送的命令,并执行相应的操作。传统的命令解析方法通常采用switch case语句,这种方式虽然经典,但在功能扩展和代码维护上存在一些不足。下面小编为大家推荐一种更为灵活和模块化的命令解析方法,即通过回调函数实现功能码的动态绑定,提高系统的可维护性和可扩展性。

传统方法的缺陷

在传统的命令解析中,如下图所示的协议内容:

83c05b58-828b-11ee-939d-92fbcf53809c.png

为了解析协议中的命令码,我们经常看到类似于下面的switch case语句:

void poll_task(rt_uint8_t cmd, rt_uint8_t *msg, uint8_t len){
    switch (cmd){
    case cmd1:
        func1();
        break;
    case cmd2:
        func2();
        break;
    case cmd3:
        func3();
        break;
    case cmd4:
        func4();
        break;
    default:
        default_func();
        break;  
    }
}

这样的写法存在一个明显的问题,即在增加新的功能码时需要修改poll_task函数,不够灵活。而且,若要统计功能码的个数,只能手动数,不够智能


创新的回调函数应用

为了解决传统方法的问题,我们可以使用回调函数和功能码绑定的方式,使代码更为模块化和清晰。具体实现如下:

typedef struct
{
    rt_uint8_t CMD;
    rt_uint8_t (*callback_func)(rt_uint8_t cmd, rt_uint8_t *msg, uint8_t len);
} _FUNCCALLBACK;


_FUNCCALLBACK callback_list[] =
{
    {cmd1, func_callback1},
    {cmd2, func_callback2},
    {cmd3, func_callback3},
    {cmd4, func_callback4},
    // 添加新的功能码和回调函数只需在这里新增
};


void poll_task(rt_uint8_t cmd, rt_uint8_t *msg, uint8_t len){
    int cmd_indexmax = sizeof(callback_list) / sizeof(_FUNCCALLBACK);
    int cmd_index = 0;


    for (cmd_index = 0; cmd_index < cmd_indexmax; cmd_index++)
    {
        if (callback_list[cmd_index].CMD == cmd)
        {
            if(callback_list[cmd_index].callback_func)
            {
                // 处理逻辑
                callback_list[cmd_index].callback_func(cmd, msg, len);
            }
        }
    }
}

这种方式的优点在于提供了一个模板,新增功能码只需在结构体中添加命令和对应的回调函数,而不需要修改主运行逻辑,大大降低了代码的可维护性。

进一步优化

为了进一步优化系统的命令解析,我们可以考虑将命令解析放入队列,并结合回调函数的方式进行解析。这样的设计使得命令解析模块更加通用,即使在更换单片机型号时,也能快速移植并保持代码的稳定运行。

// 将命令解析放入队列的伪代码
void command_queue_handler(void)
{
    // 从队列中获取命令
    rt_uint8_t cmd = get_command_from_queue();
    rt_uint8_t msg[MAX_MESSAGE_SIZE];
    rt_uint8_t len = get_message_length();


    // 调用命令解析函数
    poll_task(cmd, msg, len);
}

通过这样的设计,我们实现了一个灵活、模块化且可扩展的命令解析系统。这种模块化的设计不仅提高了系统的可维护性,还为未来的功能扩展提供了更大的空间。

总体而言,采用回调函数的方式优化嵌入式系统的命令解析是一个巧妙的设计选择,它不仅提高了代码的可读性和可维护性,还使系统更具扩展性。

在嵌入式系统开发中,我们应当注重采用更先进的设计思路,不断提升系统的性能和可维护性。

小编计划专门撰写系列文章,讲解如何提升系统的性能和可维护性。欢迎持续关注。

关于什么是“回调函数”,小编计划再专门撰写一篇文章进行详细的介绍,欢迎持续关注。

审核编辑:汤梓红

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

    关注

    40

    文章

    3430

    浏览量

    128221
  • 函数
    +关注

    关注

    3

    文章

    3880

    浏览量

    61310
  • 命令
    +关注

    关注

    5

    文章

    638

    浏览量

    21849
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11455

原文标题:优化嵌入式系统命令解析:回调函数的巧妙应用

文章出处:【微信号:玩转单片机与嵌入式,微信公众号:玩转单片机与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式系统学习步骤

    Hello,World程序 使用 make命令编译程序 编写带有一个循环的程序 调试一个有问题的程序 4、嵌入式系统开发基础 嵌入式系统概述
    发表于 10-21 10:55

    嵌入式系统编程中代码的优化

    ,可靠性,成本,体积,功耗等综合性要求的专用计算机系统。简单的说类似于PC中的BIOS的工作方式,具有软件代码小、高度自动化、响应速度快等特点。特别适合于要求实时和多任务的应用体系。嵌入式实时
    发表于 02-23 10:47

    初学者嵌入式linux系统的学习步骤

    ,World程序 使用 make命令编译程序 编写带有一个循环的程序 调试一个有问题的程序4、嵌入式系统开发基础嵌入式系统概述 交叉编译 配
    发表于 01-18 10:34

    嵌入式Linux系统的实现

    在一个桌面系统上,使用动态连接可以带来许多好处。使用动态连接库,可以让应用程序跟函数库的更新、升级分离,便于维护,可以让同时运行的多个程序共享一段代码。但是,在嵌入式系统中,很少有多个
    发表于 07-09 06:07

    嵌入式机器视觉系统有什么特性?怎么优化

    介绍了基于ARM+DSP架构的嵌入式机器视觉系统的特性,分析了制约嵌入式机器视觉系统性能的因素。从操作系统和应用程序方面,讨论了
    发表于 03-11 06:47

    什么是嵌入式系统

    什么是嵌入式系统嵌入式系统(Embedded System) 是一种完全嵌入受控器件内部,为特定应用而设计的专用计算机
    发表于 10-28 06:03

    函数的作用是什么?怎么使用回函数

    什么是js回函数?回函数的作用是什么?怎么使用回函数
    发表于 11-01 06:10

    嵌入式系统内存优化使用

    嵌入式系统功能的提高,占用了较大内存空间,继而时常出现运行无响应。基于用户方面看,由于系统内存问题影响运行,针对系统内存与进程应用状态研究,可以调整
    发表于 11-04 06:23

    如何对嵌入式linux系统快速启动进行优化

    嵌入式linux快速启动的一些优化的方法,主要是要掌握嵌入式linux系统的启动流程,以便能够在优化时有所指引。下面是一些总结:
    发表于 11-04 06:36

    嵌入式Linux开发工具-shell编程介绍

    系统运维工程师(嵌入式系统开发–系统移植)shell:1.命令解析器 (将用户输入的
    发表于 11-08 08:50

    嵌入式系统设计和优化实现

    、VCD、家用电器等的拥有量都居世界第一。随着经济水平的提高和消费结构的改变,人们对消费电子产品的要求越来越高,如产品的灵活性、可控性、耐用性、高性价比等,这些都可以通过合理、有效的嵌入式系统设计和优化
    发表于 12-21 06:46

    如何对嵌入式系统进行优化

    系统为控制、监视或辅助设备、机器或用于工厂运作的设备。与个人计算机这样的通用计算机系统不同,嵌入式系统通常执行的是带有特定要求的预先定义的任务。由于
    发表于 12-21 06:24

    嵌入式Linux开发工具

    :Cmakeautotool嵌入式Linux开发工具–shell编程(脚本:批处理)Linux系统运维工程师(嵌入式系统开发–系统移植)sh
    发表于 12-22 07:42

    怎样去写回函数呢?怎样去使用回函数

    函数的作用是什么?单片机怎么用回函数在不同文件之间传递数据呢?怎样去写回
    发表于 02-23 07:40

    为什么单片机中断函数会使用回函数实现?

    为什么单片机中断函数会使用回函数实现
    发表于 09-20 07:50