uC/OS-II学习笔记(3)

                                                                                           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()函数的调用时刻。通过计算这两个时间的差值,可以很容易地得到这个时间。

猜你喜欢

转载自blog.csdn.net/u013414501/article/details/48349669