优先级继承.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 + -
显示快捷键?