ucos ii堆栈大小检测
在使用ucos ii时经常会有疑问,这个堆栈该给多大,虽然ucos ii 自带了任务堆栈检测,但是我觉得太麻烦了,而且还会占用资源,我投机取巧的使用内存是否为0来判断堆栈是否使用过,进而检测出堆栈的最大使用量,我的这个方法能快速的检测出历史堆栈的最大使用量,你的实际堆栈大小必须大于历史最大使用量。
原理就是将任务堆栈使用static标记,这样任务堆栈数组都会被清零,使用过程中随着数据入栈(变为非0了,全部入栈都是0的可能性微乎其微),然后数据虽然出栈了,但是并没有清零(也没必要),通过从栈底找到第一个非0的地方(就是被使用过),这样就类似水库中的水在墙壁上留下的印记,就知道历史最高水位一样,通过这个方法可以获取ucos ii的最大堆栈消耗甚至可以知道系统的最大堆栈消耗,通过长期的运行,获取到系统的最大堆栈占用量,能够合理的给每个任务分配堆栈大小。
/************************************************************************************************************** 文件名: TaskStackMonitor.c* 功能: UCOS II 任务堆栈监视* 作者: cp1300@139.com* 创建时间: 2019-01-25* 最后修改时间: 2019-01-25* 详细: 在最低优先级任务中进行调用,会监控所有任务的堆栈使用量,并记录最大值,最小值,同时记录CPU的最大与最小使用量通过监测足够长的时间,可以保证任务堆栈的合理性2019-01-28:增加CPU监控显示,增加socket状态显示
*************************************************************************************************************/
#include "system.h"
#include "usart.h"
#include "main.h"
#include "string.h"
#include "board.h"
#include "rtc.h"
#include "wdg.h"
#include "board.h"
#include "w5500_socket.h"//从堆栈底部往上找到第一个非0位置,返回偏移:字
u32 FindFirstNonzeroPosition(u32 *pStackBottom, u32 StackSize);//线程状态监控
void TaskStackMonitor(void)
{u32 i;u32 StackBottomAddr; //栈底地址u32 StackResidual; //堆栈剩余uart_printf("\r\n----------------任务状态----------------\r\n");for(i = 0;i < sizeof(cg_TaskBuff)/sizeof(TASK_STACK_INFO);i ++){StackBottomAddr = cg_TaskBuff[i].StackTopAddr+4;// - (cg_TaskBuff[i].StackSize*4) + 4; //计算栈底地址StackResidual = FindFirstNonzeroPosition((u32 *)StackBottomAddr, cg_TaskBuff[i].StackSize); //计算使用量uart_printf("任务%d,堆栈剩余:%d,使用量:%%%d\r\n", cg_TaskBuff[i].Proi, StackResidual, (cg_TaskBuff[i].StackSize-StackResidual)*100/cg_TaskBuff[i].StackSize);}uart_printf("CPU占用率:%%%d\r\n", OSCPUUsage);//PrintfSocketsStatus(); //调试打印socket状态
}//从堆栈底部往上找到第一个非0位置,返回偏移:字
u32 FindFirstNonzeroPosition(u32 *pStackBottom, u32 StackSize)
{u32 i = 0;for(i = 0;i < StackSize;i ++){if(pStackBottom[i] != 0) break; }return i;
}
/************************************************************************************************************** 文件名: TaskStackMonitor.h* 功能: UCOS II 任务堆栈监视* 作者: cp1300@139.com* 创建时间: 2019-01-25* 最后修改时间: 2019-01-25* 详细: 在最低优先级任务中进行调用,会监控所有任务的堆栈使用量,并记录最大值,最小值,同时记录CPU的最大与最小使用量通过监测足够长的时间,可以保证任务堆栈的合理性
*************************************************************************************************************/
#ifndef __TASK_STACK_MONITOR_H__
#define __TASK_STACK_MONITOR_H__#include "system.h"
#include "ucos_ii.h"
#include "rtc.h"
#include "board.h"
#include "RTU.h"//任务堆栈信息
typedef struct
{u32 StackTopAddr; //任务栈顶地址(注意:堆栈为向下生长)u32 StackSize; //任务堆栈大小(单位:CPU字长,STM32为4字节,32bit)u8 Proi; //任务的优先级
}TASK_STACK_INFO;void TaskStackMonitor(void);//任务堆栈监视#endif //__TASK_STACK_MONITOR_H__
//任务堆栈指针相关的数组,放进去就可以了
//任务堆栈声明
static OS_STK TASK_MODBUS1_STK[MODBUS1_STK_SIZE]; //MODBUS 通信线程1
static OS_STK TASK_MODBUS2_STK[MODBUS2_STK_SIZE]; //MODBUS 通信线程2
static OS_STK TASK_MODBUS3_STK[MODBUS3_STK_SIZE]; //MODBUS 通信线程3 -扩展的TTL串口
static __align(8) OS_STK TASK_SYSTEM_STK[SYSTEM_STK_SIZE]; //系统主进程
static OS_STK TASK_GPRS_STK[GPRS_STK_SIZE]; //GPRS进程
static OS_STK TASK_BACK_STK[BACK_STK_SIZE]; //BACK进程
static OS_STK TASK_ASSIST_STK[ASSIST_STK_SIZE]; //ASSIST进程
static OS_STK TASK_COLL_STK[COLL_STK_SIZE]; //数据采集时间查询进程
static OS_STK TASK_KEY_STK[KEY_STK_SIZE]; //按钮查询进程
static OS_STK TASK_DEBUG_STK[DEBUG_STK_SIZE]; //DEBUG进程
static OS_STK TASK_W5500_STK[W5500_STK_SIZE]; //W5500进程
static OS_STK TASK_OVERLAY_STK[OVERLAY_STK_SIZE]; //视频叠加进程
static OS_STK TASK_SERVER_STK[SERVER_STK_SIZE]; //UDP Server服务器//任务记录
const TASK_STACK_INFO cg_TaskBuff[13] =
{{(u32)TASK_MODBUS1_STK, MODBUS1_STK_SIZE, MODBUS1_TASK_Prio}, {(u32)TASK_MODBUS2_STK, MODBUS2_STK_SIZE, MODBUS2_TASK_Prio}, {(u32)TASK_MODBUS3_STK, MODBUS3_STK_SIZE, MODBUS3_TASK_Prio}, {(u32)TASK_SYSTEM_STK, SYSTEM_STK_SIZE, SYSTEM_TASK_Prio}, {(u32)TASK_GPRS_STK, GPRS_STK_SIZE, GPRS_TASK_Prio}, {(u32)TASK_BACK_STK, BACK_STK_SIZE, BACK_TASK_Prio}, {(u32)TASK_COLL_STK, ASSIST_STK_SIZE, ASSIST_TASK_Prio},{(u32)TASK_COLL_STK, COLL_STK_SIZE, COLL_TASK_Prio}, {(u32)TASK_KEY_STK, KEY_STK_SIZE, KEY_TASK_Prio}, {(u32)TASK_DEBUG_STK, DEBUG_STK_SIZE, DEBUG_TASK_Prio}, {(u32)TASK_W5500_STK, W5500_STK_SIZE, W5500_TASK_Prio},{(u32)TASK_OVERLAY_STK, OVERLAY_STK_SIZE, OVERLAY_TASK_Prio},{(u32)TASK_SERVER_STK, SERVER_STK_SIZE, SERVER_TASK_Prio},
};
//使用
TaskStackMonitor(); //任务堆栈监视
运行时间越久,这个越准,因为堆栈的占用是动态的,随着你的代码逻辑会变化。
//最终结果
ucos ii堆栈大小检测相关推荐
- 51单片机中使用ucos ii的优缺点(好文)
摘要:近年来,在单片机系统中嵌入操作系统已经成为人们越来越关心的一个话题.本文通过对一种源码公开的嵌入式实时操作系统ucos ii的分析,以51系列单片机为例,阐述了在单片机中使用该嵌入式操作系统的优 ...
- 用C语言写ucos中断服务程序,在ARM处理器上移植uCOS II的中断处理
uCOS II是一个源码公开.可移植.可固化.可剪裁和抢占式的实时多任务操作系统,其大部分源码是用ANSI C编写,与处理器硬件相关的部分使用汇编语言编写.总量约200行的汇编语言部分被压缩到最低限度 ...
- UCOS II移植到STM32F103开发板
早期嵌入式开发没有嵌入式操作系统的概念 ,直接操作裸机,在裸机上写程序,比如用51单片机基本就没有操作系统的概念.通常把程序分为两部分:前台系统和后台系统. 简单的小系统通常是前后台系统,这样的程序包 ...
- ucos II 创建第一个任务之一
Ucos II创建第一个任务 我们已经从远处欣赏过ucos II 的身材,现在可以近距离地欣赏Ucos II性感的局部了. 任务是什么? 有一句话:CPU不同的时刻段总是在执行着优先级最高的任务.所以 ...
- 最大调用堆栈大小超出错误
我正在使用Direct Web Remoting(DWR)JavaScript库文件,并且仅在Safari(台式机和iPad)中出现错误 它说 超出最大呼叫堆栈大小. 该错误的确切含义是什么,它会完全 ...
- esp32 怎么分配freertos 堆栈大小_嵌入式开发入门-从STM32CudeMX、FreeRtos、Proteu仿真开始...
系统 嵌入式是什么呢? 嵌入式开发就是指在嵌入式操作系统下进行开发,常用的嵌入式操作系统有FreeRtos,ucos,linux,android等.与单片机开发最大的不同就是裸跑与跑系统的区别.嵌入式 ...
- iar 堆栈设置_IAR MSP430设置合理堆栈大小(the stack pointer for stack is outside the stack range)...
摘要: 本文给出IAR设置堆栈合理大小的详细方法,并分享一些好博文(icf及map讲解). 最近在MSP430-169LCD(MSP430F169,RAM为2KB)调试一些ucos演示例子,IAR f ...
- uCOS任务堆栈的深入分析(转)
堆栈作用的就是用来保存局部变量,从本质上讲也就是将CPU寄存器的值保存到RAM中.在uCOS中,每一个任务都有一个独立的任务堆栈.为了深入理解任务堆栈的作用,不妨分析任务从"出生" ...
- 嵌入式编程中的堆栈溢出检测
在嵌入式编程中,栈是一个很重要的概念,不管是裸机编程还是基于RTOS编程.函数形参.局部变量.函数调用现场的保护及返回地址.中断函数执行前线程保护及中断嵌套的现场的保护都依赖于栈空间.栈空间不足,程序 ...
最新文章
- origin画密度直方分布图
- ZZmsvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义
- mysql Got error 28 from storage engine
- python3之request用法_如何扩展python3 BaseHTTPRequestHandler类,以便可以使用成员variab调用函数...
- 【Android】Android 设置Activity窗体 不显示标题和全屏显示
- condition框架设计与实现
- 数学的意蕴与价值(建议收藏)
- 详解如何在ubuntu上安装node.js
- 发布Drools Workbench到Tomcat on Linux
- 当Python中混进一只薛定谔的猫……
- 新中大怎么修改服务器,新中大如何修改服务器地址
- mysql数据库基本知识
- Minecraft forge服务端安装
- Struts2中XXX.Action类中方法的访问(三种方式)
- 异或、或、与(且)的运算
- 13. 均匀分布和指数分布
- SQL Server2008 R2下载及安装
- psim软件c语言,PSIM入门实例
- javascript 手册
- GNSS定位原理(伪距)