续04-----统计任务+堆栈使用情况检测
一、统计任务
1.UCOSII有一个提供运行时间统计的任务(OS_TaskStat())。如果用户将系统定义常数OS_TASK_STAT_EN(见文件OS_CFG.H)设为1,这个任务就会建立。一旦得到允许,统计任务每秒钟运行一次,计算当前CPU利用率,即OS_TaskStat()告诉用户应用程序使用了多少CPU时间,用百分比表示,这个值存放在一个有8位整数OSCPUsage中,精度是1个百分点。
2.如果用户应用程序打算使用统计任务,必须在初始化时建立一个唯一的任务,在这个任务中调用OSStatInit()。换句话说,在调用系统启动函数OSStart()之前,用户初始化代码必须建立一个任务,在这个任务中调用系统统计初始化函数OSStatInit(),然后再建立应用程序中的其他任务。
3.使用过程
①在OS_CFG.H中置OS_TASK_STAT_EN为1;
②主函数main中建立一个起始任务
[mw_shl_code=c,true] OSInit();
OSTaskCreate(start_task, (void *)0, (OS_STK*)&START_TASK_STK[START_STK_SIZE-1], START_TASK_PRIO);
OSStart();[/mw_shl_code]
③在起始任务中调用OSStatInit()
[mw_shl_code=c,true]void start_task(void *pdata)
{
OS_CPU_SR cpu_sr = 0;
pdata = pdata;
...
OSStatInit(); //开启统计任务
...
}[/mw_shl_code]
④直接在任一任务中使用使用率变量OSCPUsage即可
[mw_shl_code=c,true]void main_task(void *pdata)
{
...
while(1)
{
...
if(tcnt == 50)
{
tcnt = 0;
LCD_ShowxNum(192, 30, OSCPUUsage, 3, 16, 0); //CPU使用率显示
}
tcnt++;
delay_ms(10);
}
}[/mw_shl_code]
二、任务堆栈实际使用情况
在UCOSII学习中,对于堆栈大小的设置没有头绪,设置多大既不过多浪费空间,又能够保证程序正常运行心理没底,基于此,网上找了一些资料进行学习,以便对堆栈有一些合理的掌控。
1.相关函数/结构
①需使用创建扩展任务函数OSTaskCreateExt()创建任务,其原型
[mw_shl_code=c,true]#if OS_TASK_CREATE_EXT_EN > 0
INT8U OSTaskCreateExt
(
void (*task)(void *pd), //建立扩展任务(任务代码指针
void *pdata, //传递参数指针
OS_STK *ptos, //分配任务堆栈栈顶指针
INT8U prio, //分配任务优先级
INT16U id, //(未来的)优先级标识(与优先级相同)
OS_STK *pbos, //分配任务堆栈栈底指针
INT32U stk_size, //指定堆栈的容量(检验用)
void *pext, //指向用户附加的数据域的指针
INT16U opt //建立任务设定选项
)
#endif[/mw_shl_code]
②UCOSII有专门堆栈检测函数OSTaskStkChk(),其原型为
[mw_shl_code=c,true]INT8U OSTaskStkChk
(
INT8U prio, //待测任务的优先级
OS_STK_DATA *pdata //指向一个类型为OS_STK_DATA的结构体
)[/mw_shl_code]
参数prio为指定要获取堆栈信息的任务优先级,也可以指定参数OS_PRIO_SELF,获取调用任务本身的信息;
③在堆栈检测函数中涉及到一个OS_STK_DATA的结构体
[mw_shl_code=c,true]#if OS_TASK_CREATE_EXT_EN > 0
typedef struct
{
INT32U OSFree; //堆栈中未使用的字节数
INT32U OSUsed; //堆栈中已使用的字节数
} OS_STK_DATA;
#endif[/mw_shl_code]
2.使用方法
①在ucos_ii.h文件中对OS_TASK_OPT_STK_CLR等进行了配置(如下),无需进一步设置
[mw_shl_code=c,true]#define OS_TASK_OPT_STK_CHK 0x0001u /* Enable stack checking for the task */
#define OS_TASK_OPT_STK_CLR 0x0002u /* Clear the stack when the task is create */[/mw_shl_code]
②将创建扩展任务最后一个参数opt设置为OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR;
③定义一个OS_STK_DATA变量,如OS_STK_DATA StackBytes;
④调用堆栈检测函数OSTaskStkChk(),如OSTaskStkChk(TestTaskPRIO, &StackBytes);
⑤StackBytes.OSFree的值即为被测任务堆栈未使用的字节数;
StackBytes.OSUsed的值即为被测任务堆栈已使用字节数。
3.建议
其一,将被测任务经历最坏的堆栈使用状态,测出来的使用率才可靠;
其二,堆栈使用最好在50%~80%之间,太小浪费空间,太大不安全;
其三,最好在工程中单独建立一个优先级较低而延时较长的任务来测试其他任务的堆栈使用情况,不用时可以挂起该任务。
参考/相关链接
【1】http://blog.csdn.net/zhanglianpin/article/details/6326752
【2】http://www.2cto.com/os/201411/354880.html
【3】http://blog.chinaunix.net/uid-2615303-id-193740.html
|