找回密码
 立即注册
查看: 533|回复: 7

UCOSII应用,添加2个任务正常,添加第三个任务,发现跳过第二个?

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:534
  • 最近打卡:2025-06-17 07:57:07
已绑定手机

158

主题

592

回帖

1035

积分

金牌会员

积分
1035
发表于 2024-6-11 11:47:34 | 显示全部楼层 |阅读模式


UCOSII应用,添加2个任务正常,添加第三个任务,发现跳过第二个?

任务2根本不执行,自己试着改了,很多次,都没有效果,代码如下,请路过的老师指点一下,
我把任务3挂起,也不执行任务2,任务的在任务1中有恢复,


#include "config.h"
#include "os.h"

#define ET2 0x04
#define ET3 0x20
#define ET4 0x40

/********全局变量*********/
U8 i,j,a=1,e;
bit busy;
U16 interrupt_cnt=0;
U8 Time_S=0;
U8 Time_error=0;
bit Flag_Second=0;
bit Flag_work=0;
bit Flag_position;

/********变量初始化*********/
bit key_lock1=0;
bit key_lock2=0;
bit key_lock3=0;
bit key_lock4=0;
bit key_lock5=0;
bit key_lock1_Short=0;

unsigned char key_sec=0;
unsigned int  delay_cnt1=0;
unsigned int  delay_cnt2=0;
unsigned int  delay_cnt3=0;
unsigned int  delay_cnt4=0;
unsigned int  delay_cnt5=0;
unsigned int  delay_cnt6=0;
unsigned int  delay_cnt7=0;


/******程序声明*********/
void Key_scan();//按键检测

/******实时任务函数定义********/
void Key_Server(void *p_arg) ;//任务1
void State_Inspect(void *p_arg) ;//任务2
void Voice_Announcements(void *p_arg) ;//任务3

/********实时任务堆栈定义**********/
#define Key_Server_STK_SIZE 128
#define State_Inspect_STK_SIZE 128
#define Voice_Announcements_STK_SIZE 128

// ==== 实时任务堆栈定义 ============
OS_STK Task_STK_K[Key_Server_STK_SIZE];
OS_STK Task_STK_S[State_Inspect_STK_SIZE];
OS_STK Task_STK_V[Voice_Announcements_STK_SIZE];

/*****端口初始化准双向模式*******/
void PortX_Init(void)
{
/**********IO口模式设置************/
        P0M1 = 0x00;P0M0 = 0x00;//设置为准双向口;
        P1M1 = 0x00;P1M0 = 0x03;//设置P1.0和P1.1口为推挽输出其他为准双向口
        P2M1 = 0x00;P2M0 = 0x00;
        P3M1 = 0x00;P3M0 = 0x00;
        P4M1 = 0x00;P4M0 = 0x00;
        P5M1 = 0x00;P5M0 = 0x00;

/********IO口初始化***********/
        d1 = 1;//关闭电磁阀1
        d2 = 1;//关闭电磁阀2
        YY_OUT = 1;//关闭语音输出
        YY_OUT_2 = 1;//关闭语音2输出
}

