初级会员 
  
	- 积分
 - 92
 
        - 金钱
 - 92 
 
       - 注册时间
 - 2017-8-17
 
      - 在线时间
 - 50 小时
 
 
 
 | 
 
实现功能:2.4G无线发送数据给小车做出相应动作,超声波测距小于50厘米小车不会发生动作。 
问题:不在实时系统上使用,程序运行起来没有一点问题。当将程序移植进UCOSIII系统运行,只要2.4G一发送数据,程序标红那部分就会执行。实在令我百思不得其解。 
主程序部分: 
int main(void) 
{ 
        OS_ERR err; 
        CPU_SR_ALLOC(); 
         
        delay_init(168);          //时钟初始化168MHz 
        NRFInit();//2.4G初始化 
        //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置 
        uart_init(115200);  //串口初始化 
        //LED_Init();       //内部LED初始化 
        LED10_Init();                //外部LED初始化 
        BEEP_Init();                //蜂鸣器初始化 
        KEY_Init();                 //按键初始化 
        trig_init();                //trig管脚初始化 
        motor_init();                //电机初始化 
        TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1);//以1Mhz的频率计数 
        RX_Mode(1, 0, 0, 0, 0, 0);//设置为接收模式,NRF24L01只开0通道 
        time7_init(8399,49995);//5s 中断一次 
        //time6_init();//定时器6初始化 
        stop();//默认电机停止 
         
        OSInit(&err);                //初始化UCOSIII 
        OS_CRITICAL_ENTER();//进入临界区 
        //创建开始任务 
        OSTaskCreate((OS_TCB         * )&StartTaskTCB,                //任务控制块 
                                 (CPU_CHAR        * )"start task",                 //任务名字 
                 (OS_TASK_PTR )start_task,                         //任务函数 
                 (void                * )0,                                        //传递给任务函数的参数 
                 (OS_PRIO          )START_TASK_PRIO,     //任务优先级 
                 (CPU_STK   * )&START_TASK_STK[0],        //任务堆栈基地址 
                 (CPU_STK_SIZE)START_STK_SIZE/10,        //任务堆栈深度限位 
                 (CPU_STK_SIZE)START_STK_SIZE,                //任务堆栈大小 
                 (OS_MSG_QTY  )0,                                        //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息 
                 (OS_TICK          )0,                                        //当使能时间片轮转时的时间片长度,为0时为默认长度, 
                 (void           * )0,                                        //用户补充的存储区 
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项 
                 (OS_ERR         * )&err);                                //存放该函数错误时的返回值 
        OS_CRITICAL_EXIT();        //退出临界区          
        OSStart(&err);  //开启UCOSIII 
        while(1); 
} 
 
 
//开始任务函数 
void start_task(void *p_arg) 
{ 
        OS_ERR err; 
        CPU_SR_ALLOC(); 
        p_arg = p_arg; 
 
 
        CPU_Init(); 
#if OS_CFG_STAT_TASK_EN > 0u 
   OSStatTaskCPUUsageInit(&err);          //统计任务                 
#endif 
         
#ifdef CPU_CFG_INT_DIS_MEAS_EN                //如果使能了测量中断关闭时间 
    CPU_IntDisMeasMaxCurReset();         
#endif 
 
 
#if        OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候 
         //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms 
        OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);   
