📄 uc-os_ii 任务管理.txt
字号:
uc-os_II 任务管理2007-09-03 10:13任务(Task)对于uC/OS-II,就像进程对应于Windows一样,是系统内核的重要组成部分。
在本例中,用OSTaskCreateExt建立任务,并使用自定义的TASK_USER_DATA对栈的使用情况进行统计,统计使用自定义的统计函数OSTaskStatHook进行,这是与书中范例2的最大不同。在OS_CFG.H文件中,需要定义#define OS_CPU_HOOKS_EN 0,否则不能使用自定义的统计函数。
#include "includes.h"
/*
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
#define TASK_START_STK_SIZE 512
#define TASK1_STK_SIZE 512
#define TASK2_STK_SIZE 256
#define TASK_START_PRIO 4
#define TASK1_PRIO 5
#define TASK2_PRIO 6
#define N_TASKS 2 /* 除TaskStart外的任务数 */
/*
*********************************************************************************************************
* 类型
*********************************************************************************************************
*/
typedef struct {
INT32U Max;
INT32U Min;
INT32U Ave;
INT32U Cur;
} TASK_USER_DATA;
/*
*********************************************************************************************************
* VARIABLES
*********************************************************************************************************
*/
OS_STK TaskStartStk[TASK_START_STK_SIZE]; /* 为不同的任务定义不同的栈 */
OS_STK Task1Stk[TASK1_STK_SIZE];
OS_STK Task2Stk[TASK2_STK_SIZE];
TASK_USER_DATA TaskUserData[N_TASKS]; /* 保存栈的使用情况 */
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void Task1(void *data); /* Function prototypes of tasks */
void Task2(void *data);
void TaskStart(void *data); /* Function prototypes of Startup task */
static void TaskStartCreateTasks(void);
void OSTaskStatHook(void);
/*$PAGE*/
/*
*********************************************************************************************************
* MAIN
*********************************************************************************************************
*/
void main (void)
{
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* Clear the screen */
OSInit(); /* Initialize uC/OS-II */
PC_DOSSaveReturn(); /* Save environment to return to DOS */
PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector */
OSTaskCreateExt(TaskStart,
(void *)0,
&TaskStartStk[TASK_START_STK_SIZE - 1],
TASK_START_PRIO,
TASK_START_PRIO,
&TaskStartStk[0],
TASK_START_STK_SIZE,
(void *)0,
0);
OSStart(); /* Start multitasking */
}
/*
*********************************************************************************************************
* STARTUP TASK
*********************************************************************************************************
*/
void TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT16S key;
pdata = pdata; /* Prevent compiler warning */
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR); /* Install uC/OS-II's clock tick ISR */
PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */
OS_EXIT_CRITICAL();
OSStatInit(); /* Initialize uC/OS-II's statistics */
TaskStartCreateTasks(); /* Create all the application tasks */
PC_DispStr(0, 0,
(INT8U *)"ID MaxStk MinStk Ave Cur Cnt",
DISP_FGND_WHITE);
for (;;) {
if (PC_GetKey(&key) == TRUE) { /* See if key has been pressed */
if (key == 0x1B) { /* Yes, see if it's the ESCAPE key */
PC_DOSReturn(); /* Return to DOS */
}
}
OSTimeDlyHMSM(0, 0, 1, 0); /* Wait one second */
}
}
/*
*********************************************************************************************************
* CREATE TASKS
*********************************************************************************************************
*/
static void TaskStartCreateTasks (void)
{
memset(&TaskUserData[0], 0, N_TASKS * sizeof(TASK_USER_DATA));
TaskUserData[0].Min = 0xFFFFFFFF; /* 为了能正常比较最小数 */
TaskUserData[1].Min = 0xFFFFFFFF;
OSTaskCreateExt(Task1,
(void *)0,
&Task1Stk[TASK1_STK_SIZE - 1],
TASK1_PRIO,
TASK1_PRIO,
&Task1Stk[0],
TASK1_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK + OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task2,
(void *)0,
&Task2Stk[TASK2_STK_SIZE - 1],
TASK2_PRIO,
TASK2_PRIO,
&Task2Stk[0],
TASK2_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
}
/*
*********************************************************************************************************
* TASKS
*********************************************************************************************************
*/
void Task1 (void *pdata)
{
pdata = pdata;
for (;;) {
OSTimeDly(2);
}
}
void Task2 (void *pdata)
{
INT16U as;
pdata = pdata;
as = 32;
for (;;) {
OSTimeDly(10);
}
}
/*
*********************************************************************************************************
* 自定义统计任务
*********************************************************************************************************
*/
void OSTaskStatHook (void)
{
INT8U i, s;
OS_STK_DATA stkdata;
INT32U stkused;
static INT32U CallCnt;
static INT32U tasktotal[N_TASKS];
char str[50];
++CallCnt;
for (i = TASK1_PRIO; i < N_TASKS + TASK1_PRIO; i++) {
OSTaskStkChk(i, &stkdata);
stkused = stkdata.OSUsed;
s = i - TASK1_PRIO;
TaskUserData[s].Cur = stkused;
if (TaskUserData[s].Max < stkused) {
TaskUserData[s].Max = stkused;
}
if (TaskUserData[s].Min > stkused) {
TaskUserData[s].Min = stkused;
}
tasktotal[s] += stkused;
TaskUserData[s].Ave = (INT32U)(tasktotal[s] / CallCnt);
sprintf(str, "%2d %6ld %6ld %3ld %3ld %3ld",
i,
TaskUserData[s].Max,
TaskUserData[s].Min,
TaskUserData[s].Ave,
TaskUserData[s].Cur,
CallCnt);
PC_DispStr(0, s + 1, (INT8U *)str, DISP_FGND_GREEN);
}
}
void OSInitHookBegin (void)
{
}
/*
*********************************************************************************************************
* OS INITIALIZATION HOOK
* (END)
*********************************************************************************************************
*/
void OSInitHookEnd (void)
{
}
/*
*********************************************************************************************************
* TASK CREATION HOOK
*********************************************************************************************************
*/
void OSTaskCreateHook (OS_TCB *ptcb)
{
ptcb = ptcb; /* Prevent compiler warning */
}
/*
*********************************************************************************************************
* TASK DELETION HOOK
*********************************************************************************************************
*/
void OSTaskDelHook (OS_TCB *ptcb)
{
ptcb = ptcb; /* Prevent compiler warning */
}
/*
*********************************************************************************************************
* IDLE TASK HOOK
*********************************************************************************************************
*/
void OSTaskIdleHook (void)
{
}
void OSTaskSwHook (void)
{
}
/*
*********************************************************************************************************
* OSTCBInit() HOOK
*********************************************************************************************************
*/
void OSTCBInitHook (OS_TCB *ptcb)
{
ptcb = ptcb; /* Prevent Compiler warning */
}
/*
*********************************************************************************************************
* TICK HOOK
*********************************************************************************************************
*/
void OSTimeTickHook (void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -