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

📄 task.c

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

  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(1);   //延迟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 + -