宏定义函数,使得代码更简洁

我想实现一个功能,测试20路电机同时前进和后退,测试电机功能。
想开启20个线程,分别控制20个电机。线程回调函数很雷同,只有底层的GPIO 不一样。如果复制20份,显得代码很冗余(代码如下),有没有很简洁的方法定义20个函数?比如宏定义函数。

#define             MOTO1_DRV_EN                        PGout(9)
#define             MOTO1_DRV_DIR                        PGout(13)
#define             MOTO1_DRV_STEP                        PGout(11)

#define          MOTO2_DRV_EN                       PDout(3)
#define             MOTO2_DRV_DIR                      PAout(12)
#define             MOTO2_DRV_STEP                     PAout(11)

//dir 0--前进            1--后退
void  Moto1Ctrl(int iDir,int iSpeed,int iStep)
{
    int i;
    
    MOTO1_DRV_EN=LOW;
    MOTO1_DRV_DIR=iDir;
    
    for(i=0;i<iStep;i++)
    {
        MOTO1_DRV_STEP=HIGH;
        delay_us(1);
        MOTO1_DRV_STEP=LOW;
        delay_us(iSpeed);
    }
    
    MOTO1_DRV_EN=HIGH;
}

//dir 0--前进            1--后退
void  Moto2Ctrl(int iDir,int iSpeed,int iStep)
{
    int i;
    
    MOTO2_DRV_EN=LOW;
    MOTO2_DRV_DIR=iDir;
    
    for(i=0;i<iStep;i++)
    {
        MOTO2_DRV_STEP=HIGH;
        delay_us(1);
        MOTO2_DRV_STEP=LOW;
        delay_us(iSpeed);
    }
    
    MOTO2_DRV_EN=HIGH;
}

void moto1_tst_task(void *pvPara)
{    
    while(1)
    {                   
        Moto1Ctrl(0,MOTO1_SPEED, MOTO1_STEP);
        vTaskDelay(1000);
        Moto1Ctrl(1,MOTO1_SPEED, MOTO1_STEP);
        vTaskDelay(1000);
    }
}

void moto2_tst_task(void *pvPara)
{    
    while(1)
    {                   
        Moto2Ctrl(0,MOTO1_SPEED, MOTO1_STEP);
        vTaskDelay(1000);
        Moto2Ctrl(0,MOTO1_SPEED, MOTO1_STEP);
        vTaskDelay(1000);
    }
}

函数增加一个参数,表明GPIO号,函数内根据该参数区别代码

传参即可,定义20个和复制20个有区别吗

不用宏定义函数。直接在MotoCtrl函数中传参即可
比如

//dir 0--前进            1--后退
void MotoCtrl(int iDir,int iSpeed,int iStep,int n1,int n2,int n3)
{
    int i;
    
    PGout(n1)=LOW;
    PGout(n2)=iDir;
    
    for(i=0;i<iStep;i++)
    {
        PGout(n3)=HIGH;
        delay_us(1);
        PGout(n3)=LOW;
        delay_us(iSpeed);
    }
    
    PGout(n1)=HIGH;
}

调用时传入9,13,11给 n1, n2, n3
MotoCtrl(iDir, iSpeed, iStep,9,13,11);

函数是不能被赋值的,你这用宏定义的函数MOTO1_DRV_EN=LOW;MOTO1_DRV_DIR=iDir;MOTO1_DRV_STEP=HIGH;不知道是不是需要给函数传参的写错了。
对于雷同的函数逻辑代码,其实是可以总结成一个函数来实现的。可以通过增加一个类型的形参在函数内判断类型做出相应的逻辑操作即可,可以把不同的部分使用switch或者if来区分开来即可。
例如你的MotoCtrl函数可以总结为如下参考:


void  MotoCtrl(int iDir,int iSpeed,int iStep, int type)
{    
    // 如果只是要调用函数的参数不一样,那么可以定义需要的参数变量,在switch中相应赋值
    // 如果是要调用的方法不一样,那么可以在switch中调用相应的方法。
    switch (type) {
        case 1:
        {
            // type == 1,时的操作
        }
            break;
        case 2:
        {
            // type == 2,时的操作
        }
            break;
            
        default:
            break;
    }
    MOTO_DRV_EN=LOW;  // 请检查这里是不是要给宏定义函数传参
    MOTO_DRV_DIR=iDir;// 请检查这里是不是要给宏定义函数传参
    for(int i=0;i<iStep;i++)
    {
        MOTO_DRV_STEP=HIGH; // 请检查这里是不是要给宏定义函数传参
        delay_us(1);
        MOTO_DRV_STEP=LOW; // 请检查这里是不是要给宏定义函数传参
        delay_us(iSpeed);
    }
    MOTO_DRV_EN=HIGH; // 请检查这里是不是要给宏定义函数传参
}

同理,你的任务函数也可以这么做,可以统一成一个函数如下:


void moto1_tst_task(void *pvPara, int type)
{    
    while(1)
    {                   
        MotoCtrl(0,MOTO1_SPEED, MOTO1_STEP, type);
        vTaskDelay(1000);
        MotoCtrl(1,MOTO1_SPEED, MOTO1_STEP, type);
        vTaskDelay(1000);
    }
}

希望可以帮你解决问题

函数传参数吧这样一个函数就能满足了,根据参数进行不同的分支