嵌入式学习小组
直播中

张琼

8年用户 195经验值
私信 关注

如何在uCOSII系统中分配资源通过udp控制步进电机?

OS_EVENT *GO_MBOX;     
OS_EVENT *COME_MBOX;   
#define START_TASK_PRIO                 18  
#define START_STK_SIZE                 128
OS_STK START_TASK_STK[START_STK_SIZE];  
void start_task(void *pdata);   //èÎÎñoˉêy
#define LED_TASK_PRIO                13         
#define LED_STK_SIZE                64        
OS_STK        LED_TASK_STK[LED_STK_SIZE];
void led_task(void *pdata);      
#define        NINE_TASK_PRIO       11   
#define NINE_TASK_STK_SIZE   256   
OS_STK  NINE_TASK_STK[NINE_TASK_STK_SIZE];  
void nine_task(void *pdata);      
#define UDP_SENT_PRIO                10
#define UDP_SENT_STK_SIZE        500
OS_STK  UDP_SENT_TASK_STK[UDP_SENT_STK_SIZE];
void udp_send_task(void *arg);
        
#define UDP_RECV_PRIO                9     
#define UDP_RECV_STK_SIZE        400
OS_STK  UDP_RECV_TASK_STK[UDP_RECV_STK_SIZE];  
void udp_recv_task(void *arg);
#define        MOTOR_CONTR_TASK_PRIO       8   
#define MOTOR_CONTR_TASK_STK_SIZE   128   
OS_STK  MOTOR_CONTR_TASK_STK[MOTOR_CONTR_TASK_STK_SIZE];  
void motor_contr_task(void *pdata);  
/**************************************************************
                    main
                                                                                 
**************************************************************/
int main(void)
{         
        delay_init();                       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        uart_init(115200);                        
        usmart_dev.init(72);                        
        my_mem_init(SRAMIN);               
        printf("ENC28J60+STM32rn");        
        printf("UDP NETCONN Testrn");        
        printf("ATOM@ALIENTEKrn");
        printf("2016/11/30rn");  
         
        OSInit();                                
        while(lwip_comm_init())         
        {
        
                printf("Lwip Init failed!rn");
                delay_ms(500);
        }
        printf("Lwip Init Success!rn");                 
        OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO);
        OSStart();
}
void start_task(void *pdata)
{
        OS_CPU_SR cpu_sr;
        pdata = pdata ;
        
        OSStatinit();                          
        OS_ENTER_CRITICAL();  
        OSTaskCreate(nine_task,
                                   (void*)0,
                                  (OS_STK*)&NINE_TASK_STK[NINE_TASK_STK_SIZE - 1],
                                NINE_TASK_PRIO);
        OSTaskCreate(led_task,
                                (void*)0,
                                (OS_STK*)&LED_TASK_STK[LED_STK_SIZE-1],
                                LED_TASK_PRIO);         
        OSTaskCreate(motor_contr_task,
                                (void*)0,
                                (OS_STK*)&MOTOR_CONTR_TASK_STK[MOTOR_CONTR_TASK_STK_SIZE-1],
                                MOTOR_CONTR_TASK_PRIO);         
  OSTaskCreate(udp_send_task,
                        (void*)0,
                        (OS_STK*)&UDP_SENT_TASK_STK[UDP_SENT_STK_SIZE-1],
                         UDP_SENT_PRIO);
  OSTaskCreate(udp_recv_task,
                                (void*)0,
                                 (OS_STK*)&UDP_RECV_TASK_STK[UDP_RECV_STK_SIZE-1],
                                 UDP_RECV_PRIO);
                                                         
        OSTaskSuspend(OS_PRIO_SELF);
        OS_EXIT_CRITICAL();
                                                         
}
//电机控制任务
void motor_contr_task(void *pdata)
{
          INT8U OS_err;
                char *msg;
        
                uint8_t Mo_flag = 0;        
          Motor_contr_Init();
    TIM3_PWM_Init(35999,1);
          OSTimeDlyHMSM(0,0,0,100);
                for(;;)
                 {                 
                         msg = (char *)OSMboxPend(COME_MBOX,50,&OS_err);
                         if(OS_err == OS_ERR_NONE)
                         {               
                                         if (*msg == 'M' && *(msg+1) == 'C')
                                         {
                                                  Mo_flag = 1;
                                                        if (Mo_flag && *(msg+2) == 'l' && *(msg+3) == 'f')        
                                                        {                                
                                                                        puls_left(35999,5000,0);
                                                        }
                                                        else if (Mo_flag &&(*msg+4) == 'l' && *(msg+5) == 'g')
                                                        {
                                                                        puls_ligt(35999,5000,1);
                                                        }
                                                        Mo_flag = 0;
                                         }
                                         
                         }
                        else
                        {
                                OSTimeDlyHMSM(0,0,0,10);
                        }
                        OSTimeDlyHMSM(0,0,0,50);
                }                                
}        
//电机转动固定方向固定脉冲
void Motor_contr_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);
        
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3   
                                    |GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;                                                                                                                           
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE,&GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;     
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void puls_left(u16 f,u16 count,u8 direction)
{
  unsigned char flag=1;
  u16 number,temp=count;
  GPIO_ResetBits(GPIOE,GPIO_Pin_2);
        GPIO_ResetBits(GPIOE,GPIO_Pin_1);  
  TIM3_PWM_Init(f,1);      
  TIM_SetCompare3(TIM3,f/2);  
        
        if(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_1) == direction)
        {
             LED1=0;
        }
        else
        {
                   LED1=1;
        }
  do{
                number=TIM3->CNT ;        
                if(flag&&number>=f/2)      
                {
                        
                temp=temp-1;
                flag=0;
                 
                }
                if(number>=1&&number                 {
                 
                flag=1;
                 
                }
  }
        while(temp>0);
  GPIO_SetBits(GPIOE,GPIO_Pin_2);
        LED1=1;
  if(!temp)
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);  
}
void puls_ligt(u16 f,u16 count,u8 direction)
{
  unsigned char flag=1;
  u16 number,temp=count;
        
  GPIO_ResetBits(GPIOE,GPIO_Pin_2);
        GPIO_SetBits(GPIOE,GPIO_Pin_1);
  TIM3_PWM_Init(f,1);
  TIM_SetCompare3(TIM3,f/2);
        if(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_1) == direction)
        {
             LED0=0;
        }
        else
        {
                   LED0=1;
        }
  do{
                number=TIM3->CNT ;      
                if(flag&&number>=f/2)      
                {
                        
                temp=temp-1;
                flag=0;
                 
                }
                if(number>=1&&number                 {
                 
                flag=1;
                 
                }
  }
        while(temp>0);  
        
  GPIO_SetBits(GPIOE,GPIO_Pin_2);
        LED0=1;
  if(!temp)
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);  
}

回帖(2)

李婧

2019-9-11 06:59:15
自己仿真跟踪,分析下逻辑吧。。。你这提问问题都没写完。。。
举报

李兆存

2019-9-11 07:19:11
谢谢原子哥。问题已经解决,是我两个任务中邮箱等待时间的问题,又用mallco开辟了接发的数据内存的问题,第一次发帖,没找到能上传文本格式的方法,以后都来请教和分享
举报

更多回帖

发帖
×
20
完善资料,
赚取积分