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

📄 test.c

📁 easyarm2200整个光盘内容
💻 C
字号:
/****************************************************************************
* 文件名:TEST.C
* 功能:使用系统消息循环机制,当有按键事件时,即发送按键消息;当有UART0接收事件时,
*      发送UART0接收消息。
*      任务1进行消息循环,接收到按键消息时,控制蜂鸣器响一声;接收到UART0接收消
*      息时,将接收到的数据由UART0回传。
****************************************************************************/
#include "config.h"

TMQ	 *task1_tmq;			// 任务1的任务消息队列(指针),
                            // GetMessage()等待消息时使用
                            
void *task1_tmq_buf[30];	// 任务1的任务消息队列存储区,
                            // TMQ_Create()建立任务消息队列时使用

#define  BEEP				(1<<7)  
#define	 KEY1				(1 << 14)           

#define  TASK_STK_SIZE     	64

OS_STK   Task1Stk[TASK_STK_SIZE];
OS_STK   TaskKeyStk[TASK_STK_SIZE];
OS_STK   TaskUart0Stk[TASK_STK_SIZE];


void  Task1(void *pdata);
void  TaskUart0(void *pdata);
void  TaskKey(void *pdata);

/****************************************************************************
* 名称:main()
* 功能:主函数,启动多任务环境。
* 入口参数:无
* 出口参数:无
****************************************************************************/
int main (void)
{   OSInit();

    // 在系统启动前建立任务消息队列
    task1_tmq = TMQ_Create(task1_tmq_buf, 30);

    OSTaskCreate(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE - 1], 0);
    OSStart();
    return(0);
}



/****************************************************************************
* 名称:UART0_SendByte()
* 功能:向串口发送字节数据,并等待发送完毕。
* 入口参数:data		要发送的数据
* 出口参数:无
****************************************************************************/
void  UART0_SendByte(uint8 data)
{  U0THR = data;				    // 发送数据

   while( (U0LSR&0x40)==0 );	    // 等待数据发送完毕
}


/****************************************************************************
* 名称:Task1()
* 功能:任务1,接收系统消息,并进行处理。
* 入口参数:pdata		任务初始化参数
* 出口参数:无
****************************************************************************/
void  Task1(void *pdata)
{  MSG  *pMsg;

   pdata = pdata;                  		// 避免编译警告

   TargetInit();                     	// 目标板初始化
   PINSEL0 = (PINSEL0 & 0xcffff3ff);   	// 管脚选择模块初始化
   IO0DIR |= BEEP;			           	// 设置蜂鸣器为输出
   IO0SET = BEEP;
   IO0DIR &= ~KEY1;			           	// 设置KEY1为输入
   
   OSTaskCreate(TaskUart0, (void *)0, &TaskUart0Stk[TASK_STK_SIZE - 1], 3);
   OSTaskCreate(TaskKey, (void *)0, &TaskKeyStk[TASK_STK_SIZE - 1], 5);  

   while(1)
   {  pMsg = GetMessage(task1_tmq);
   
      switch(pMsg->message)
      {  case  TM_KEY:					// 按键消息处理
                  IO0CLR = BEEP;
                  OSTimeDly(OS_TICKS_PER_SEC / 5);
                  IO0SET = BEEP;
                  OSTimeDly(OS_TICKS_PER_SEC / 5);
                  break;
                  
         case  TM_UART0RCV:				// UART0接收消息处理
                  UART0_SendByte(pMsg->wParam);
                  break;
                  
         default:  
      			  break; 
      } // end of switch(pMsg->message)
   }
   
}


/****************************************************************************
* 名称:UART0_RcvByte()
* 功能:从UART0口读取一字节数据。若没有数据,则直接返回。
* 入口参数:dat   	保存读取数据变量的指针
* 出口参数:返回TRUE表示接收到数据,返回FALSE表示无数据
****************************************************************************/
uint8  UART0_RcvByte(uint8 *dat)
{  if ((U0LSR & 0x00000001) != 0)
   {  *dat = U0RBR;
      return (TRUE);
   }
   else
   {  *dat = 0x00;
      return (FALSE);
   }
}

/****************************************************************************
* 名称:TaskUart0()
* 功能:UART0任务。接收UART0的数据,若接收到数据则发送消息。
* 入口参数:pdata		任务初始化参数
* 出口参数:无
****************************************************************************/
void  TaskUart0(void *pdata)
{  MSG	msg_uart0;								// 定义消息变量msg_uart0
   uint8  dat;
  
   msg_uart0.message = TM_UART0RCV;				// 设置消息值
   while(1)
   {  if(UART0_RcvByte(&dat) == TRUE)			// 查询是否接收到串口数据
      {  msg_uart0.wParam = dat;				// 设置参数
         SendMessage(&msg_uart0);				// 发送消息
      }
      OSTimeDly(OS_TICKS_PER_SEC / 50);
   }
}



/****************************************************************************
* 名称:TaskKey()
* 功能:按键扫描任务。当有按键时,则发送消息。
* 入口参数:pdata		任务初始化参数
* 出口参数:无
****************************************************************************/
void  TaskKey(void *pdata)
{  MSG	msg_key;

   msg_key.message = TM_KEY;					// 设置消息值
   while(1)
   {  OSTimeDly(OS_TICKS_PER_SEC / 50);      	// 延时20毫秒
      if ((IO0PIN & KEY1) != 0)
      {  continue;
      }
      OSTimeDly(OS_TICKS_PER_SEC / 50);       	// 延时20毫秒
      if ((IO0PIN & KEY1) != 0)
      {  continue;
      }
      SendMessage(&msg_key);					// 发送消息
      
      while ((IO0PIN & KEY1) == 0)
      {  OSTimeDly(OS_TICKS_PER_SEC / 50);      // 延时20毫秒
      }
      
   }
}











⌨️ 快捷键说明

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