以下文章来源于最后一个bug ,作者bug菌
一个嵌入式技术进阶公众号,定期分享C语言,C++、MCU(如stm32等)、DSP、ARM、嵌入式Linux等“独门”软件设计技巧和知识归纳总结,同时分享应用程序设计、物联网、滤波及控制算法推导和仿真设计等嵌入式硬核知识技巧!欢迎大家关注!
今天跟大家分享三种表驱动设计的方法,都非常的精妙,值得收藏和细品。
1、正文部分
1
表驱动的意义
对于表驱动法,bug菌应该在之前的文章中经常有提及,常规做法就是定义一张表,该表一般就是一个结构体数组,结构体中包含查询的数据和数据对应的处理办法,在使用过程中通过查表数据,然后找到对应的处理方法来实现不同处理过程。
从功能上来看,表驱动法跟switch-case查询控制流程是非常相识的,但是表驱动法的优势在于数据与处理分离,一个合适的表结构,当工程师们扩展功能仅仅只需要添加相应的表项即可,一般不需要再改动表处理部分。
如果只是简单的使用switch-case,大量的case分支对程序的复杂度是明显增加的,非常不便于查找、排错和维护。
然而目前表驱动的设计大部分人都认为只有结构体数组这种固定方式,其实对于表项的组织还有两种也是非常常用的,下面bug菌就一一跟大家介绍。
2
三种表驱动设计
1
静态结构体数组式构建
#include <stdio.h>
#include <stdlib.h>
typedef struct _tag_Menu stMenu;
struct _tag_Menu
{
char * MenuName;
void (*MenuPrepare)(void);
int (*MenuMessage)(void);
void (*MenuBack)(void);
//下面省略了相关界面相关数据区域
};
stMenu sMenu[] = {
{"Main UI",MainUIPrepare,MainUIMessage,MainUIBack},
{"Sec UI1",SecUI1Prepare,SecUI1Message,SecUI1Back},
{"Sec UI2",SecUI2Prepare,SecUI2Message,SecUI2Back},
{"Thd UI1",ThdUI1Prepare,ThdUI1Message,ThdUI1Back},
{"Thd UI2",ThdUI2Prepare,ThdUI2Message,ThdUI2Back}
};
int currMenu = 0;
int NextMenu = 0;
int main(int argc, char *argv[]) {
while(1)
{
NextMenu = sMenu[currMenu].MenuMessage(); //界面消息处理
if(NextMenu != currMenu) //需要进行界面切换
{
sMenu[currMenu].MenuBack(); //进行界面退出保存
sMenu[NextMenu].MenuPrepare(); //进行新界面的初始化准备
currMenu = NextMenu; //更新界面索引
}
}
return 0;
}
2
链表式构建
3
链接式构建
3、对表项的遍历过程实现 :
2、结束语
好了,本文到此结束!希望本文能够给你带来一些收获!,如果有所收获,记得点个赞再走!
小哥搜集了一些嵌入式学习资料,公众号内回复【1024】即可找到下载链接!
推荐好文 点击蓝色字体即可跳转
☞ 专辑|Linux应用程序编程大全 ☞ 专辑|学点网络知识 ☞ 专辑|手撕C语言 ☞ 专辑|手撕C++语言 ☞ 专辑|经验分享 ☞ 专辑|从单片机到Linux ☞ 专辑|电能控制技术 ☞ MCU进阶专辑
☞ 经验分享 =