by WC 10.9.2015
2## 范例2 ##
范例2演示了uC/OS-II的堆栈检查功能,即显示每个任务分配的堆栈空间和已经使用的堆栈空间。当不知道应该给任务分配多少堆栈空间的时候,堆栈检查功能是很有用的。要使用堆栈检查功能就必须使用带扩展功能的任务建立函数OSTaskCreateExt()。因为该堆栈检查功能要求任务建立时给堆栈清0,而OSTaskCreakExt()可以执行此项操作(该函数的选项opt参数OS_TASK_OPT_STK_CHK和OS_TASK_OPT_STK_CLR置为1,允许此项操作)。如果任务运行过程中有建立、删除任务的操作,应该设置好上述选项,确保任务建立后堆栈是清空的。在执行堆栈检查操作时,uC/OS-II从栈低向栈顶搜索非0元素,同时用一个计数器记录0元素的个数。
L1.6 TEST.C
#include "includes.h" 【1】
/*
**************************************************************************************************
* CONSTANTS
**************************************************************************************************
*/
#define TASK_STK_SIZE 512 /* Size of each task's stacks (# of WORDs) */ 【2】
#define TASK_START_ID 0 /* Application tasks IDs */ 【3】
#define TASK_CLK_ID 1
#define TASK_1_ID 2
#define TASK_2_ID 3
#define TASK_3_ID 4
#define TASK_4_ID 5
#define TASK_5_ID 6
#define TASK_START_PRIO 10 /* Application tasks priorities */ 【4】
#define TASK_CLK_PRIO 11
#define TASK_1_PRIO 12
#define TASK_2_PRIO 13
#define TASK_3_PRIO 14
#define TASK_4_PRIO 15
#define TASK_5_PRIO 16
/*
*****************************************************************************************************
* VARIABLES
*****************************************************************************************************
*/
OS_STK TaskStartStk[TASK_STK_SIZE]; /* Startup task stack */ 【5】
OS_STK TaskClkStk[TASK_STK_SIZE]; /* Clock task stack */
OS_STK Task1Stk[TASK_STK_SIZE]; /* Task #1 task stack */
OS_STK Task2Stk[TASK_STK_SIZE]; /* Task #2 task stack */
OS_STK Task3Stk[TASK_STK_SIZE]; /* Task #3 task stack */
OS_STK Task4Stk[TASK_STK_SIZE]; /* Task #4 task stack */
OS_STK Task5Stk[TASK_STK_SIZE]; /* Task #5 task stack */
OS_EVENT *AckMbox; /* Message mailboxes for Tasks #4 and #5 */ 【6】
OS_EVENT *TxMbox;
L1.6【2】: 每个堆栈的容量由TASK_STK_SIZE决定,在这里所有的任务堆栈容量设为相同值,但是也可以设置为不容的容量。
L1.6【3】: 为堆栈分配实际的存储空间。
L1.7 TEST.C,main()
void main (void)
{
OS_STK *ptos;
OS_STK *pbos;
INT32U size;
PC_DispClrScr(DISP_FGND_WHITE); /* 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 */
PC_ElapsedInit(); /* Initialized elapsed time measurement */ 【1】
ptos = &TaskStartStk[TASK_STK_SIZE - 1]; /* TaskStart() will use Floating-Point */ 【2】
pbos = &TaskStartStk[0];
size = TASK_STK_SIZE;
OSTaskStkInit_FPE_x86(&ptos, &pbos, &size); 【3】
OSTaskCreateExt(TaskStart, 【4】
(void *)0,
ptos, 【5】
TASK_START_PRIO, 【6】
TASK_START_ID, 【7】
pbos, 【8】
size, 【9】
(void *)0, 【10】
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); 【11】
OSStart(); /* Start multitasking */
}
与范例1相同的内容不再累述。
L1.7【1】: 调用PC_ElapsedInit()函数,初始化时间测量功能。这个功能用来计算OSTaskStkChk()函数的运行时间,精确的记录PC_ElapsedStart()和PC_ElaspedStop()函数的调用时刻。通过计算这两个时间的差值,可以很容易地得到这个时间。