📄 任务管理.c
字号:
/**********************************************************************************************************
*
* 电子科技大学嵌入式软件工程中心 版权所有
*
* Copyright (C) 2007 UESTC ESEC
*
**********************************************************************************************************/
/**********************************************************************************************************
* 说明
* 模块:init.c
* 目的:
* 本程序演示uC/OS-II基本的任务管理。
* 原理:程序启动具有两个不同优先级的任务,完成任务的挂起和被唤醒的系列动作。
**********************************************************************************************************/
#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);
//nitialize switch count
INT32U count=0;
/********************************************************************************************************
* CONSTANTS
********************************************************************************************************/
#define TASK_STK_SIZE 512 /* Size of each task's stacks (# of WORDs) */
#define N_TASKS 2 /* Number of identical tasks */
/*******************************************************************************************************
* VARIABLES
********************************************************************************************************/
OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /* Tasks stacks */
OS_STK TaskStartStk[TASK_STK_SIZE]; /* TaskStart task stack */
INT8U TaskData[N_TASKS]; /* Parameters to pass to each task */
/*******************************************************************************************************
* FUNCTION PROTOTYPES
********************************************************************************************************/
void Task0(void *pdata); /* Function prototypes of tasks */
void Task1(void *pdata);
void TaskStart(void *pdata); /* Function prototypes of Startup task */
static void TaskStartCreateTasks(void); /* Function prototypes of creat 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,"程序启动具有两个不同优先级的任务,完成任务的挂起和被唤醒的系列动作.");
Uart_PutString(uartPort0,"请按任意键继续......");
Uart_GetChar(uartPort0);
Uart_PutLine(uartPort0,"");
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 4);
//Start multitasking
OSStart();
return 1;
}
/********************************************************************************************************
* STARTUP TASK
*********************************************************************************************************/
void TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
//Allocate storage for CPU status register
OS_CPU_SR cpu_sr;
//消除警告
cpu_sr = cpu_sr;
#endif
//Prevent compiler warning
pdata = pdata;
Timer_Start();
//Create all the application tasks
TaskStartCreateTasks();
//Suspend the TaskStart
OSTaskSuspend(OS_PRIO_SELF);
}
/**************************************************************************************************************
* CREATE TASKS
***************************************************************************************************************/
void TaskStartCreateTasks (void)
{
INT8U i;
//Create tasks
for (i = 0; i < N_TASKS; i++)
{
//Each task will display its own information
TaskData[i] = i;
}
OSTaskCreate(Task0, (void *)&TaskData[0], &TaskStk[0][TASK_STK_SIZE - 1], 5);
OSTaskCreate(Task1, (void *)&TaskData[1], &TaskStk[1][TASK_STK_SIZE - 1], 6);
}
/********************************************************************************************************
* TASK #0
*
* Description: This task is suspended by itself,then it will be resumed by other tasks.
********************************************************************************************************/
void Task0 (void *pdata)
{
INT8U i;
INT8U err;
i=*(int *)pdata;
for (;;)
{
Uart_PutLine(uartPort0,"==================================================================");
Uart_PutLine(uartPort0,"\r\n应用程序任务切换了\t%d\t次",++count);
Uart_PutLine(uartPort0,"\r\nTASK_0, RUNNING...............................................");
Uart_PutLine(uartPort0,"\r\nTASK_1, Stoped!");
Uart_PutLine(uartPort0,"==================================================================");
//suspend itself
err=OSTaskSuspend(5);
}
}
/********************************************************************************************************
* TASK #1
*
* Description: This task resume task0
********************************************************************************************************/
void Task1 (void *pdata)
{
INT8U i;
INT8U err;
i=*(int *)pdata;
while(1)
{
OSTimeDly(15);
Uart_PutLine(uartPort0,"==================================================================");
Uart_PutLine(uartPort0,"\r\n应用程序任务切换了\t%d\t次",++count);
Uart_PutLine(uartPort0,"\r\nTASK_0, Stoped!");
Uart_PutLine(uartPort0,"\r\nTASK_1, RUNNING...............................................");
Uart_PutLine(uartPort0,"==================================================================");
OSTimeDly(15);
//resume task0
err=OSTaskResume(5);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -