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

📄 ucos_pri_reverse.c

📁 ucosDEMO程序,可以模拟实现任务管理
💻 C
字号:
/****************************************************************************************************
 *                      电子科技大学嵌入式软件工程中心 版权所有										*
 *																									*
 *                  Copyright (C) 2006 UESTC ESEC													*
 ****************************************************************************************************/

/*
 * $Log:应用程序启动主文件 文件名 ,v$
 * 
 * Revision 0.1  日期 时间	系统自动创建  
 * 创建本文件
 */

/**
 * @file ucos_Pri_Reverse.c
 * @brief
 *	<li>
 * 		功能:uC/OS优先级翻转演示
 *	</li>
 *  <li>
 * 		设计思想:这个程序演示基本的天花板优先级的解决。程序启动具有三个不同优先级的任务,每个任务请求,获得
 * ,释放互斥信号量,完成一系列动作。
 *  </li>
 *  <p>
 *  	注:本程序只具备演示功能,不能保证适用于您的真实应用。如需使用,请根据您的实际需要修改本程序。
 *  </p>
 * @author 	赵庆明
 * @date 	2008-4-11
 * <p>
 * 		部门:电子科技大学嵌入式软件工程中心
 * </p>
 */

/******************************************* 引用部分 ************************************************/
#include "includes.h"

/******************************************* 定义部分 ************************************************/
#define	TASK_STK_SIZE			1024       	// Size of each task's stacks (# of WORDs)
#define	N_TASKS					3        	// Number of identical tasks
#define	TASK_START_ID			0			// Application tasks IDs
#define	TASK_START_PRIO			17			// Application tasks priorities

OS_STK		TaskStk[N_TASKS][TASK_STK_SIZE/sizeof(OS_STK)];	// Tasks stacks
OS_STK		TaskStartStk[TASK_STK_SIZE];		// TaskStart  task stack
INT8U		TaskData[N_TASKS];					// Parameters to pass to each task
OS_EVENT	*mutex;								// 1 mutual exclusive semaphore

/******************************************* 声明部分 ************************************************/
static		void	Task0(void *pdata); 		// Function prototypes of tasks
static		void	Task1(void *pdata);
static		void	Task2(void *pdata);
static		void	TaskStart(void *pdata);		// Function prototypes of Startup task
static		void	TaskStartCreateTasks(void);	// Function prototypes of creat task

/******************************************* 实现部分 ************************************************/
/**
 * @brief
 * 		main()函数,应用程序入口函数。
 * @param[in]		无。
 * @return 操作成功返回0;\n
 *         出现问题返回1;
 */
int  main (void)
{
	INT8U err=err;
	
	UCOS_CPU_INIT();							// Install uC/OS-II's running hardware environment
	OSInit();									// Initialize uC/OS-II

	mutex=OSSemCreate(1);						// Set a mutual semaphore

	OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 4);
	
	OSStart();									// Start multitasking
	return 0;
}

/**
 * @brief
 * 		TaskStart()函数,启动任务。
 * @param[in]		void *。
 * @return 无\n
 */
void	TaskStart(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 					// Allocate storage for CPU status register
	OS_CPU_SR  cpu_sr;
	cpu_sr = cpu_sr;							// Avoid warnings
#endif

	pdata = pdata;								// Prevent compiler warning
	
	UCOS_TIMER_START();							// Timer interrupter start

	TaskStartCreateTasks();						// Create all the application tasks
	OSTaskSuspend(OS_PRIO_SELF);				// Suspend the TaskStart
}

/**
 * @brief
 * 		TaskStartCreateTasks()函数,创建多任务。
 * @param[in]		void *。
 * @return 无
 */
void  TaskStartCreateTasks (void)
{
	INT8U  i;	
	
	for (i = 0; i <N_TASKS; i++)				// Create N_TASKS identical tasks
	{
		TaskData[i] = i;
	}
												// Each task will pass its own id
	OSTaskCreate(Task0, (void *)&TaskData[0], &TaskStk[0][TASK_STK_SIZE - 1], 5);
	OSTaskCreate(Task1, (void *)&TaskData[1], &TaskStk[1][TASK_STK_SIZE - 1], 6);
	OSTaskCreate(Task2, (void *)&TaskData[2], &TaskStk[2][TASK_STK_SIZE - 1], 7);
}

/**
 * @brief
 * 		Task0()函数,执行一个任务。
 * @param[in]		void *。
 * @return 无
 */
void  Task0 (void *pdata)
{
	INT8U  err;
	INT8U  id;
	
	id=*(int *)pdata;
	for (;;)
	{
	
		printf("Task_%d waitting for an EVENT\n\r",id);
		OSTimeDly(200);                                       /* Delay 200 clock tick       */
		printf("Task_%d's EVENT CAME!\n\r",id);
		printf("Task_%d trying to GET MUTEX\n\r",id);
		OSSemPend(mutex,0,&err);                          /* Acquire mutex */
		switch(err)
		{
			case OS_NO_ERR:
				printf("Task_%d GOT mutex.\n\r",id);
				break;
			default:
				printf("Task_%d CANNOT get mutex, then SUSPENDED.\n\r",id);
		}
		OSTimeDly(200);                                     /* Delay 200 clock tick       */
		printf("Task_%d RELEASE mutex\n\r",id);
		OSSemPost(mutex);                                /* Release mutex         */
	}
}

/**
 * @brief
 * 		Task1()函数,执行一个任务。
 * @param[in]		void *。
 * @return 无
 */
void  Task1 (void *pdata)
{
	INT8U  id;
	id=*(int *)pdata;
	
	for (;;) 
	{
		printf("Task_%d waitting for an EVEBT\n\r",id);
		OSTimeDly(100);                                /* Delay 100 clock tick       */
		printf("Task_%d's EVENT CAME!\n\r",id);
		OSTimeDly(100);
	}
}

/**
 * @brief
 * 		Task1()函数,执行一个任务。
 * @param[in]		void *。
 * @return 无
 */
void  Task2 (void *pdata)
{
	INT8U  err;
	INT8U  id;
	
	id=*(int *)pdata;
	
	
	for (;;)
	{
		printf("Task_%d trying to GET MUTEX\n\r",id);
		OSSemPend(mutex,0,&err);                      /* Acquire mutex */
		switch(err)
		{
			case OS_NO_ERR:
				printf("Task_%d GOT mutex.\n\r",id);
				OSTimeDly(200);                           /* Delay 100 clock tick       */
				break;
			default :
				printf("Task_%d CANNOT get mutex, then SUSPENDED.\n\r",id);
				OSTimeDly(200);                           /* Delay 100 clock tick       */
				break;
		}
		printf("Task_%d RELEASE mutex\n\r",id);
		OSSemPost(mutex);                            /* Release mutex         */
	}
}


⌨️ 快捷键说明

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