优先级继承.c

来自「这个程序演示基本的天花板优先级的解决。程序启动具有三个不同优先级的任务」· C语言 代码 · 共 161 行

C
161
字号
/**********************************************************************************************************
* 
*				                电子科技大学嵌入式软件工程中心 版权所有
* 					
* 								Copyright (C) 2007 UESTC ESEC
*
**********************************************************************************************************/

/**********************************************************************************************************
* 目的:
*      这个程序演示优先级继承的原理。程序启动具有三个不同优先
*      级的任务,每个任务请求、获得和释放互斥信号量,完成一系列动作。
**********************************************************************************************************/

#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);

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

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

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

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

/*
************************************************************************************************************
*                                           FUNCTION PROTOTYPES
************************************************************************************************************
*/

        void  Task(void *pdata);                       /* Function prototypes of tasks                */
        void  TaskStart(void *pdata);				   /* Function prototypes of Startup task         */
static  void  TaskStartCreateTasks(void);              /* Function prototypes of Create tasks         */

/*
*************************************************************************************************************
*                                                MAIN
*************************************************************************************************************
*/
int  main (void)
{
	INT8U  err;
	
	//板级初始化
	ucBsp_Init();	
	//open the interrupt bit 'I'
	CPSR_Init();
	//Initialize uC/OS-II
	OSInit();
	
	Uart_PutString(uartPort0,"\t本程序演示uC/OS-II中的优先级继承的原理: ");
	Uart_PutLine(uartPort0,"本程序启动具有三个不同优先级的任务,\n\r每个任务请求、获得和释放互斥信号量,完成一系列动作");
	Uart_PutString(uartPort0,"请按任意键继续......");
	Uart_GetChar(uartPort0);
	Uart_PutLine(uartPort0,"");

	//创建用于互斥型信号量mutex.
	//函数原型:OS_EVENT *OSMutexCreate(INT8U Prio,INT8U *err)
	//prio:优先级继承优先级(PIP)。当一个高优先级任务想要得到某Mutez,而此时这个mutex却被另一个低优先级任务占用时,低优先级任务
	//的优先级可被提高到PIP,直到其释放共享资源。
	mutex   = OSMutexCreate(8,&err);
	OSTaskCreate(TaskStart,  (void *)0,  &TaskStartStk[TASK_STK_SIZE - 1], 9);
	OSStart();
	return 1;
}

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

void  TaskStart (void *pdata)
{
	pdata = pdata;

	Timer_Start();

    TaskStartCreateTasks();
 	OSTaskSuspend(OS_PRIO_SELF);
}

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

void  TaskStartCreateTasks (void)
{
	INT8U  i;
	for (i = 0; i <N_TASKS; i++)
	{
		TaskData[i] = i;
		OSTaskCreate(Task, (void *)&TaskData[i], &TaskStk[i][TASK_STK_SIZE - 1], i+10);
	}
}

/*
****************************************************************************************************************
*                                                  TASKS
****************************************************************************************************************
*/

void  Task (void *pdata)
{
	INT8U  err;
	INT8U  id;
	
	id=*(int *)pdata+1;
	
	for (;;)
	{
		Uart_PutLine(uartPort0,"Task___%d trying get mutex", id);
		//Acquire mutex to get continue
		//任务独占共享资源
		//如果mutex已经被别的任务占用,那么OSMutexPend()函数就向调用该函数的任务放入等待mutex的任务列表中,这个任务就进入了
		//等待状态,直到占有mutex的任务释放了mutex以及共享资源,或者直到定义的等待时限超时。
		//如果在等待时限内mutex得以释放,那么uC/OS-II恢复运行等待mutex的任务中的优先级最高的任务。
		
		//如果mutex被优先级较低的任务占用了,那么OSMutexPend()会将占用mutex的任务的优先级提升到优先级继承优先级PIP.
		//PIP是在mutex建立时定义的,具体在OSMutexCreate()中。		
		OSMutexPend(mutex, 0, &err); 
		
		Uart_PutLine(uartPort0,"Task___%d got the mutex", id);
		OSTimeDlyHMSM(0, 0, 1, 200);

		//延长任务优先级最低的任务,以观察效果
		if(3 == id)
		{
			OSTimeDlyHMSM(0, 0, 3, 100);
		}
		
		Uart_PutLine(uartPort0,"Task___%d releases the mutex", id);
		//Release mutex
		//若优先级被提升,这里可以恢复其优先级。
		//若优先级没有被没有,则仅仅将mutex设置成一个特定的数字(0xFF),表示mutex可以使用。
		OSMutexPost(mutex);
		
		OSTimeDlyHMSM(0, 0, 1, (3-id)*150);
	}
}

⌨️ 快捷键说明

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