当前位置:  开发笔记 > 编程语言 > 正文

如何通过良好的设计保留堆栈空间?

如何解决《如何通过良好的设计保留堆栈空间?》经验,为你挑选了4个好方法。

我正在使用RTOS编程用于RAM有限的嵌入式微控制器.

我经常将我的代码分解为短函数,但每个函数调用都需要更多的堆栈内存.每个任务都需要他的堆栈,这是项目中重要的内存消费者之一.

是否有替代方法可以使代码保持良好的组织和可读性,仍保留内存?



1> John Milliki..:

尽量让调用堆栈平坦的,所以不是a()调用b()它调用c()它调用d(),具有a()呼叫b(),c()以及d()本身.

如果函数只引用一次,请标记它inline(假设您的编译器支持此功能).



2> Benoit..:

堆栈使用有3个组件:

函数调用返回地址

函数调用参数

自动(本地)变量

最小化堆栈使用的关键是最小化参数传递和自动变量.实际函数调用本身的空间消耗相当小.

参数

解决参数问题的一种方法是传递结构(通过指针)而不是大量参数.

foo(int a, int b, int c, int d)
{
...
   bar(int a, int b);
}

改为:

struct my_params {
   int a;
   int b;
   int c;
   int d;
};
foo(struct my_params* p)
{
   ...
   bar(p);
};

如果你传递了很多参数,这个策略是好的.如果参数都不同,那么它可能不适合你.最终会传递一个包含许多不同参数的大型结构.

自动变量(本地人)

这往往是堆栈空间的最大消费者.

阵列是杀手.不要在本地函数中定义数组!

最小化局部变量的数量.

使用必要的最小类型.

如果重入不是问题,则可以使用模块静态变量.

请记住,如果您只是将所有局部变量从本地范围移动到模块范围,则表示您没有保存任何空间.您为数据段空间交换了堆栈空间.

一些RTOS支持线程本地存储,它基于每个线程分配"全局"存储.这可能允许您在每个任务的基础上拥有多个独立的全局变量,但这会使您的代码不那么简单.



3> mbac32768..:

如果您可以节省大量主内存但只有一小部分堆栈,我建议您评估静态分配.

在C中,在函数内声明的所有变量都是"自动管理"的,这意味着它们被分配在堆栈中.

将声明限定为"静态"将它们存储在主存储器而不是堆栈中.它们基本上表现得像全局变量,但仍然允许你避免过度使用全局变量带来的坏习惯.您可以将大型长寿命缓冲区/变量声明为静态以减少堆栈压力.

请注意,如果您的应用程序是多线程的或者您使用递归,这根本不能正常工作.



4> Derek Park..:

打开优化,特别是积极的内联.编译器应该能够内联方法来最小化调用.根据您使用的编译器和优化开关,将某些方法标记为inline可能有帮助(或者可以忽略).

使用GCC,尝试添加"-finline-functions"(或-O3)标志以及可能的"-finline-limit = n"标志.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有