❤️作者主页:嵌入式_源
❤️作者简介:记录学习
❤️点赞 👍 收藏 ⭐再看,养成习惯
1.定义一个结构体
typedef struct LoopFuncT{
void (*LoopCallBack)(void);
uint8_t funcName[50];
}LoopFunc_t;
2.定义结构体数组
#define LOOP_FUNC_SIZE 20
LoopFunc_t loopFunc[LOOP_FUNC_SIZE];
3.在注册循环函数之前一定要初始化结构体
void mainInit(void)
{
for (int i = 0; i < LOOP_FUNC_SIZE; ++i) {
loopFunc[i].LoopCallBack=NULL;
memset(loopFunc[i].funcName,0,sizeof(loopFunc[i].funcName));
}
}
3.注册循环函数,需要实现哪个函数就注册谁
void registerLoopCallBack(LoopFunc_t loopF){
for (int i = 0; i <LOOP_FUNC_SIZE; ++i) {
if (loopFunc[i].LoopCallBack==NULL){
loopFunc[i].LoopCallBack=loopF.LoopCallBack;
strncpy(loopFunc[i].funcName,loopF.funcName, strlen(loopF.funcName));//在此之前初始化结构体
return;
}
}
}
//例如
LoopFunc_t loopFunc;//定义结构体变量
loopFunc.LoopCallBack=breathingLamp;//初始化值
strcpy(loopFunc.funcName,"breathingLamp");
registerLoopCallBack(loopFunc);//注册调用
void breathingLamp(void){
static uint32_t count=0;
static bool flag=true;
if (flag){
count=count+6;
} else{
count=count-6;
}
if (4500==count)
{
flag=false;
}
if (0==count)
{
flag=true;
}
HAL_Delay(1);
setRGBColor(count,count,count);
}
4.卸载循环函数
/**
* 卸载循环函数
* @param funcName: 函数名称
*/
void unRegisterLoopCallBack(uint8_t * funcName){
for (int i = 0; i <LOOP_FUNC_SIZE; ++i) {
if (strcmp(funcName,loopFunc[i].funcName)==0){
loopFunc[i].LoopCallBack=NULL;
memset(loopFunc[i].funcName,0,sizeof(loopFunc[i].funcName));
return;
}
}
}
//例子
unRegisterLoopCallBack("breathingLamp");
4.main函数中循环调用
while (1)
{
for (int i = 0; i < LOOP_FUNC_SIZE; ++i) {
if (loopCallBack[i] !=NULL){
loopCallBack[i]();
}
}