#endif                 
         
        OS_CRITICAL_ENTER();        //进入临界区 
        //创建NRF24L01接收任务 
        OSTaskCreate((OS_TCB         * )&ReceiveTaskTCB,                 
                                 (CPU_CHAR        * )"receive task",                  
                 (OS_TASK_PTR )receive_task,                          
                 (void                * )0,                                         
                 (OS_PRIO          )RECEIVE_TASK_PRIO,      
                 (CPU_STK   * )&RECEIVE_TASK_STK[0],         
                 (CPU_STK_SIZE)RECEIVE_STK_SIZE/10,         
                 (CPU_STK_SIZE)RECEIVE_STK_SIZE,                 
                 (OS_MSG_QTY  )0,                                         
                 (OS_TICK          )0,                                         
                 (void           * )0,                                         
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, 
                 (OS_ERR         * )&err);                                 
                                  
        //创建电机运行任务 
        OSTaskCreate((OS_TCB         * )&MotorTaskTCB,                 
                                 (CPU_CHAR        * )"motor task",                  
                 (OS_TASK_PTR )motor_task,                          
                 (void                * )0,                                         
                 (OS_PRIO          )MOTOR_TASK_PRIO,              
                 (CPU_STK   * )&MOTOR_TASK_STK[0],         
                 (CPU_STK_SIZE)MOTOR_STK_SIZE/10,         
                 (CPU_STK_SIZE)MOTOR_STK_SIZE,                 
                 (OS_MSG_QTY  )0,                                         
                 (OS_TICK          )0,                                         
                 (void           * )0,                                 
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,  
                 (OS_ERR         * )&err); 
        OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);                //挂起开始任务                          
        OS_CRITICAL_EXIT();        //退出临界区 
} 
 
 
//NRF24L01接收任务函数 
void receive_task(void *p_arg) 
{ 
        p_arg = p_arg; 
        while(1) 
        { 
                 
                if(TIM7->SR &0x01)//定时时间到将接收到的数据置为停车 
                { 
                        TIM7->SR &=~(0X01);//清除中断标志位 
                        Rx[0]='t'; 
                } 
                /*检测是否接收到数据,同时检测哪一个通道接收到数据*/ 
                RxNum = NRF24L01_Check_RxCh(); 
                switch(RxNum) 
                { 
                        case RX_P_N0: NRF24L01_RxPacket(Rx, RxNum); 
                                                  printf("通道0接收的数据为:%s\r\n",Rx);  
                                                  break; 
                        case RX_P_N1: NRF24L01_RxPacket(Rx, RxNum); 
                                                  printf("通道1接收的数据为:%s\r\n",Rx);  
                                                  break; 
                        case RX_P_N2: NRF24L01_RxPacket(Rx, RxNum); 
                                                  printf("通道2接收的数据为:%s\r\n",Rx);  
                                                  break; 
                        case RX_P_N3: NRF24L01_RxPacket(Rx, RxNum); 
                                                  printf("通道3接收的数据为:%s\r\n",Rx);  
                                                  break; 
                        case RX_P_N4: NRF24L01_RxPacket(Rx, RxNum); 
                                                  printf("通道4接收的数据为:%s\r\n",Rx);  
                                                  break; 
                        case RX_P_N5: NRF24L01_RxPacket(Rx, RxNum); 
                                                  printf("通道5接收的数据为:%s\r\n",Rx);  
                                                  break; 
                        default:break; 
                } 
                delay_ms(200);                        //发起任务调度 
        } 
} 
 
 
//电机任务函数 
void motor_task(void *p_arg) 
{ 
        p_arg = p_arg; 
        while(1) 
        { 
                if(count_distance()>50) 
                { 
                        alldrown();//关灯 
                        BEEP=1;//关闭蜂鸣器 
                        switch(Rx[0]) 
                        { 
                                case 'w':  
                                        go_ahead();//前进 
                                        break; 
                                case 'a':  
                                        turn_left();//左转 
                                        break; 
                                case 'd':  
                                        turn_right();//右转 
                                        break; 
                                case 't':  
                                        stop();//停车 
                                        break; 
                                default:break; 
                        } 
                } 
                else 
                { 
                        stop();//停车 
                        BEEP=~BEEP;//500毫秒蜂鸣器响一次 
                        flash();//500毫秒闪一次 
                        delay_ms(200);//200毫秒 
                } 
                switch(Rx[0])//该函数使后退不受超声波影响 
                { 
                        case 's':  
                                back();//后退 
                                break; 
                        default:break; 
                } 
                delay_ms(200);                                                        //发起任务调度 
        } 
} 
 
 |   
 
 
 
 |