栈使用量的一种检测方法

我又有想法辣,<( ̄︶ ̄)>,今天的想法的目的是实现栈的使用量的检测方法。

1、利用*.map文件定位栈顶地址,并且得到栈的使用量大小;

2、定义一个全局变量,用于存储栈区内存上电时候的默认值,这个默认值我定义为栈顶内存值;

3、在大循环里面从栈顶地址开始,将栈内存里面的值和第二步中的值进行比较,如果不相等,则认为该栈的内存被使用了,记下该地址值,用栈底地址和该地址相减,然后再和栈使用量大小相除,得到栈的使用量的大小比值;

4、第三步中,得到第一次的内存值被修改后,下一次的检测将从该地址开始检测,依次类推。即检测过的地址只要有一次值被修改后,不会再检测。所以,本设计不能得到实时的栈使用量的大小,只能得到程序运行过程中,栈的最大使用量的大小。

解释第四步:为什么在检测中不能每一次从栈顶开始呢?这样不就可以得到栈的实时使用量的大小吗?因为栈在出栈时不会清栈(注意,这个是大前提,因编译器而异),所以这次检测的值有可能是上N次的被污染的内存。

 伪代码如下:

#define
STACK_TOP 0x20000210 //栈顶地址,这个得自己去查,如果有变量定义,每次编译都可能不一样#define
STACK_USAGE 0x00000500//栈的使用量,这个得自己去查,每次编译都可能不一样
uint8_t
Stack_Value;//栈未被污染时候的值
uint_8
Stack_Overflow=0;//栈溢出标志
uint_8
main()
{
uint16_t
cost;
Stack_Value
= * (uint8_t * )STACK_TOP);//获取干净的栈的值
/*系统参数初始化*/
while(1)
{
/*用户函数*/
cost =Check_Stack();
}
}
uint16_t Check_Stack(void)
{
static uint8_t stack_value=0,*ponint1 =STACK_TOP ;
uint8_t *ponint ;
uint8_t usage_stack,i;

ponint =ponint1
;//获得上次的栈的使用地址
for(i=0;i<STACK_USAGE ;i++)
{
if(*ponint !=Stack_Value)
{
usage_stack = STACK_TOP+STACK_USAGE-ponint; //获得栈的使用量
usage_stack = usage_stack /STACK_USAGE*100;//获得百分比值
ponint1 = ponint;
returnusage_stack;//返回栈的使用量的百分比
}
else
{
ponint++;
if(ponint
> STACK_TOP+STACK_USAGE)
{
return 0xff;//故障
}
}
}
}

  • 版权声明: 本文源自 单片机C语言入门, 于2年前,由整理发表,共 1116字。
  • 原文链接:点此查看原文

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: