打印

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

[复制链接]
2997|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共用,造成中断访问和主程序访问的冲突。
知道这点,还是有很多的解决方法。

使用特权

评论回复
5
redriver|  楼主 | 2008-6-21 22:13 | 只看该作者

没搞反啊

 瞎扯嘛 

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

----
这位大侠可以理解错了我的意思。其他平台的代码到了51上,自然差不多重写,c51的对ANSI C扩展;但是精心经过优化的C51代码,到了其他平台,差不多还是重写,data、xdata。。。诸多关键字。
哪里说是反了呢?
 

使用特权

评论回复
6
redriver|  楼主 | 2008-6-21 22:19 | 只看该作者

回4楼的大侠

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

使用特权

评论回复
7
redriver|  楼主 | 2008-6-25 21:30 | 只看该作者

没人发表下意见?

没人发表下意见?
记得dallas有个芯片支持硬件栈,在sfr中扩展了一个2bit的sfr,将栈增加到
10bit,并且可以将栈放到xdata空间。

使用特权

评论回复
8
ayb_ice| | 2008-6-26 10:10 | 只看该作者

移植XDATA等问题

一个宏定义就搞定了,
#define xdata // 其它一样的
其实感觉LZ根本不太了解KEIL...

使用特权

评论回复
9
redriver|  楼主 | 2008-6-26 21:38 | 只看该作者

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

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

其实感觉LZ根本不太了解KEIL...
----
楼上何以见得?呵呵,我是刚学keil,只写hello,world。

使用特权

评论回复
10
redriver|  楼主 | 2008-6-26 21:49 | 只看该作者

今天搞了个程序对比了下

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

31

帖子

0

粉丝