IAR的仿真栈比Keil的仿真栈效率孰高?

[复制链接]
3892|9
 楼主| redriver 发表于 2008-6-20 20:09 | 显示全部楼层 |阅读模式
Keil的Overlay是个漂亮的魔鬼,在工程不大的情形下,用用感觉不错,代码量挺少;但是工程一大,Overlay的弊端就显露无遗,每个函数都是不可重入——由于在同一调用树上的两个叶子函数,其局部变量是放在同一个区域,相当于因次这些函数都有一个隐式的全局变量。Overlay彻底颠覆了C栈的概念,使C代码不可移植,在51上辛苦写的代码到了其他平台,差不多就是要重写了。

用了Keil的仿真栈,总算用会了栈,局部变量终于在栈里了,函数终于可以递归了....但是效率低了,代码量打了。


问下各位使用过IAR仿真栈的大侠,IAR的仿真栈如何?代码量和速度。
Swd21ic 发表于 2008-6-20 23:54 | 显示全部楼层

学习~

什么叫仿真栈?..就是RAM堆栈阿.把SP设好就行了.。
ayb_ice 发表于 2008-6-21 09:12 | 显示全部楼层

瞎扯嘛

原话"在51上辛苦写的代码到了其他平台,差不多就是要重写了。"
你刚好搞反了,仔细想想吧...
农民讲习所 发表于 2008-6-21 09:58 | 显示全部楼层

同意LS

反了
Overlay的毛病就是把复用局部变量用Datagroup共用,造成中断访问和主程序访问的冲突。
知道这点,还是有很多的解决方法。
 楼主| redriver 发表于 2008-6-21 22:13 | 显示全部楼层

没搞反啊

 瞎扯嘛 

原话"在51上辛苦写的代码到了其他平台,差不多就是要重写了。"
你刚好搞反了,仔细想想吧... 

----
这位大侠可以理解错了我的意思。其他平台的代码到了51上,自然差不多重写,c51的对ANSI C扩展;但是精心经过优化的C51代码,到了其他平台,差不多还是重写,data、xdata。。。诸多关键字。
哪里说是反了呢?
 
 楼主| redriver 发表于 2008-6-21 22:19 | 显示全部楼层

回4楼的大侠

Overlay确实有一些解决方法,比如自己手工指定,或者对重入代码使用仿真栈指定(reentrant)等。
但是Keil C的Overlay就是双刃剑,它可以给你节省代码量,RAM使用量;但在用的同时,你的代码就不是重入了。
一边情形下,这个不会有什么问题。但是涉及代码移植,或者在51里做一部分固化代码,做成API,然客户使用。这时就痛苦了。
 楼主| redriver 发表于 2008-6-25 21:30 | 显示全部楼层

没人发表下意见?

没人发表下意见?
记得dallas有个芯片支持硬件栈,在sfr中扩展了一个2bit的sfr,将栈增加到
10bit,并且可以将栈放到xdata空间。
ayb_ice 发表于 2008-6-26 10:10 | 显示全部楼层

移植XDATA等问题

一个宏定义就搞定了,
#define xdata // 其它一样的
其实感觉LZ根本不太了解KEIL...
 楼主| redriver 发表于 2008-6-26 21:38 | 显示全部楼层

源代码里那么多宏定义看着不怎么舒服

一个宏定义就搞定了,
#define xdata // 其它一样的 
--------
源代码里那么多宏定义看着不怎么舒服。

其实感觉LZ根本不太了解KEIL...
----
楼上何以见得?呵呵,我是刚学keil,只写hello,world。
 楼主| redriver 发表于 2008-6-26 21:49 | 显示全部楼层

今天搞了个程序对比了下

今天搞了个程序对比了下,Keil里使用了Xdata仿真栈,局部变都放栈了,寄存器Rn没有使用;IAR的好些,局部变量部分在寄存器Rn里。一般编译器对局部变来原则一般是先寄存器、再栈。
另外看了下C51L.lib里关于Xdata栈操作的几个函数,?C?ADDXBP,?C?XBPOFF,貌似也可以定制栈帧增加函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

31

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部