求大神解释!keil编译,调用子函数越多,RAM占用越少
时间:10-02
整理:3721RD
点击:
如题!keil编译程序的时候,调用子函数越多,RAM占用越少!麻烦大家帮忙看看!源码有点长,而且可读性比较差,所以就不发出来了,几个子程序唯一的关系就是共用3个全局变量,都是用作for循环的,并没有影响,结果如下图:




首先,你的表述有误,不是调用的子函数越多占用的RAM越少,而是“越少未调用的子函数,占用的RAM越少”。原因很简单,如果你定义了一个子函数但却没有被调用,那么在编译的时候就会被当做相当于中断函数而分配独立的RAM。但如果调用了,Keil会对其进行优化吗,通过整合资源达到减少RAM的目的。你可以把未调用的子函数注释掉再编译看看结果。
嗯嗯,楼上说得极是,有些编译器会提醒你有未使用到的代码!
不知道KEIL经过设置会不会有这个提醒
2楼讲的确实是有道理的。
谢谢您的回答,但我测试了,结果不是这样的,我在主函数里写两个死循环,第一个死循环放一个子函数,其它的全部放在第二个死循环,这样就调用了所有子函数,实际上只执行了一个,结果和只调用一个子函数的结果是一样的,RAM占用还是很大,这又是怎么回事呢?
Keil对于在主程序中独立的程序(多处死循环)都独立分配资源,但这只是对非常明显的死循环Keil才能识别,比如While(1){}这样的死循环。如果你了解单片机的实时多任务系统如Keil自带的RTx Tiny系统去编程就知道,多任务在主函数都是用Whie(1){任务x}这样写的。如果没有使用多任务系统,Keil其实是会报个警报,提示会有代码无法执行,这样编译效果与函数没被调用是一样的。
非常感谢您的回答,我明白了!
