📄 test.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 + -