📄
字号:
/**********************************************************************************************************
*
* 电子科技大学嵌入式软件工程中心 版权所有
*
* 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 + -