链表在工程中的简单应用

         嵌入式软件开发的主要工作还是驱动各种外设,实现读,写,配置等操作,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链表,这样就和具体设备的读,写,配置等函数联系起来。

猜你喜欢

转载自blog.csdn.net/qq_21640423/article/details/95726292