/******按键扫描:T1的中断执行******/       
void Key_scan()
{
/******按键1检测*********/       
        if(key1==1)
        {
                key_lock1=0;  
                delay_cnt1=0;         
          if(key_lock1_Short==1)
                {
                  key_lock1_Short=0;
                  key_sec=1;       
                }
        }
        else
        {
                if(key_lock1==0)
                {
                        ++delay_cnt1;
                        if(delay_cnt1>cnt_delay_cnt1)
                        {       
                                key_lock1_Short=1;
                                if(delay_cnt1>cnt_delay_cnt3)
                                {
                                        key_lock1_Short=0;
                                        delay_cnt1=0;
                                        key_lock1=1;
                                        key_sec=6;
                                }  
                        }
                }
        }
       
/******按键2检测********/
        if(key2==1)       
        {
                key_lock2=0;  
                delay_cnt2=0;         
        }
        else
        {
                if(key_lock2==0)  
                {
                        ++delay_cnt2;  
                        if(delay_cnt2>cnt_delay_cnt1)
                        {       
                                delay_cnt2=0;
                                key_lock2=1;  
                          key_sec=2;         
                        }
                }
        }
       
/*****位置传感器1检测*******/
        if(C1==1)
        {
                ++delay_cnt6;  
                if(delay_cnt6>cnt_delay_cnt1)
                {
                        key_lock3=0;  
                        delay_cnt6=0;   
                }
                delay_cnt3=0;  
        }
        else if(C1==0)
        {
                delay_cnt6=0;
                ++delay_cnt3;  
                if(delay_cnt3>cnt_delay_cnt1)
                {       
                        delay_cnt3=0;
                        key_lock3=1;  
                }
        }

/***位置传感器2检测*****/

        if(C2==1)       
        {
                ++delay_cnt7;  
                if(delay_cnt7>cnt_delay_cnt1)
                {       
                        delay_cnt7=0;
                        key_lock4=0;   
                }
                delay_cnt4=0;         
        }
        else if(C2==0)
        {
                ++delay_cnt4;  
                if(delay_cnt4>cnt_delay_cnt1)
                {       
                        delay_cnt4=0;
                        key_lock4=1;  
                }
                delay_cnt7=0;
        }
       
/****无线信号检测******/
        if(WX==1)       
        {
                key_lock5=0;  
                delay_cnt5=0;   
        }
        else
        {
                if(key_lock5==0)  
                {
                        ++delay_cnt5;  
                        if(delay_cnt5>cnt_delay_cnt2)
                        {       
                                delay_cnt5=0;
                                key_lock5=1;
                          key_sec=5;               
                        }
                }
        }
}


/*****毫秒延时*****/
void Delay_MS(unsigned int ms)
{
        unsigned int i;//延时计数;
        do
        {
                i = MAIN_Fosc / 6000;//6次/毫秒
                while(--i);
        }
        while(--ms);
}

/******T1的1ms初始化*******/
#define Timer1_HZ  1000UL//1KHz;
void Timer1_Init(void) //1毫秒@11.0592MHz
{
        AUXR |= 0x40;//定时器时钟1T模式
        TMOD &= 0x0F;//设置定时器模式
        TL1 =65536 -(MAIN_Fosc / Timer1_HZ);
        TH1 =65536 -(MAIN_Fosc / Timer1_HZ) >> 8;
        TF1 = 0;//清除TF1标志
        TR1 = 1;//定时器1开始计时
}

void Timer1_Handler() interrupt TMR1_VECTOR
{

        Key_scan();       
        ++interrupt_cnt;
        if(interrupt_cnt>=300)
        {       
                interrupt_cnt=0;
                Flag_Second=1;
        }

}


/*********任务1按键处理********/
void Key_Server(void *p_arg) //void *p_arg是空类型指针,防止编译器。
{
   
    if(p_arg);
    while(1)
    {

                        if(key_sec==1 )
                        {       
                                key_sec=0;
                                Flag_work=1;
                                if(Flag_position==1)
                                {
                                        led_L=1;
                                        led_U=1;
                                        led_O=1;
                                        d1=1;
                                        d2=1;
          Time_error=0;                                       
                                }
                                else
                                {
                                        led_L=1;
                                        led_U=1;
                                        d1=1;
                                        d2=0;       
                                        Flag_position=1;
                                        Time_error=0;
                                }
                        }
                        if(key_sec==2)       
                        {       
                                key_sec=0;       
                                Flag_work=1;
                                if(Flag_position==0)
                                {
                                        led_L=1;
                                        led_U=1;
                                        led_O=1;
                                        d1=1;
                                        d2=1;
          Time_error=0;       
                                }
                                else
                                {
                                        led_L=1;
                                        led_U=1;
                                        d1=0;
                                        d2=1;
                                        Flag_position=0;
                                        Time_error=0;
                                }
                        }       
                        if(key_sec==5)
                        {       
                                key_sec=0;
                                Flag_work=1;
                                if(Flag_position==0)
                                {       
                                        Flag_position=1;
                                        d1=1;
                                        d2=0;
                                        led_L=1;
                                        led_U=1;
                                        Delay_MS(100);
                                }
                                else
                                {
                                        Flag_position=0;
                                        d1=0;
                                        d2=1;
                                        led_L=1;
                                        led_U=1;
                                        Delay_MS(100);               
                                }
                        }
                        OSTaskResume(2);//恢复状态检测2
                        if(key_sec==6)       
                        {       
                                key_sec=0;
                                YY_OUT=0;
                                Delay_MS(1000);       
                                YY_OUT=1;
                        }
    OSTaskSuspend(OS_PRIO_SELF);//挂起按键处理1;
  }
}

