📄 test.c
字号:
/************************Test*********************************************/
#include "includes.h"
#define TASK_STK_SIZE 512 //任务堆栈长度
OS_STK MyTaskStk[TASK_STK_SIZE]; //定义MyTask任务堆栈区
OS_STK YouTaskStk[TASK_STK_SIZE]; //定义YouTask任务堆栈区
OS_STK CtrlTaskStk[TASK_STK_SIZE]; //定义CtrlTask任务堆栈区
INT16S key; //用于读取用户输入
INT32U SwichTime =126; //切换一轮的时间,初始为126
INT32U change=0; //中间变量,用于接受input并赋给SwichTime
INT32U MyTime; //MyTask计时器
INT32U YouTime; //YouTask计时器
void MyTask(void *data); //声明任务,控制一个方向的信号灯
void YouTask(void *data); //声明任务,控制另一个方向的信号灯
void CtrlTask(void *data); //声明任务,控制用户输入
/************************主函数*******************************************/
void main (void)
{
OSInit(); //初始化uCOS_II
PC_DOSSaveReturn(); //保存Dos环境
PC_VectSet(uCOS, OSCtxSw); //安装uCOS_II中断
OSTaskCreate(MyTask, //创建任务MyTask
(void*)0, //给任务传递参数
&MyTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶指针
0); //使任务MyTask的优先级别为0
OSStart(); //启动uCOS_II的多任务管理
}
/************************任务MyTask***************************************/
void MyTask (void *pdata)
{
char mt[5]; //用于显示剩余时间
#if OS_CRITICAL_METHOD == 3 //选择函数实现方法
OS_CPU_SR cpu_sr;
#endif
pdata = pdata; //防止编译器报错
MyTime = SwichTime; //初始MyTask计时器
OS_ENTER_CRITICAL(); //关中断
PC_VectSet(0x08, OSTickISR); //安装uCOS_II时钟中断向量
PC_SetTickRate(OS_TICKS_PER_SEC); //设置uCOS_II时钟频率
OS_EXIT_CRITICAL(); //开中断
OSStatInit(); //初始化uCOS_II的统计任务
OSTaskCreate(YouTask, //创建任务YouTask
(void*)0, //给任务传递参数
&YouTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶指针
2); //使任务YouTask的优先级别为2
printf("\n Signal Lamp Control System");
for (;;) //MyTask主循环
{
if (MyTime==0) //计时器减为0,一轮结束
{
if(change>=20&&change<=120) //检测中间变量范围
{
SwichTime = 2*change+6; //转换公式
change=0; //切换时间改变完毕,清0
}
MyTime=SwichTime; //计时器重新计时
}
MyTime-=1; //计时器递减1
PC_DispStr(3, 4, //在3,4位置显示East,白色字体
"East",
DISP_BGND_BLACK+DISP_FGND_WHITE );
PC_DispStr(13, 4, //在13,4位置显示West,白色字体
"West",
DISP_BGND_BLACK+DISP_FGND_WHITE );
PC_DispStr(32, 4, //在32,4位置显示South,白色字体
"South",
DISP_BGND_BLACK+DISP_FGND_WHITE );
PC_DispStr(42, 4, //在42,4位置显示North,白色字体
"North",
DISP_BGND_BLACK+DISP_FGND_WHITE );
if(MyTime>=((SwichTime-6)/2+6)) //绿灯时间
{
sprintf(mt,"%5d",MyTime-((SwichTime-6)/2+6));
PC_DispStr(9, 4, //在9,4位置显示G,绿色字体
"G",
DISP_BGND_BLACK+DISP_FGND_GREEN );
PC_DispStr(5, 5, //在5,5位置显示剩余时间,白色字体
mt,
DISP_BGND_BLACK+DISP_FGND_WHITE );
PC_DispStr(19, 4, //在19,4位置显示G,绿色字体
"G",
DISP_BGND_BLACK+DISP_FGND_GREEN );
PC_DispStr(15, 5, //在15,5位置显示剩余时间,白色字体
mt,
DISP_BGND_BLACK+DISP_FGND_WHITE );
}
if(MyTime<((SwichTime-6)/2+6)&&MyTime>=((SwichTime-6)/2+3))//缓冲时间
{
sprintf(mt,"%5d",0);
PC_DispStr(9, 4, //在9,4位置显示S,红色字体
"S",
DISP_BGND_BLACK+DISP_FGND_RED );
PC_DispStr(5, 5, //在5,5位置显示0,白色字体
mt,
DISP_BGND_BLACK+DISP_FGND_WHITE );
PC_DispStr(19, 4, //在19,4位置显示S,红色字体
"S",
DISP_BGND_BLACK+DISP_FGND_RED );
PC_DispStr(15, 5, //在15,5位置显示0,白色字体
mt,
DISP_BGND_BLACK+DISP_FGND_WHITE );
}
if(MyTime<((SwichTime-6)/2+3)&&MyTime>=3)//红灯时间
{
sprintf(mt,"%5d",MyTime-3);
PC_DispStr(9, 4, //在9,4位置显示S,红色字体
"S",
DISP_BGND_BLACK+DISP_FGND_RED );
PC_DispStr(5, 5, //在5,5位置显示剩余时间,白色字体
mt,
DISP_BGND_BLACK+DISP_FGND_WHITE );
PC_DispStr(19, 4, //在19,4位置显示S,红色字体
"S",
DISP_BGND_BLACK+DISP_FGND_RED );
PC_DispStr(15, 5, //在15,5位置显示剩余时间,白色字体
mt,
DISP_BGND_BLACK+DISP_FGND_WHITE );
}
OSTimeDlyHMSM(0, 0, 1, 0); //等待1秒
}
}
/************************任务YouTask**************************************/
void YouTask (void *pdata)
{
char yt[5]; //用于显示剩余时间
#if OS_CRITICAL_METHOD == 3 //选择函数实现方法
OS_CPU_SR cpu_sr;
#endif
pdata = pdata; //防止编译器报错
YouTime = SwichTime; //初始YouTask计时器
OSTaskCreate(CtrlTask, //创建任务CtrlTask
(void*)0, //给任务传递参数
&CtrlTaskStk[TASK_STK_SIZE - 1],//设置任务堆栈栈顶指针
4); //使任务CtrlTask的优先级别为4
for (;;) //YouTask主循环
{
if (YouTime==0) //计时器减为0,一轮结束
{
YouTime=SwichTime; //计时器重新计时
}
YouTime-=1; //计时器递减1
if(YouTime>=((SwichTime-6)/2+6))//红灯时间
{
sprintf(yt,"%5d",YouTime-((SwichTime-6)/2+6));
PC_DispStr(39, 4, //在39,4位置显示S,红色字体
"S",
DISP_BGND_BLACK+DISP_FGND_RED );
PC_DispStr(35, 5, //在35,5位置显示剩余时间,白色字体
yt,
DISP_BGND_BLACK+DISP_FGND_WHITE );
PC_DispStr(49, 4, //在49,4位置显示S,红色字体
"S",
DISP_BGND_BLACK+DISP_FGND_RED );
PC_DispStr(45, 5, //在45,5位置显示剩余时间,白色字体
yt,
DISP_BGND_BLACK+DISP_FGND_WHITE );
}
if(YouTime<((SwichTime-6)/2+3)) //绿灯时间
{
sprintf(yt,"%5d",YouTime-3);
PC_DispStr(39, 4, //在39,4位置显示G,绿色字体
"G",
DISP_BGND_BLACK+DISP_FGND_GREEN );
PC_DispStr(35, 5, //在35,5位置显示剩余时间,白色字体
yt,
DISP_BGND_BLACK+DISP_FGND_WHITE );
PC_DispStr(49, 4, //在49,4位置显示G,绿色字体
"G",
DISP_BGND_BLACK+DISP_FGND_GREEN );
PC_DispStr(45, 5, //在45,5位置显示剩余时间,白色字体
yt,
DISP_BGND_BLACK+DISP_FGND_WHITE );
}
if(YouTime<3) //缓冲时间
{
sprintf(yt,"%5d",0);
PC_DispStr(39, 4, //在39,4位置显示S,红色字体
"S",
DISP_BGND_BLACK+DISP_FGND_RED );
PC_DispStr(35, 5, //在35,5位置显示0,白色字体
yt,
DISP_BGND_BLACK+DISP_FGND_WHITE );
PC_DispStr(49, 4, //在49,4位置显示S,红色字体
"S",
DISP_BGND_BLACK+DISP_FGND_RED );
PC_DispStr(45, 5, //在45,5位置显示0,白色字体
yt,
DISP_BGND_BLACK+DISP_FGND_WHITE );
}
OSTimeDlyHMSM(0, 0, 1, 0); //等待1秒
}
}
/************************任务CtrlTask*************************************/
void CtrlTask(void *pdata)
{
INT32U input=0; //接受用户输入,初始为0
#if OS_CRITICAL_METHOD == 3 //选择函数实现方法
OS_CPU_SR cpu_sr;
#endif
pdata = pdata; //防止编译器报错
/*显示提示语句*/
printf("\n\n\n\n\n\n\n Range Of The Switch Time: 20 to 120 seconds");
printf("\n (It will be changed after 1 round, please wait a moment --!)");
printf("\n\n Please input switch time of the signal lamp: ");
for (;;) //CtrlTask主循环
{
/*监控键盘输入*/
if (PC_GetKey(&key) == TRUE)
{
if (key == 0x1B) //如果按下Esc键则退出uCOS_II
{
PC_DOSReturn();
}
if (key>=48&&key<=57) //输入0-9之间的数字
{
input=input*10+key-48; //公式用于取得用户输入的十进制数
printf("%d",key-48);
}
if (key == 0xD) //如果按下Enter键
{
if(input>=20&&input<=120)//检测范围
{
change=input; //保存input
printf("\n\n You have changed the switch time to %d seconds",input);
printf("\n\n Please input switch time of the signal lamp: ");
}
else //超出范围,报错
{
printf("\n\n Wrong Time!");
printf("\n\n Please input switch time of the signal lamp: ");
}
input=0; //读取输入完毕,清0
}
}
}
}
/************************End**********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -