📄 main.c
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
*
* uCOS_51 for MCS-51
*
* File : main.c
* By : Jean J. Labrosse
* Created by : QQ 591881218
*********************************************************************************************************
*/
#include "..\ucos_51\ucos-ii\inc\includes.h"
// ---------------------------------
#define APPSTARTPRIO TASK_START_PRIO
#define POWERLEDPRIO OS_LOWEST_PRIO-2
#define OK 0
#define ACK 1
#define ENTER 0x0D
// ---------------------------------
sbit WorkLedCtrl=P3^4;
OS_STK AppStartStk[TASK_STK_SIZE];
OS_STK P1UpStk[TASK_STK_SIZE];
OS_STK P1DownStk[TASK_STK_SIZE];
// ---------------------------------
void AppStart(void *ppdata) REENTRANT;
void P1Up(void *ppdata) REENTRANT;
void P1Down(void *ppdata) REENTRANT;
void Delay(void) REENTRANT
{
int i,j;
for(i=0;i<200;i++)
for(j=0;j<200;j++);
}
void DelayMS(int x) REENTRANT
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<200;j++);
}
// ---------------------------------
int main(void)
{
InitSystem();
OSTaskCreate(AppStart, (void *)0, AppStartStk, 4);
P1=0xfe;
Delay();
P1=0x7f;
Delay();
OSStart();
return OK;
}
/*
*********************************************************************************************************
* 系统开始任务
*
* 描述 : 开定时器T0中断,创建消息邮箱以及所有其他的任务,然后自我删除。
*
* 参数 : ppdata
*
* 注意 : 系统启动后第一时间开定时器中断,否则系统其它任务无法得到执行。
*********************************************************************************************************
*/
void AppStart(void *ppdata) REENTRANT
{
ppdata=ppdata;
ET0=1; /* 谨记:系统启动后第一时间开定时器中断 */
// LogoDisp();
// PrintStr("You can input by the terminal!\n\n\n");
OSTaskCreate(P1Up, (void *)0, P1UpStk, 5);
OSTaskCreate(P1Down, (void *)0, P1DownStk, 6);
OSTaskDel(OS_PRIO_SELF);
}
/*
*********************************************************************************************************
* 工作状态指示任务
*
* 描述 : CPU正常工作时,每秒钟闪烁5次,不工作时不闪烁,控制端口P3.4。
*
* 参数 : ppdata
*
* 注意 : 一个时钟节拍为0.02s,建议优先级设为最低,高于系统空闲任务和系统统计任务。强烈引起您的重视:
* ..\ucos_51\ucos-ii\src\ucos_ii.h
* OS_EXT DF_IDATA volatile INT32U OSIdleCtr;
* "OSIdleCtr" 变量务必设置为 "idata" 存储类型,否则任务运行节拍变慢。
*********************************************************************************************************
*/
void P1Up(void *ppdata) REENTRANT
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
ppdata=ppdata;
while(1)
{
OS_ENTER_CRITICAL();
P1=0xfe;
Delay();
P1=0x7f;
Delay();
OS_EXIT_CRITICAL();
OSTimeDly(20);
}
/* for(;;)
{
OS_ENTER_CRITICAL();
P1=0xfe;
OS_EXIT_CRITICAL();
DelayMS(4);
// OSTimeDlyHMSM(0,0,0,400);
// OSTimeDly(10);
} */
}
void P1Down(void *ppdata) REENTRANT
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
ppdata=ppdata;
while(1)
{
OS_ENTER_CRITICAL();
P1=253;
Delay();
P1=191;
Delay();
OS_EXIT_CRITICAL();
OSTimeDly(50);
}
/* for(;;)
{
OS_ENTER_CRITICAL();
P1=0x7f;
DelayMS(4);
OS_EXIT_CRITICAL();
// OSTimeDlyHMSM(0,0,0,200);
OSTimeDly(200);
} */
}
/*
*********************************************************************************************************
* 串口收发任务
*
* 描述 : UartRcv任务负责从键盘接收,通过消息邮箱发送给UartSend任务处理并在终端打印。
*
* 参数 : ppdata
*
* 注意 : 多任务的并发执行,须妥善处理对临界资源的访问以及多任务之间的通信。
*********************************************************************************************************
*/
// ------------------------------------------------------------------------------------------------------
/*void UartRcv(void *ppdata) REENTRANT
{
static INT8U RxBuf;
static INT8U err;
ppdata=ppdata;
for(;;)
{
if(Getch(&RxBuf))
{
OSMboxPost(UartMbox, (void *)&RxBuf);
OSMboxPend(AckMbox, 0, &err);
}
OSTimeDlyHMSM(0,0,0,100);
}
}
void UartSend(void *ppdata) REENTRANT
{
static INT8U *TxBuf;
static INT8U err;
INT16U count=0;
ppdata=ppdata;
for(;;)
{
TxBuf=(INT8U *)OSMboxPend(UartMbox,0,&err);
if(OS_NO_ERR==err)
{
PrintChar(*TxBuf);
count++;
if((*TxBuf == ENTER) || (count == 0xFFFF)) count=1;
if(!(count%69))
{
PrintStr("\n");
}
}
else
{
PrintStr("\n\nMboxRcv err!\n\n\n");
}
OSMboxPost(AckMbox,(void *)ACK);
}
} */
// ------------------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -