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

📄 main.c

📁 1. UC/OS 8051中完全应用。 2. 显示各个任务的执行时间, 执行时间占总时间百分比, tick计数器 3.任务中信号量,消息以及消息队列的使用。 我自己仔细测试过了
💻 C
字号:
/*
*********************************************************************************************************
*                                                uC/OS-II
*   OSTaskStatHook                                          Applation Funtion 
*                                            
*
* File : main.c                         
* By   : Tj                                       
* Time : 2008.8.8
* 
* 
*********************************************************************************************************
*/
//#pragma  warning( disable: C196 ) 

#define  Reentrant reentrant	
#include "includes.h"
#include "..\driver\lcd\lcd.h"
#include "..\driver\c51.h"
extern unsigned char Os_Enter_Sum;


#define          TASK_STK_SIZE     MaxStkSize   
#define          TASK_START_ID       0                /* Application tasks IDs                         */
#define          TASK_CLK_ID         1
#define          TASK_1_ID           2
#define          TASK_2_ID           3
#define          TASK_3_ID           4
#define          TASK_4_ID           5
#define          TASK_5_ID           6

#define          TASK_START_PRIO    10                /* Application tasks priorities                  */
#define          TASK_CLK_PRIO      11
#define          TASK_1_PRIO        12
#define          TASK_2_PRIO        13
#define          TASK_3_PRIO        14
#define          TASK_4_PRIO        15
#define          TASK_5_PRIO        16
#define          MSG_QUEUE_SIZE     20  






OS_EVENT       *MsgQueue;                             /* Message queue pointer                         */
void           *MsgQueueTbl[20];                      /* Storage for messages                          */

OS_STK        TaskStartStk[TASK_STK_SIZE];            /* Startup    task stack                         */
OS_STK        TaskClkStk[TASK_STK_SIZE];              /* Clock      task stack                         */
OS_STK        Task1Stk[TASK_STK_SIZE];                /* Task #1    task stack                         */
OS_STK        Task2Stk[TASK_STK_SIZE];                /* Task #2    task stack                         */
OS_STK        Task3Stk[TASK_STK_SIZE];                /* Task #3    task stack                         */
OS_STK        Task4Stk[TASK_STK_SIZE];                /* Task #4    task stack                         */
OS_STK        Task5Stk[TASK_STK_SIZE];                /* Task #5    task stack                         */

OS_EVENT     *AckMbox;                                /* Message mailboxes for Tasks #4 and #5         */
OS_EVENT     *TxMbox;

OS_EVENT     *pPrintSem;
OS_EVENT     *pPutSem;

TASK_USER_DATA  TaskUserData[7];



        void  TaskStart(void *ppdata) Reentrant;                  /* Function prototypes of tasks                  */
static  void  TaskStartCreateTasks(void)Reentrant;
static  void  TaskStartDispInit(void)Reentrant;
static  void  TaskStartDisp(void)Reentrant;
        void  TaskClk(void *ppdata)Reentrant;
        void  Task1(void *ppdata)Reentrant;
        void  Task2(void *ppdata)Reentrant;
        void  Task3(void *ppdata)Reentrant;
        void  Task4(void *ppdata)Reentrant;
        void  Task5(void *ppdata)Reentrant;
void InitSerial() 
{

	SCON = 0x2; /* SM0 SM1 =0 SM2 0 REN=0 TB8=0 RB8=0 TI=1 RI=0 */
	TI=1;

}

void main(void)
{
    INT8U i;
    Os_Enter_Sum=0;
    InitHardware();
    InitSerial();
	lcd_init();
    lcd_clr(0x0);
/*	for(i=0;i<128;i++)
	{
	LCD_ClrLine(0,29,i);
    }	*/
	C51_ElapsedInit(); 
	OSInit();
	strcpy(TaskUserData[TASK_START_ID].TaskName, "TkStart");
    OSTaskCreateExt(TaskStart,
                   (void *)0,
                   &TaskStartStk[0],
                   TASK_START_PRIO,
                   TASK_START_ID,
                   &TaskStartStk[TASK_STK_SIZE - 1],
                   TASK_STK_SIZE,
                   &TaskUserData[TASK_START_ID],
                   0); 

    OSStart();
}


void Taskstart(void *ppdata) Reentrant
{
    ppdata=ppdata; 
 	ET0=1;      
    TR0=1;
	TR1  = 1;
	ET1=1;
	EA=1;
    OSStatInit();
	pPrintSem = OSSemCreate(1);
	pPutSem   = OSSemCreate(1); 
    	TaskStartDispInit();
    MsgQueue = OSQCreate(&MsgQueueTbl[0], MSG_QUEUE_SIZE);
	TaskStartCreateTasks();
    for(;;){
	    LCD_Print(8,13,0,"%2d ",(int)OSTaskCtr);
	    LCD_Print(25,13,0,"%3d%% ",(int)OSCPUUsage);
		LCD_Print(12,15,0,"%3d ",(int)OSCtxSwCtr);
		OSTimeDly(100);
		OSCtxSwCtr = 0;                                    /* Clear the context switch counter         */
       // OSTimeDly(OS_TICKS_PER_SEC);                       /* Wait one second                          */
	   
    }    
}


