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

📄 任务管理.c

📁 这个程序演示基本的任务管理。程序启动具有两个不同优先级的任务
💻 C
字号:
/**********************************************************************************************************
 * 
 *				                电子科技大学嵌入式软件工程中心 版权所有
 * 					
 * 								Copyright (C) 2007 UESTC ESEC
 *
 **********************************************************************************************************/

/**********************************************************************************************************
 * 											说明
 * 模块:init.c
 * 目的:
 *      本程序演示uC/OS-II基本的任务管理。
 * 原理:程序启动具有两个不同优先级的任务,完成任务的挂起和被唤醒的系列动作。
 **********************************************************************************************************/
#include "../ucos/includes.h"
#include "../bsp/Uart.h"

extern T_UART_PORT uartPort0;
extern void ucBsp_Init(void);
extern void Timer_Start(void);
extern void CPSR_Init(void);

//nitialize switch count
INT32U count=0;

/********************************************************************************************************
*                                               CONSTANTS
********************************************************************************************************/

#define  TASK_STK_SIZE                 512       /* Size of each task's stacks (# of WORDs)            */
#define  N_TASKS                        2        /* Number of identical tasks                          */

/*******************************************************************************************************
*                                               VARIABLES
********************************************************************************************************/

OS_STK        TaskStk[N_TASKS][TASK_STK_SIZE];        /* Tasks stacks                                  */
OS_STK        TaskStartStk[TASK_STK_SIZE];            /* TaskStart  task stack                         */
INT8U         TaskData[N_TASKS];                      /* Parameters to pass to each task               */

/*******************************************************************************************************
*                                           FUNCTION PROTOTYPES
********************************************************************************************************/
		 void  Task0(void *pdata);                      /* Function prototypes of tasks                  */
		 void  Task1(void *pdata);
		 void  TaskStart(void *pdata);                  /* Function prototypes of Startup task           */
static   void  TaskStartCreateTasks(void);              /* Function prototypes of creat task             */

/********************************************************************************************************
*                                                MAIN
*********************************************************************************************************/
int  main (void)
{
	//板级初始化
	ucBsp_Init();	
	//open the interrupt bit 'I'
	CPSR_Init();
	//Initialize uC/OS-II
    OSInit();

	Uart_PutString(uartPort0,"\t本程序演示uC/OS-II基本的任务管理: ");
	Uart_PutLine(uartPort0,"程序启动具有两个不同优先级的任务,完成任务的挂起和被唤醒的系列动作.");
	Uart_PutString(uartPort0,"请按任意键继续......");
	Uart_GetChar(uartPort0);
	Uart_PutLine(uartPort0,"");
	
    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 4);
	//Start multitasking
    OSStart();
	return 1;
}

/********************************************************************************************************
*                                              STARTUP TASK
*********************************************************************************************************/

void  TaskStart (void *pdata)
{

#if OS_CRITICAL_METHOD == 3
	//Allocate storage for CPU status register
	OS_CPU_SR  cpu_sr;
	//消除警告
	cpu_sr = cpu_sr;
#endif
	//Prevent compiler warning
	pdata = pdata;
	
	Timer_Start(); 
		
	//Create all the application tasks
	TaskStartCreateTasks();
	//Suspend the TaskStart
	OSTaskSuspend(OS_PRIO_SELF);
}

/**************************************************************************************************************
*                                             CREATE TASKS
***************************************************************************************************************/

void  TaskStartCreateTasks (void)
{
	INT8U  i;
	//Create tasks
	for (i = 0; i < N_TASKS; i++)
	{
		//Each task will display its own information
		TaskData[i] =  i;
	}
	OSTaskCreate(Task0, (void *)&TaskData[0], &TaskStk[0][TASK_STK_SIZE - 1], 5);
	OSTaskCreate(Task1, (void *)&TaskData[1], &TaskStk[1][TASK_STK_SIZE - 1], 6);
}

/********************************************************************************************************
*                                               TASK #0
*
* Description: This task is suspended by itself,then it will be resumed by other tasks.
********************************************************************************************************/

void  Task0 (void *pdata)
{
	  INT8U i;
	  INT8U err;
 	i=*(int *)pdata;
	for (;;)
	{
		Uart_PutLine(uartPort0,"==================================================================");
		Uart_PutLine(uartPort0,"\r\n应用程序任务切换了\t%d\t次",++count);
		Uart_PutLine(uartPort0,"\r\nTASK_0, RUNNING...............................................");
		Uart_PutLine(uartPort0,"\r\nTASK_1, Stoped!");
		Uart_PutLine(uartPort0,"==================================================================");
		//suspend itself 
		err=OSTaskSuspend(5);
	}
}

/********************************************************************************************************
*                                               TASK #1
*
* Description: This task resume task0
********************************************************************************************************/

void  Task1 (void *pdata)
{
	INT8U i;
	INT8U err;
	i=*(int *)pdata;
	while(1)
	{
		OSTimeDly(15);
		Uart_PutLine(uartPort0,"==================================================================");
		Uart_PutLine(uartPort0,"\r\n应用程序任务切换了\t%d\t次",++count);
		Uart_PutLine(uartPort0,"\r\nTASK_0, Stoped!");
		Uart_PutLine(uartPort0,"\r\nTASK_1, RUNNING...............................................");
		Uart_PutLine(uartPort0,"==================================================================");
		OSTimeDly(15);
		//resume task0
		err=OSTaskResume(5);
	}
}


⌨️ 快捷键说明

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