- 打卡等级:以坛为家II
- 打卡总天数:534
- 最近打卡:2025-06-17 07:57:07
已绑定手机
金牌会员
- 积分
- 1035
|
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();
}
|
|