调试单片机常用,参考正点原子USMART写了个简单的自用
核心内容如下
1、C语言(stm32)
定义
typedef struct ShellFun_CLASS{
void* func; //函数指针
const u8* resType; //函数返回类型
const u8* name; //函数名
}ShellFun;
用户列表
ShellFun UserFunList[]=
{
(void*)Shell_Test1,"void","Shell_Test1()",
(void*)Shell_Test2,"u16","Shell_Test2(u16,u8,us)",
};
调用
u32 res;
switch(mShell.fparamCnt)
{
case 0://无参数(void类型)
res=(*(u32(*)())UserFunList[i].func)();
break;
case 1://有1个参数
res=(*(u32(*)())UserFunList[i].func)(SParam(0));
break;
case 2://有2个参数
res=(*(u32(*)())UserFunList[i].func)(SParam(0),SParam(1));
break;
case 3://有3个参数
res=(*(u32(*)())UserFunList[i].func)(SParam(0),SParam(1),SParam(2));
break;
}
2、C++语言(esp32)
定义
typedef struct ShellFun_CLASS{
void* func; //函数指针
const char* resType; //函数返回类型
const char* name; //函数名
}ShellFun;
用户列表
ShellFun UserFunList[]={
(void*)Test1,"void","Shell_Test1()",
(void*)Test2,"void","Shell_Test2(u8)",
(void*)Test3,"void","Shell_Test3()",
};
调用
uint32_t res;
void* (*funP0)();
void* (*funP1)(void* a);
void* (*funP2)(void* a,void* b);
void* (*funP3)(void* a,void* b,void* c);
switch(mShell.fparamCnt)
{
case 0://无参数(void类型)
funP0=(void* (*)())UserFunList[i].func;
res=(uint32_t)funP0();
break;
case 1://有1个参数
funP1=(void* (*)(void*))UserFunList[i].func;
res=(uint32_t)funP1((void*)SParam(0));
break;
case 2://有2个参数
funP2=(void* (*)(void*,void*))UserFunList[i].func;
res=(uint32_t)funP2((void*)SParam(0),(void*)SParam(1));
break;
case 3://有3个参数
funP3=(void* (*)(void*,void*,void*))UserFunList[i].func;
res=(uint32_t)funP3((void*)SParam(0),(void*)SParam(1),(void*)SParam(2));
break;
}