📄 ucos_pri_reverse.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 + -