/*****任务2状态检测******/
void State_Inspect(void *p_arg)
{
        if(p_arg);
        while (1)
        {
                if(Flag_Second==1)
                {
                        Flag_Second=0;
                        if(Flag_work==1)
                        {
                                led_O=~led_O;
                                Time_S++;
                                if(Time_S>=5)
                                {
                                        Flag_work=0;
                                  Time_S=0;
                                }
                        }
                        else
                        {
                                if(key_lock3==0 && key_lock4==0  )
                                {
                                        led_O=~led_O;
                                        led_L=1;
                                        led_U=1;
                                        Time_error++;
                                }
                               
                                if(key_lock3==1 && key_lock4==1 )
                                {
                                        led_O=~led_O;
                                        led_L=1;
                                        led_U=1;
                                        Time_error++;
                                }
                        }                       
                        if(Time_error>=10)
                        {                               
                                Time_error=0;
                                YY_OUT=0;
                                led_L=1;
                                led_U=1;
                                led_O=1;
                                OSTimeDly(OS_TICKS_PER_SEC / 2);//延时500毫秒;
                                YY_OUT=1;
        OSTimeDly(OS_TICKS_PER_SEC / 2);//延时500毫秒;
                        }
                        OSTaskResume(3);//恢复语音播报
                        if(key_lock3==0 && key_lock4==1 && Flag_work==0)
                        {
                                led_L=0;
                                led_U=1;
                                led_O=1;
                                d1=1;
                                d2=1;
                                Time_error=0;
                                Flag_position=1;
                        }
                        if(key_lock3==1 && key_lock4==0  && Flag_work==0)
                        {
                                led_L=1;
                                led_U=0;
                                led_O=1;
                                d1=1;
                                d2=1;
                                Time_error=0;
                                Flag_position=0;
                        }                               
                }
        OSTaskSuspend(OS_PRIO_SELF);//挂起状态检测2;
        }
}

/*****任务3语音播报******/
void Voice_Announcements(void *p_arg)
{
        U8 j;       
        U8 i;       
        if(p_arg);
        while (1)
        {
                if(Flag_position==0)
                {
                        j=0;
                        if(i<2)//拐弯检测
                        {
                                YY_OUT_2=0;//开启语音播报
                                Delay_MS(1000);       
                                YY_OUT_2=1;//关闭语音播报
        Delay_MS(3500);       
                                i++;
                        }
          }
                else
                {
                          if(Flag_position==1)
                                {
                                        i=0;
                                        if(j<2)//直行检测
                                        {
                                                YY_OUT_2=0;//开启语音播报
                                                Delay_MS(300);       
                                                YY_OUT_2=1;//关闭语音播报
                                                Delay_MS(4500);       
                                                j++;                                       
                                        }
                               
                                }
                                                       
                }
        OSTaskResume(1);//恢复按键检测
        }
}


