控制堆栈空间的使用
你可以控制你的编译器使用的最大堆栈大小或硬件。堆栈是一块内存,它存储本地变量程序执行。栈内存分配在代码生成。堆栈分配通常是更有效的比静态分配的内存使用。
配置设置的值StackUsageMax
以字节。基于信息从目标硬件设置和可能的执行路径的代码,软件堆栈变量一定价值的估计StackUsageMax
可以容纳。这个估计不占栈大小变化引入的C编译器。变量不适合在栈内存的堆栈溢出。从堆栈溢出的变量存储在静态内存或泄漏如果你想生成可重入的代码结构。
你可以增加
StackUsageMax
提高变量分配给堆栈内存的数量。如果你的目标硬件有足够的堆栈空间,这减少了变量的数量从堆栈溢出。你可以减少
StackUsageMax
减少变量分配栈内存。如果你的目标硬件缺乏足够的堆栈空间,这增加的数量变量溢出的堆栈。
递归函数中的变量,不适合在堆栈上不存储在静态内存,或如果你泄漏结构生成可重入代码。递归函数中的变量不是堆栈溢出,即使他们超过栈使用大小。
同样,代码生成不占在调用堆栈使用自定义代码coder.ceval
。
这个例子显示了如何设置的最大堆栈空间生成的代码使用。设置最大堆栈使用时:
你有有限的堆栈空间,例如,在嵌入式目标。
你的C编译器报告运行时堆栈溢出。
通过使用控制堆栈空间的使用MATLAB编码器应用程序
打开生成对话框,在生成代码页面,点击生成箭头。
集构建类型来
源代码
,墨西哥人
,静态库
,动态库
,或可执行的
(取决于您的需求)。点击更多的设置。
在内存选项卡,设置堆栈使用max你想要的价值。
控制堆栈空间的使用在命令行
创建一个配置对象的代码生成。
使用
coder.config
使用参数“自由”
,墨西哥人
,“dll”
,或exe”
(取决于您的需求)。例如:cfg = coder.config(“自由”);
设置属性
StackUsageMax
你想要的价值。cfg.StackUsageMax = 400000;
生成的代码没有溢出的变量
不同的结果依赖于大量的堆栈空间。
在下列MATLAB生成代码®代码与充足的堆栈空间,生成的代码是:
函数y = fooNorm b (x) =投(x,“uint32”);y = (b)总和;结束
函数的输入fooNorm (x)
是一个One hundred.
——- - - - - -One hundred.
矩阵的。
空白fooNorm (const双x[10000],双y[100]){双d;unsigned int b [10000];…}静态孔隙main_fooNorm (void){双dv [10000];双y [100];argInit_100x100_real_T (dv);fooNorm (dv, y);}
fooNorm
。这个函数main_fooNorm
声明的变量dv [10000]
和y [100]
在堆栈上,函数的输入fooNorm
。
生成的代码,把变量
当你为相同的MATLAB代码生成代码与堆栈空间不足,代码是:
空白fooNorm (const双x[10000],双y[100]){静态unsigned int b [10000];双d;…}静态孔隙main_fooNorm (void){静态双dv [10000];静态双y [100];argInit_100x100_real_T (dv);fooNorm (dv, y);}
b [10000]
,dv [10000]
,y [100]
声明为静态变量,因为它们不适合在堆栈上。
生成的可重入代码,溢出的变量
当你为相同的MATLAB代码生成可重入的代码与堆栈空间不足,所生成的代码是:
空白fooNorm (fooNormStackData * SD, const双x[10000],双y[100]){双d;…}静态孔隙main_fooNorm (void){静态双dv [10000];静态双y [100];argInit_100x100_real_T (dv);fooNorm (&fooNormStackDataGlobal, dv, y);}
fooNorm
是一个结构fooNormStackData
。在生成可重入代码,当变量从栈中泄漏,泄漏结构生成,不符合在堆栈上的变量。
结构fooNormStackData
被定义为:
typedef struct {struct {unsigned int b [10000];}f0;}fooNormStackData;