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

📄

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

/**********************************************************************************************************
 * 模块: init.c
 * 目的:
 *      这个程序演示基本的天花板优先级的解决。程序启动具有三个不同优先
 *      级的任务,每个任务请求,获得,释放互斥信号量,完成一系列动作。
 **********************************************************************************************************/

#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         1024                  /* Size of each task's stacks (# of WORDs)       */
#define     TASK_START_ID            0                  /* Application tasks                             */
#define     TASK_START_PRIO         17                  /* Application tasks priorities                  */
#define	    N_TASKS			         3                  /* Number of tasks                               */

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

OS_STK	      TaskStk[N_TASKS][TASK_STK_SIZE/sizeof(OS_STK)];	/*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
*********************************************************************************************************
*/

static  void  TaskStartCreateTasks(void);             /* Function prototypes of Create tasks           */

        void  Task0(void *pdata);                     /* Function prototypes of tasks                  */
        void  Task1(void *pdata);
        void  Task2(void *pdata);
        void  TaskStart(void *pdata);				  /* Function prototypes of Startup 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,"程序启动具有三个不同优先级的任务,每\n\r个任务请求,获得,释放互斥信号量,完成一系列动作.");
	Uart_PutString(uartPort0,"请按任意键继续......");
	Uart_GetChar(uartPort0);
	Uart_PutLine(uartPort0,"");
	
	//Set a mutual semaphore
	mutex=OSSemCreate(1);
	OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 4);
	//Start multitasking
	OSStart();
	return 1;
}


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

void  TaskStart (void *pdata)
{
	pdata = pdata;
	Timer_Start();
	TaskStartCreateTasks();
	OSTaskSuspend(OS_PRIO_SELF);
}

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

static  void  TaskStartCreateTasks (void)
{
	INT8U  i;
	//Create N_TASKS identical tasks
	for (i = 0; i <N_TASKS; i++)
	{
		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);
}

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

void  Task0 (void *pdata)
{
	INT8U  err;
	INT8U  id;
	
	id=*(int *)pdata;
	for (;;)
	{
		//Acquire mutex
		OSSemPend(mutex,0,&err);
		Uart_PutLine(uartPort0,"[Task0]Task___%d GOT a mutex.",id);
		OSTimeDly(10);
		
		//Release mutex
		OSSemPost(mutex);
		Uart_PutLine(uartPort0,"[Task0]Task___%d released the mutex.",id);
		OSTimeDly(10);		
	}
}

void  Task1 (void *pdata)
{
	INT8U  id;
	id=*(int *)pdata;
	
	for (;;) 
	{
		Uart_PutLine(uartPort0,"\t[Task1]Task___%d delaying.......",id);
		OSTimeDly(30);
		Uart_PutLine(uartPort0,"\t[Task1]Task___%d delaied......OK",id);
	}
}

void  Task2 (void *pdata)
{
	INT8U  err;
	INT8U  id;
	id=*(int *)pdata;
	
	for (;;)
	{
		//任务试图取得共享资源使用权
		//OSSemPend()函数用于任务试图取得设备的使用权,任务需要和其他任务或中断同步,任务需要等待特定事件的发生的场合。
		//如果任务调用OSSemPend()函数时,信号量的值大于零,OSSemPend()函数递减该值并返回该值。
		//如果调用时信号量等于零,OSSemPend()函数函数将任务加入该信号量的等待队列。
		//OSSemPend()函数挂起当前任务直到其他的任务或中断置位信号量或超出等待的预期时间。
		//如果在预期的时钟节拍内信号量被置位,μC/OS-Ⅱ默认最高优先级的任务取得信号量恢复执行。
		//	一个被OSTaskSuspend()函数挂起的任务也可以接受信号量,但这个任务将一直保持挂起状态直到通过调用OSTaskResume()
		//函数恢复任务的运行。
		OSSemPend(mutex,0,&err);
		Uart_PutLine(uartPort0,"\t\t[Task2]Task___%d GOT mutex.",id);
		
		OSTimeDly(50);
		

		//Release mutex
		OSSemPost(mutex);
		Uart_PutLine(uartPort0,"\t\t[Task2]Task___%d release the mutex.",id);

		OSTimeDly(20);
	}
}







⌨️ 快捷键说明

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