/********单片机程序入口**********/
void main(void)
{
        WTST = 0;
        EAXSFR();
        CKCON = 0;
        PortX_Init();//IO口初始化;
        Timer1_Init();//定时器1初始化
        ET1 = 1;
        OSInit();
        OSTaskCreate(Key_Server,            (void *)0,      &Task_STK_K[0],      1);//任务1
        OSTaskCreate(State_Inspect,         (void *)0,      &Task_STK_S[0],      2);//任务2
  OSTaskCreate(Voice_Announcements,   (void *)0,      &Task_STK_S[0],      3);//任务3
        OSStart();

}

















回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-05-28 09:08:49

34

主题

1094

回帖

2450

积分

荣誉版主

积分
2450
发表于 2024-6-11 15:18:59 | 显示全部楼层
孤立疗法: 先简化问题, 把自己的应用代码都去掉, 只留个三个任务和OS操作任务相关的代码.
重新测试, 任务中可以用端口点亮LED或printf()来观之运行结果.
先把这一步搞正常, 然后再加自己的代码, 一步一步来, 问题就会浮出水面

点评

对,任何程序都是先把框架跑通,然后再增加功能代码,否则出了问题,跟不无从下手  详情 回复 发表于 2024-6-11 16:50
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:349
  • 最近打卡:2025-06-16 21:51:14
已绑定手机

14

主题

600

回帖

2257

积分

荣誉版主

积分
2257
发表于 2024-6-11 16:50:28 | 显示全部楼层
tzz1*** 发表于 2024-6-11 15:18
孤立疗法: 先简化问题, 把自己的应用代码都去掉, 只留个三个任务和OS操作任务相关的代码.
重新测试, 任务 ...

对,任何程序都是先把框架跑通,然后再增加功能代码,否则出了问题,跟不无从下手
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:534
  • 最近打卡:2025-06-17 07:57:07
已绑定手机

158

主题

592

回帖

1035

积分

金牌会员

积分
1035
发表于 2024-6-11 17:17:30 | 显示全部楼层
tzz1*** 发表于 2024-6-11 15:18
孤立疗法: 先简化问题, 把自己的应用代码都去掉, 只留个三个任务和OS操作任务相关的代码.
重新测试, 任务 ...

就是架构正常了,添加了两个任务,跑起来也是正常的,第三个任务就是增加语音播报,结果,只跑两端的程序,任务2不运行了,脑补是应该执行任务2后,跑任务3的,结果不行,再试试孤立疗法了,
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-06-17 09:45:37
已绑定手机

29

主题

349

回帖

1995

积分

金牌会员

机长

积分
1995
发表于 2024-6-18 17:04:33 | 显示全部楼层
任务2和任务3的栈都用的是Task_STK_S,然后就没有然后了。
业余撸代码,专业开飞机 https://gitee.com/STC-MCU
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:534
  • 最近打卡:2025-06-17 07:57:07
已绑定手机

158

主题

592

回帖

1035

积分

金牌会员

积分
1035
发表于 2024-6-18 17:27:09 | 显示全部楼层
hsr*** 发表于 2024-6-18 17:04
任务2和任务3的栈都用的是Task_STK_S,然后就没有然后了。

感谢老师指点,确实是这的问题,{:5_332:}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-06-17 09:45:37
已绑定手机

29

主题

349

回帖

1995

积分

金牌会员

机长

积分
1995
发表于 2024-6-18 21:19:36 | 显示全部楼层
38009*** 发表于 2024-6-18 17:27
感谢老师指点,确实是这的问题,

我不是啥老师,就一纯外行~~
业余撸代码,专业开飞机 https://gitee.com/STC-MCU
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:534
  • 最近打卡:2025-06-17 07:57:07
已绑定手机

158

主题

592

回帖

1035

积分

金牌会员

积分
1035
发表于 2024-6-19 08:26:43 | 显示全部楼层
hsr*** 发表于 2024-6-18 21:19
我不是啥老师,就一纯外行~~

三人行,必有我师,
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 17:49 , Processed in 0.228193 second(s), 93 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表