栈的大小评估以及栈空间的优化
发布时间:2022-10-14 11:20:26 所属栏目:大数据 来源:
导读: 在C语言代码的组成的一文中,我们已经讲细讲述了栈的作用,以及大小分配方式。由于栈的大小是作者自行分配的,且分配的大小是评估出来的,而栈的使用是由系统使用的,目前大部的嵌入式系统中均没有MMU单元,即硬
|
在C语言代码的组成的一文中,我们已经讲细讲述了栈的作用,以及大小分配方式。由于栈的大小是作者自行分配的,且分配的大小是评估出来的,而栈的使用是由系统使用的,目前大部的嵌入式系统中均没有MMU单元,即硬件是无法自身进行栈检测保护的,而栈使用的不可控性,导到我们的代码处于一种不可控的危险中,随时可能会崩溃。 为了使系统可靠运行,我们肯定尽量分配越大的栈越好,但这对于资源十分有限的嵌入式系统而言,显然是不可接受的。那么我们怎么评估出栈的大小呢? 这两种办法,都有一个局限性,就是不精确,因为理论分析中,对于中断的嵌套调用,我们很难评估正确。在实际测试中,我们也可能面临触发条件不能完全覆盖,导致所测试得到的栈空间大小,并不一定是最大的。由于以上这些原因,我们在设置栈大小时,还是会采取保守策略,即尽量分配大一点的栈空间,以换取心安。 那么我们如何减少栈空间大小呢?由于栈是函数的临时变量、传递函数的参数、函数中断时保存的寄存器,我们可以据此进行优化,以减少栈空间的使用: 尽量减少函数的调用链,比如f(a)调用函数f(b),f(b)调用函数f(c),这样所消耗的栈空间,就是f(a),f(b),f(c)这三个函数加起来的临时变量数。但是如果将三个函数改为b=f(c); a=f(b); out = f(a),即将上一个函数的输出作为下一个函数的输入值,当f(c)调用完成后,它所使用的栈就会释放,这样通过函数并行调用的方式而不是级联调用方式,所需要的栈空间是f(a),f(b),f(c)这三个函数中,临时变量最多的一个函数所用的空间。在中断中,尽量减少函数的调用,更要减少在中断中分配临时变量,禁止一个中断函数的嵌套调用。中断服务要以最快的速度完成任务并退出,防止中断被其它的中断所中断,这样就会增加栈的消耗。对于递归函数,尽量化解为循环的方式实现,若实在要使用递归,那一定要严格限制递归的次数大数据堆栈,并评估递归消耗的栈空间。对于函数中的临时变量,尽量选择合适的数据类型,对于缓冲区,合理的分配出大小,这样可以减少不必要的栈空间消耗;对于某些任务中,可能要使用到的较大的缓冲区(比如通讯系统中),因为我们往往会分配一些全局缓冲区,对于两个互斥的任务,如果它们可以分别操作这个缓冲区,而不影响结果时,可以将这个任务中的临时缓冲区,改为操作全局变量的缓冲区,这样就不用分配栈空间 -- 即内存共享的方法。 读者可以根据自己软件设计的实际要求,合理的使用以上方法,以减少内存的使用,并增加系统的可靠性。要知道,现在大部分的单片机,很多是以RAM的大小,来划分型号,并有不同的售价的,省下的RAM,都是真金白银。 (编辑:均轻资讯网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐


