本帖最后由 forthlab 于 2015-10-8 16:16 编辑
使用AC32的CPU,CW6.3
程序里面有很多三角运算,都是double类型的,修改堆栈大小,2K内存1600是堆栈,不能再大了
程序都是简单的顺序运算,调用sin(),cos(),按常理一个三角公式算完会占用较多的内存,但运算结果出来后堆栈要释放,再计算下一个公式,但在单步执行的时候发现堆栈指针没有释放,占用越来越多,sp越来越小,终于昨天SP成了个位数,程序爆了!
把局部变量改为全局变量也没有效果;
修改CW的“智能游标”,调节代码大小、执行速度也没有用;
因为程序不复杂,于是将函数分为2个子程序,最大堆栈占用就只有一半了,单步执行发现,第一个子程序执行时,堆栈也是逐步侵吞,子程序执行完了,推迟子程序,堆栈被释放;在调用第二个子程序,搞定。
我现在不理解的是为何堆栈没有释放?
简单描述一下程序:
原来的程序:
fun(a,b,c)
{
double A,B,C;
A= sin(a)/cos(b);
B= sin(c)+cos(A+b);
........
C = sin(a+b)/cos(A+B);
}
这个程序很占用内存,于是分为2个子程序:
double A;
fun1(a,b,c)
{
double B,C;
A= sin(a)/cos(b);
...........
}
fun2(a,b,c)
{
double B,C;
B=sin(a)/cos(b);
........
B= sin(c)+cos(A+b);
........
C = sin(a+b)/cos(A+B);
}
这么解决问题的,好奇怪
|