static  void  TaskStartCreateTasks (void) Reentrant
{
    strcpy(TaskUserData[TASK_CLK_ID].TaskName, "Clock");
    OSTaskCreateExt(TaskClk,
                   (void *)0,
				   &TaskClkStk[0],
                   TASK_CLK_PRIO,
                   TASK_CLK_ID,
				   &TaskClkStk[TASK_STK_SIZE - 1],
                  TASK_STK_SIZE,
                  &TaskUserData[TASK_CLK_ID],
                   0);

    
	strcpy(TaskUserData[TASK_1_ID].TaskName, "MQ Rx");
	OSTaskCreateExt(Task1,
                   (void *)0,
                    &Task1Stk[0],
                   TASK_1_PRIO,
                   TASK_1_ID,
                   &Task1Stk[TASK_STK_SIZE - 1],
                   TASK_STK_SIZE,
                   &TaskUserData[TASK_1_ID],
                   0);

    
	strcpy(TaskUserData[TASK_2_ID].TaskName, "MQ Tx#2");
	OSTaskCreateExt(Task2,
                   (void *)0,
                   &Task2Stk[0],
                   TASK_2_PRIO,
                   TASK_2_ID,
                   &Task2Stk[TASK_STK_SIZE - 1],
                   TASK_STK_SIZE,
                   &TaskUserData[TASK_2_ID],
                   0);

    strcpy(TaskUserData[TASK_3_ID].TaskName, "MQ Tx#3");
	OSTaskCreateExt(Task3,
                   (void *)0,
                   &Task3Stk[0],
                   TASK_3_PRIO,
                   TASK_3_ID,
                   &Task3Stk[TASK_STK_SIZE - 1],
                   TASK_STK_SIZE,
                   &TaskUserData[TASK_3_ID],
                   0);

    strcpy(TaskUserData[TASK_4_ID].TaskName, "MQ Tx#4");
	OSTaskCreateExt(Task4,
                   (void *)0,
                   &Task4Stk[0],
                   TASK_4_PRIO,
                   TASK_4_ID,
                   &Task4Stk[TASK_STK_SIZE-1],
                   TASK_STK_SIZE,
                   &TaskUserData[TASK_4_ID],
                   0);

    strcpy(TaskUserData[TASK_5_ID].TaskName, "DlyTask");
	OSTaskCreateExt(Task5,
                   (void *)0,
                   &Task5Stk[0],
                   TASK_5_PRIO,
                   TASK_5_ID,
                   &Task5Stk[TASK_STK_SIZE-1],
                   TASK_STK_SIZE,
                   &TaskUserData[TASK_5_ID],
                   0);
}  

static  void  TaskStartDispInit (void)	Reentrant
{
	LCD_Print(0,0,0,"-------UC/OS Example #3-------");
	LCD_Print(0,1,0,"-------Designed by Tj  -------");
	LCD_Print(0,3,0,"Task    Cnt   ExeT  ToT   %%Tot");

	LCD_Print(0,13,0,"tasks:");
	LCD_Print(20,13,0,"cpu:");
    LCD_Print(0,15,0,"Task sw/sec:");
    LCD_Print(24,15,0,"V%1d.%02d", OSVersion() / 100, OSVersion() % 100);

}

static  void  TaskStartDisp (void)	Reentrant
{
  
}


void  Task1 (void *ppdata) Reentrant
{
  char  *msg;
    INT8U  err;


    ppdata = ppdata;
    for (;;) {
        msg = (char *)OSQPend(MsgQueue, 0, &err);
        LCD_PutStr(20,12,1, msg);
 //       OSTimeDlyHMSM(0, 0, 0,500);
    }
}


void  Task2 (void *ppdata) Reentrant
{
    char  msg[20];

    ppdata = ppdata;
    strcpy(&msg[0], "Task 2");
    for (;;) {
        OSQPost(MsgQueue, (void *)&msg[0]);
        OSTimeDlyHMSM(0, 0, 2,0);
    }
}

void  Task3 (void *ppdata) Reentrant
{

    char  msg[20];


    ppdata = ppdata;
    strcpy(&msg[0], "Task 3");
    for (;;) {
	    OSTimeDlyHMSM(0, 0, 0, 500);
        OSQPost(MsgQueue, (void *)&msg[0]);
		OSTimeDlyHMSM(0, 0, 1, 500);
        
    }
}


void  Task4 (void *ppdata) Reentrant
{
     char  msg[20];


    ppdata = ppdata;
    strcpy(&msg[0], "Task 4");
    for (;;) {
	    OSTimeDlyHMSM(0, 0, 1, 0);
        OSQPost(MsgQueue, (void *)&msg[0]);
        OSTimeDlyHMSM(0, 0, 1, 0);
    }
}


void  Task5 (void *ppdata) Reentrant
{
    char  msg[20];


    ppdata = ppdata;
    strcpy(&msg[0], "Task 5");
    for (;;) {
	     OSTimeDlyHMSM(0, 0, 1, 500);
        OSQPost(MsgQueue, (void *)&msg[0]);
        OSTimeDlyHMSM(0, 0, 0, 500);
    }
}

void  TaskClk (void *ppdata) Reentrant
{
    ppdata = ppdata;
    for (;;) {
        OSTimeDly(OS_TICKS_PER_SEC);
		OSTimeDly(OS_TICKS_PER_SEC);
    }
}

⌨️ 快捷键说明

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