嵌入式软件开发的主要工作还是驱动各种外设,实现读,写,配置等操作,boring right?
我们常常会实现一套命令来检查我们的操作是否生效,例如cs wr ar8035 0 1,然后读出来看写进去的值是否正确;应该没有人使用下面的这种代码设计吧!
if(argv[1]==wr)
{
if(argv [2]==ar8035)
{
}
else if(argv[2]==ad9370)
{
}
………………………
………………………
else
{
}
}
else if(argv[1]==rd)
{
………………………
………………………
}
else if(argv[1]==config)
{
………………………
………………………
}
………………………
………………………
else
{
}
然后每添加一个外设就新增一个else if判断,简单暴力,我的天啊,我想静静!其实一种常见的处理方法是使用链表;实现方法如下:
●读,写,配置实现一个链表
typedef struct user_command
{
const char *name;
void (*cmdfunc)(int argc, const char **);
struct user_command *next_cmd;
char *helpstr;
}user_command_t;
添加成员,添加读命令和函数:
user_command_t readCmd = {
"rd",
Command_read,
NULL,
"rd [command]-- Read Chip register\r\n"
};
AddCommand(&readCmd); //函数实现的就是基本的链表添加成员操作,代码就不贴啦
●具体设备的读,写,配置等建一个链表;
typedef struct cs_command
{
const char *csObjName;
void (*read)(int argc, const char **argv);
void (*write)(int argc, const char **argv);
void (*config)(int argc, const char **argv);
void (*reset)(int argc, const char **argv);
void (*test)(int argc, const char **argv);
void (*dnl)(int argc, const char **argv);
struct cs_command *nextcscmd;
}cs_command_t;
添加成员,实现具体的读写函数:
CsOpInstall(CsCmdAd9370RegRead,CsCmdAd9370RegWrite,
CsCmdAd9370Config,NULL,
CsCmdAd9370Test,CsDnlAd9370,
"ad9370",&ad9370cscmd);
void CsOpInstall(
void (* read )(int argc, const char **argv),
void (* write)(int argc, const char **argv),
void (* config)(int argc, const char **argv),
void (* reset)(int argc, const char **argv),
void (* test)(int argc, const char **argv),
void (* dnl)(int argc, const char **argv),
const char *name, cs_command_t *opcmd)
{
opcmd->csObjName = name;
opcmd->write = write;
opcmd->read = read;
opcmd->reset = reset;
opcmd->config = config;
opcmd->dnl = dnl;
opcmd->test = test;
AddCscommand(opcmd);
}
这里用到函数指针,好用!cmdfunc函数会去匹配cs_command_t链表,这样就和具体设备的读,写,配置等函数联系起来。