在使用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堆栈大小检测相关推荐

  1. 51单片机中使用ucos ii的优缺点(好文)

    摘要:近年来,在单片机系统中嵌入操作系统已经成为人们越来越关心的一个话题.本文通过对一种源码公开的嵌入式实时操作系统ucos ii的分析,以51系列单片机为例,阐述了在单片机中使用该嵌入式操作系统的优 ...

  2. 用C语言写ucos中断服务程序,在ARM处理器上移植uCOS II的中断处理

    uCOS II是一个源码公开.可移植.可固化.可剪裁和抢占式的实时多任务操作系统,其大部分源码是用ANSI C编写,与处理器硬件相关的部分使用汇编语言编写.总量约200行的汇编语言部分被压缩到最低限度 ...

  3. UCOS II移植到STM32F103开发板

    早期嵌入式开发没有嵌入式操作系统的概念 ,直接操作裸机,在裸机上写程序,比如用51单片机基本就没有操作系统的概念.通常把程序分为两部分:前台系统和后台系统. 简单的小系统通常是前后台系统,这样的程序包 ...

  4. ucos II 创建第一个任务之一

    Ucos II创建第一个任务 我们已经从远处欣赏过ucos II 的身材,现在可以近距离地欣赏Ucos II性感的局部了. 任务是什么? 有一句话:CPU不同的时刻段总是在执行着优先级最高的任务.所以 ...

  5. 最大调用堆栈大小超出错误

    我正在使用Direct Web Remoting(DWR)JavaScript库文件,并且仅在Safari(台式机和iPad)中出现错误 它说 超出最大呼叫堆栈大小. 该错误的确切含义是什么,它会完全 ...

  6. esp32 怎么分配freertos 堆栈大小_嵌入式开发入门-从STM32CudeMX、FreeRtos、Proteu仿真开始...

    系统 嵌入式是什么呢? 嵌入式开发就是指在嵌入式操作系统下进行开发,常用的嵌入式操作系统有FreeRtos,ucos,linux,android等.与单片机开发最大的不同就是裸跑与跑系统的区别.嵌入式 ...

  7. iar 堆栈设置_IAR MSP430设置合理堆栈大小(the stack pointer for stack is outside the stack range)...

    摘要: 本文给出IAR设置堆栈合理大小的详细方法,并分享一些好博文(icf及map讲解). 最近在MSP430-169LCD(MSP430F169,RAM为2KB)调试一些ucos演示例子,IAR f ...

  8. uCOS任务堆栈的深入分析(转)

    堆栈作用的就是用来保存局部变量,从本质上讲也就是将CPU寄存器的值保存到RAM中.在uCOS中,每一个任务都有一个独立的任务堆栈.为了深入理解任务堆栈的作用,不妨分析任务从"出生" ...

  9. 嵌入式编程中的堆栈溢出检测

    在嵌入式编程中,栈是一个很重要的概念,不管是裸机编程还是基于RTOS编程.函数形参.局部变量.函数调用现场的保护及返回地址.中断函数执行前线程保护及中断嵌套的现场的保护都依赖于栈空间.栈空间不足,程序 ...

最新文章

  1. origin画密度直方分布图
  2. ZZmsvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义
  3. mysql Got error 28 from storage engine
  4. python3之request用法_如何扩展python3 BaseHTTPRequestHandler类,以便可以使用成员variab调用函数...
  5. 【Android】Android 设置Activity窗体 不显示标题和全屏显示
  6. condition框架设计与实现
  7. 数学的意蕴与价值(建议收藏)
  8. 详解如何在ubuntu上安装node.js
  9. 发布Drools Workbench到Tomcat on Linux
  10. 当Python中混进一只薛定谔的猫……
  11. 新中大怎么修改服务器,新中大如何修改服务器地址
  12. mysql数据库基本知识
  13. Minecraft forge服务端安装
  14. Struts2中XXX.Action类中方法的访问(三种方式)
  15. 异或、或、与(且)的运算
  16. 13. 均匀分布和指数分布
  17. SQL Server2008 R2下载及安装
  18. psim软件c语言,PSIM入门实例
  19. javascript 手册
  20. GNSS定位原理(伪距)

热门文章

  1. 邱若辰:做微博年入100W,微博赚钱的全套攻略
  2. python字典序列化是什么意思_为什么python拒绝在一个特殊的cas下序列化这个字典...
  3. 同等学力申硕 计算机科学与技术
  4. Office Visio软件在工控原理图中的应用
  5. UiPath与UiBot的比较
  6. 我,爆肝17天用600行代码拍到400公里之外的国际空间站
  7. 2020中国数字城市大盘点
  8. matlab打开mat文件,MAT文件打开方法汇总及其他操作
  9. 服务器租用的速度受什么影响
  10. 万能的3d打印机真的江郎才尽了吗