以前是这样一个函数 巨大的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 别人自己完成服务函数