代码简化之道-放弃巨大的switchcase

以前是这样一个函数 巨大的switch-case
void flashclear(unsigned  char i)
{
    switch(i)
    {
        case 0x01:baseflashclear(Sector1Add,Sector1Num);break;
        case 0x02:baseflashclear(Sector2Add,Sector2Num);break;
        case 0x04:baseflashclear(Sector3Add,Sector3Num);break;
        case 0x08:baseflashclear(Sector4Add,Sector4Num);break;
        case 0x10:baseflashclear(Sector5Add,Sector5Num);break;
        case 0x20:
        case 0x40:
        case 0x80:
        default :return;
    }

}
现在是钩子函数 一排一排
typedef void (*_callback)	(unsigned  char);
typedef struct
{
	uint8_t      id;
    _callback    callback;
}IDFUNCTION_TYPE ;

IDFUNCTION_TYPE idfunc[]={
{0X01,NULL},
{0X02,NULL},
{0X04,NULL},
{0X08,NULL},
{0X10,NULL},
{0X20,NULL},
{0X40,NULL},
{0X80,NULL},
};

//内部放在死循环 异步
void memctl_loop(void)
{
	if(gflash.flag==0)	return;
	for(unsigned  char i=1;i;i = i<<1)
	{
		if( (i & gflash.flag) == i)
        {
            printf("I=%02X\r\n",i);
            gflash.flag = gflash.flag & (~i);
            for(char j=0;j<8;j++)
                {
                    if(i==idfunc[j].id)
                       idfunc[j].callback(i);
                }
        }
	}	
}

目前没有用 用的数组把参数对其


typedef struct
{
	uint8_t     id;
    uint32_t    addr;
    uint32_t    num;
}PARM_TYPE ;

PARM_TYPE easyparm[]={
{0X01,Sector1Add,Sector1Num},
{0X02,Sector2Add,Sector2Num},
{0X04,Sector3Add,Sector3Num},
{0X08,Sector4Add,Sector4Num},
{0X10,Sector5Add,Sector5Num},
{0X20,Sector6Add,Sector6Num},
{0X40,Sector7Add,Sector7Num},
{0X80,Sector8Add,Sector8Num},
};
void flashclear(unsigned  char i)
{
#if 0
    switch(i)
    {
        case 0x01:baseflashclear(Sector1Add,Sector1Num);break;
        case 0x02:baseflashclear(Sector2Add,Sector2Num);break;
        case 0x04:baseflashclear(Sector3Add,Sector3Num);break;
        case 0x08:baseflashclear(Sector4Add,Sector4Num);break;
        case 0x10:baseflashclear(Sector5Add,Sector5Num);break;
        case 0x20:
        case 0x40:
        case 0x80:
        default :return;
    }
#else
    for(char j=0;j<8;j++)
        if(i == easyparm[j].id)
            baseflashclear(easyparm[j].addr,easyparm[j].num);
#endif
}

+++++++++++++++++++++++++++++++20200122补充++++++++++++++++

看了西瓜老师的视频 这时我明白了这个设计的原理 她说M3的那个boodloader加载的中断向量表

开启了中断 必须去写那个中断服务函数 否则会跑飞

我这个也是一样的 我的函数表 就是一种 向量表 每个ID都有一个匹配的服务函数

如果ID有 去 找不到匹配的函数 就有问题!这就是一个设计的开发设计的概念

我可以开放出去 给别人新ADD一个ID 别人自己完成服务函数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值