⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 task.bak

📁 看看ARM菜鸟在ARM7上写的操作系统——ARM圈圈操作系统 最近在ADuC7027上写了一个ARM_00_OS
💻 BAK
字号:
/**********************************************************************************************
本程序只供学习使用,不得用于其它任何用途,否则后果自负。

  Task.c file

  作者:Computer-lov
  建立日期:2006-5-8
  修改日期:2006-5-15
  版本:V1.0
  版权所有,盗版必究。
  任何技术问题可到我的博客上留言:    http://computer00.21ic.org
  Copyright(C) Computer-lov 2006-2016
  All rights reserved
**********************************************************************************************/


#include <ADuC7026.H>

#include "interrupt.h"
#include "LED.H"
#include "ARM_00_OS_TaskSwitch.H"
#include "my_type.h"
#include "ARM_00_OS_Core.H"
#include "UART.H"
#include "KEYS.H"
#include "Task.h"

/**********************************************************************************************
任务1。处于挂起状态,等待一条消息。系统空闲任务会扫描按键,当按键按下后,系统空闲任务会将
键值通过消息发送给任务1。任务1接到消息后,显示消息的发送者以及消息的信息等。然后控制LED4的亮灭。
**********************************************************************************************/
void Task1(void)
{
 uint32 PrinterDeviceAddr;   //保存打印机设备的地址
 
 PrinterDeviceAddr=OSGetDeviceAddr(OS_PRINTER_DEVICE_ID);   //获取打印机设备地址
 OSRequestDevice(PrinterDeviceAddr,0);    //申请使用打印机
 
 prints("",1);
 prints(OSCurrentPcb->Title,0);   //显示任务启动
 prints(" Start.",1);

 OSFreeDevice(PrinterDeviceAddr);   //释放打印机

 EN_LED4();  //使能LED4
 
 while(1)
  {
   OSTaskSuspend(OSCurrentPcb);  //任务挂起
   if(OSCurrentPcb->Msg)        //如果收到消息
    {
	 OSRequestDevice(PrinterDeviceAddr,0);  //申请打印机
	 
	 prints("",1);
	 prints("",1);
	 prints(OSCurrentPcb->Title,0);  //显示任务标题
	 prints(":",1);
	 prints("Haha,I have got a message from: ",0);  //显示相关信息
	 prints(OSCurrentPcb->Msg->Sender->Title,1);    //显示发送者的标题
	 prints("The sender's PID is: ",0);
	 print_uint32(OSCurrentPcb->Msg->Sender->PID);  //显示发送者的PID
	 prints("",1);
	 prints("The message type is:",0);             //消息类型
	 print_uint32(OSCurrentPcb->Msg->MsgType);
	 prints("",1);
	 prints("The message value is",0);             //消息的值
	 print_uint32(*(OSCurrentPcb->Msg->pMsg));
	 prints("",1);
	 prints("",1);
	 
	 OSFreeDevice(PrinterDeviceAddr);  //释放打印机
	 
	 switch(*(OSCurrentPcb->Msg->pMsg))    //键值散转
	  {
	   case KEY1: ON_LED4();break;    //如果是按键1按下,则点亮LED4
	   case KEY2: OFF_LED4();break;   //如果是按键2按下,则熄灭LED4
	   default: break;
	  }
	 OSCurrentPcb->Msg=0;           //消息处理完毕
	}
  }
}
//////////////////////////////////End of function//////////////////////////////////////////////


/**********************************************************************************************
任务2。延迟1S,等待一条消息。系统空闲任务会扫描按键,当按键按下后,系统空闲任务会将
键值通过消息发送给任务1。任务1接到消息后,显示消息的发送者以及消息的信息等。然后控制LED4的亮灭。
如果1S过后,还未收到消息,则显示接收超时。
/*********************************************************************************************/
void Task2(void)
{
 uint32 PrinterDeviceAddr;    //保存打印机设备的地址
 
 PrinterDeviceAddr=OSGetDeviceAddr(OS_PRINTER_DEVICE_ID);     //获取打印机设备地址
 OSRequestDevice(PrinterDeviceAddr,0);                   //申请使用打印机
 
 prints("",1);
 prints(OSCurrentPcb->Title,0);  //显示任务启动
 prints(" Start.",1);
 OSFreeDevice(PrinterDeviceAddr);   //释放打印机
 
 EN_LED5();
 while(1)
  {
   OSTaskDelay(100);       //延时等待消息的到来
   if(OSCurrentPcb->Msg)   //如果收到了消息
    {
	 OSRequestDevice(PrinterDeviceAddr,0);   //申请使用打印机
	 prints("",1);
	 prints("",1);
	 prints(OSCurrentPcb->Title,0);   //显示任务的标题
	 prints(":",1);
	 prints("Haha,I have got a message from: ",0);
	 prints(OSCurrentPcb->Msg->Sender->Title,1);     //显示消息发送者的标题
	 prints("The sender's PID is: ",0);
	 print_uint32(OSCurrentPcb->Msg->Sender->PID);  //显示消息发送者的PID
	 prints("",1);
	 prints("The message type is:",0);
	 print_uint32(OSCurrentPcb->Msg->MsgType);    //显示消息的类型
	 prints("",1);
	 prints("The message value is",0);
	 print_uint32(*(OSCurrentPcb->Msg->pMsg));   //显示消息
	 prints("",1);
	 prints("",1);
	 OSFreeDevice(PrinterDeviceAddr);    //释放打印机
	 switch(*(OSCurrentPcb->Msg->pMsg))     //键值散转
	  {
	   case KEY3: ON_LED5();break;    //如果是按键3按下,则点亮LED5
	   case KEY4: OFF_LED5();break;   //如果是按键4按下,则熄灭LED5
	   default: break;
	  }
	 OSCurrentPcb->Msg=0;     //消息处理完毕
	}
   else     //如果1秒后还未收到消息,则
    {
	 OSRequestDevice(PrinterDeviceAddr,0);    //申请使用打印机
	 prints("",1);
	 prints("",1);
	 prints(OSCurrentPcb->Title,0);   //显示任务的标题
	 prints(":",1);
	 prints("I have not got a message in 1 second!",1);  //显示未收到消息
	 prints("Time out!",1);  //超时
	 prints("",1);
	 OSFreeDevice(PrinterDeviceAddr);   //释放打印机
	}
  }
}
//////////////////////////////////End of function//////////////////////////////////////////////


