恭喜,你发布的帖子
发布于 2018-01-15 21:01:18
12楼
楼主实验做的是对的,可结论我看不懂。
“块调用结束临时变量不会释放,释放的是一些局部变量”???
什么是临时变量?什么是局部变量?各是什么地址类型?
1、每一个优先级都拥有属于自己的本地堆栈区(L区),所有运行在该优先级下的OB、FB、FC的Temp都属于该区域。
2、不同优先级的本地堆栈区不同,不会互相干扰。这是西门子从系统角度保证了各中断程序和主程序间的堆栈数据安全。
3、每次调用FB或FC其temp区域的本地堆栈地址由系统指定,调用结束释放(只是不再占用,并不清零)。所以FB或FC的调用可能会使用重合的本地堆栈,这也就是为什么temp不能跨周期传递的原因,于是所有需要跨周期传递的自保、边沿都不能用temp。
L 堆栈永远以地址“0”开始。
在 L 堆栈中,会为每个数据块保留相同个数的字节,作为存放每个块所拥有的静态或局部数据。
当某个块终止时,那么它的空间随之也被重新释放出来。
指针总是指向当前打开块的第一个字节。
谢谢大侠的指正,其实当时最后那句结论自己都觉得不对,只是当时没删,也幸好没删才引出老师的指正。以前错误的认为,FC中的临时变量存储区就在FC中,FB中的临时变量存储区就在FB中,看了你们提供的资料才认识清楚。
“飞天玉虎: 嗯,每一个组织块都拥有一片自己的独立的临时本地数据存储区,该组织块下调用的功能和功能块的临时变量都位于该区域。”一并谢了,一句话切中要害。原来,在OB块中调用的FC也好,FB也好,其临时变量都来自于调用块OB。
“2、不同优先级的本地堆栈区不同,不会互相干扰。”这说的应该是不同的OB块,分别有各自的临时变量存储区,那么在不同OB块里调用执行程序时,临时变量存储区各用各的,互不影响。
感谢指正,又总结了一下,如果有错,还请继续指正。谢谢
请填写推广理由:
分享
只看
楼主