定时器讨论软件(函数回调功能命令嵌入式)「定时器的回调函数」

回调函数关于回调函数,在之前的文章《回调函数》已经详解讲解过了,这个文章不再讲解,不太懂的同学请看之前的文章《回调函数》。
在之前讲解回调函数中就使用串口作为示例,使用回调函数可以方便封装通讯库,芯片/模块厂家的SDK和部分开源库经常这样做,这样可以实现模块间的解耦,模块化编程。
这篇文章主要讲解回调函数在命令解析中的应用,一般命令中都会有功能码,用于区分这条命令到底执行的什么动作,命令字后面的数据的意义。
在这种场景中,使用回调函数是一个不错的选择。
经典写法嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去。

无偿分享大家一个资料包,差不多150多G。
里面学习内容、面经、项目都比较新也比较全。

某鱼上买估计至少要好几十。
点击这里找小助理0元领取:加微信领取资料在命令解析中,经典的写法使用switch case语句。
这种写法很经典,也很基础,即使是刚学C语言的小白也能看懂。
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函数,增加case语句。
如果要统计功能码的个数,只能手动数。
使用回调函数和功能码绑定的方式会更加方便一些,结构更加清晰。
回调函数功能码和回调函数绑定方式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_callback41}, ...};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_list[cmd_index].callback_func(cmd,msg,len); } } }}这种方式优点是:提供了一个“模板”,加入我们增加一个功能码,我们只需要在结构体中新增命令和回调函数即可,主运行逻辑不需要去修改,大大降低代码的可维护性。
比起经典的方法,将功能码和回调函数绑定的方式,代码更模块化,起到代码结构将解耦的目的,由于增加一个功能码主逻辑没有修改,这样就不会影响到其他功能码执行函数。
更进一步,将命令解析放入一个队列,再用这种方法解析命令,这样就能封装成一个通用的模块,即使更换单片机型号,也能很快的移植过去,并且保证代码稳定运行。
定时器讨论软件(函数回调功能命令嵌入式)
(图片来源网络,侵删)

联系我们

在线咨询:点击这里给我发消息