/**********************************************************************************************
任务3。每隔500mS点亮、熄灭一次LED6,并显示一些信息。
**********************************************************************************************/
void Task3(void)
{
 uint32 PrinterDeviceAddr;      //保存打印机设备的地址
 
 PrinterDeviceAddr=OSGetDeviceAddr(OS_PRINTER_DEVICE_ID);      //获取打印机设备地址
 OSRequestDevice(PrinterDeviceAddr,0);    //申请使用打印机
 
 prints("",1);
 prints(OSCurrentPcb->Title,0);  //显示任务启动
 prints(" Start.",1);
 OSFreeDevice(PrinterDeviceAddr);  //释放打印机
 
 EN_LED6();
 while(1)
  {
   OSRequestDevice(PrinterDeviceAddr,0);    //申请使用打印机
   prints("HaHa,Task3! ",1);  //显示信息
   OSFreeDevice(PrinterDeviceAddr);       //释放打印机
   OSTaskDelay(50);           //延时50个时钟节拍
   ON_LED6();                 //开LED6
   OSRequestDevice(PrinterDeviceAddr,0);    //申请使用打印机
   prints("HaHa,Task3! ",1);  //显示信息
   OSFreeDevice(PrinterDeviceAddr);       //释放打印机
   OSTaskDelay(50);           //延时50个时钟节拍
   OFF_LED6();                //关LED6
  }
}
//////////////////////////////////End of function//////////////////////////////////////////////


/**********************************************************************************************
任务4。每隔1000mS点亮、熄灭一次LED6,并显示一些信息。
**********************************************************************************************/
void Task4(void)
{
 uint32 PrinterDeviceAddr;        //保存打印机设备的地址
 
 PrinterDeviceAddr=OSGetDeviceAddr(OS_PRINTER_DEVICE_ID);      //获取打印机设备地址
 OSRequestDevice(PrinterDeviceAddr,0);     // //申请使用打印机
 
 prints("",1);
 prints(OSCurrentPcb->Title,0);   //显示任务启动
 prints(" Start.",1);
 OSFreeDevice(PrinterDeviceAddr);   //释放打印机
 EN_LED7();
 while(1)
  {
   OSRequestDevice(PrinterDeviceAddr,0);    //申请使用打印机
   prints("HaHa,Task4! ",1);      //显示信息
   OSFreeDevice(PrinterDeviceAddr);           //释放打印机
   OSTaskDelay(100);              //延时100个时钟节拍
   ON_LED7();                     //开LED7
   OSRequestDevice(PrinterDeviceAddr,0);     //申请使用打印机
   prints("HaHa,Task4! ",1);      //显示信息
   OSFreeDevice(PrinterDeviceAddr);     //释放打印机
   OSTaskDelay(100);              //延时100个时钟节拍
   OFF_LED7();                    //关LED7
  }
}
//////////////////////////////////End of function//////////////////////////////////////////////


/**********************************************************************************************
任务5。键盘扫描并发送消息。
**********************************************************************************************/
void Task5(void)
{
 uint32 PrinterDeviceAddr;   //保存打印机设备的地址
 OSpcb * Task1Pcb,* Task2Pcb;   //用来保存任务pcb
 OSMsg Msg;                     //消息
 uint32  MsgValue;              //保存消息值
 
 PrinterDeviceAddr=OSGetDeviceAddr(OS_PRINTER_DEVICE_ID);   //获取打印机设备地址
 OSRequestDevice(PrinterDeviceAddr,0);    //申请使用打印机
 
 prints("",1);
 prints(OSCurrentPcb->Title,0);   //显示任务启动
 prints(" Start.",1);
 OSFreeDevice(PrinterDeviceAddr);   //释放打印机
 
 Task1Pcb=(OSpcb *)(uint32)OSTaskCreat((uint32)Task1,256,4,OS_THUMB_MODE,"Task1");  //创建任务1
 Task2Pcb=(OSpcb *)(uint32)OSTaskCreat((uint32)Task2,256,5,OS_THUMB_MODE,"Task2");  //创建任务2
 
 while(1)
  {
   OSTaskDelay(5);   //延迟10ms
   ScanKey();       //键盘扫描
   if(Key.Value)   //如果有键按下
    {
	 MsgValue=Key.Value;      //保存按键值
	 
	 (&Msg)->MsgType=KEYBOARD_MSG; //设置要发送的消息类型
	 (&Msg)->pMsg=&MsgValue;       //设置要发送的消息的值
	 (&Msg)->Length=1;             //设置消息的长度

	 OSSendMsg(Task1Pcb,&Msg);     //将消息发送给任务1
	 OSSendMsg(Task2Pcb,&Msg);     //将消息发送给任务2
	 Key.Value=0;                  //清除键值,表示该次按键已经处理
	}
  }
}
//////////////////////////////////End of function//////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -