打印

请教keil 高手和版主

[复制链接]
2021|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Explor|  楼主 | 2007-6-13 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在keil中怎么设置可以是内存动态分配,
我写了一段小程序,发现函数声明后,里面的局部变量就已经开辟空间了,
而不是在调用的时候开辟的,查看汇编代码也是对调用的函数直接跳转,没有做入栈处理。
下面程序使用的是LARGE模式编译,改用SMALL模式也是一样的,其他设置采用默认设置。
问:怎么改?????

相关帖子

沙发
Explor|  楼主 | 2007-6-13 16:03 | 只看该作者

附汇编部分

汇编部分:

使用特权

评论回复
板凳
lailiu| | 2007-6-13 17:11 | 只看该作者

重入函数

  在KEIL中都是静态指定变量 不能重入
  
  或者加 reentrant  修饰

使用特权

评论回复
地板
孤独泪| | 2007-6-13 20:40 | 只看该作者

你程序产生的结果有问题

在keil中不加入任何变量只对main函数编译产生结果是data=9; xdata=0;
LZ的代码编译过后应该是data=10;xdata=0; 选择small va... data
data=9;xdata=1; 选择large va... xdata

在选择small模式,变量如不指定是外部变量,会自动编译成内部变量。局部变量在调用函数之后声明,结束函数自动取消。与ANSI C标准一样。
楼主的现象我没有办法解释

使用特权

评论回复
5
mohanwei| | 2007-6-13 21:21 | 只看该作者

优化级别……

使用特权

评论回复
6
turmary| | 2007-6-14 04:39 | 只看该作者

三楼正确

不加 reentrant变量静态分配的.
加了reentrant 以后,IDATA中还有一个虚拟栈指针

总之,使用ANSI C那种硬件堆栈分配动态变量是不可能的.

使用特权

评论回复
7
Explor|  楼主 | 2007-6-14 10:06 | 只看该作者

回复

那一段较大的程序,用到的变量较多,占用太多内存的话,有什么好办法解决,只有加reentrance ??

使用特权

评论回复
8
ayb_ice| | 2007-6-14 10:42 | 只看该作者

随便说说

7楼
“那一段较大的程序,用到的变量较多,占用太多内存的话,有什么好办法解决,只有加reentrance ??”

内存够不够与reentrant有什么关系。。。

使用特权

评论回复
9
lws| | 2007-6-14 11:12 | 只看该作者

用楼主的例子试了一下,结果如下

MEMORY MODEL: SMALL


INPUT MODULES INCLUDED:
  .Text1.obj (TEXT1)
  C:KEILC51LIBC51S.LIB (?C_STARTUP)


LINK MAP OF MODULE:  TT (TEXT1)


            TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            -----------------------------------------------------

            * * * * * * *   D A T A   M E M O R Y   * * * * * * *
            REG     0000H     0008H     ABSOLUTE     "REG BANK 0"
            DATA    0008H     0001H     UNIT         ?DT?A1?TEXT1
            DATA    0009H     0001H     UNIT         _DATA_GROUP_
            IDATA   000AH     0001H     UNIT         ?STACK

            * * * * * * *   C O D E   M E M O R Y   * * * * * * *
            CODE    0000H     0003H     ABSOLUTE     
            CODE    0003H     000CH     UNIT         ?C_C51STARTUP
            CODE    000FH     0002H     INBLOCK      ?PR?MAIN?TEXT1
            CODE    0011H     0001H     INBLOCK      ?PR?A?TEXT1
            CODE    0012H     0001H     INBLOCK      ?PR?A1?TEXT1
“那一段较大的程序,用到的变量较多,占用太多内存的话,有什么好办法解决,只有加reentrance ??”
个人认为可以通过优化程序结构,尽量减少程序嵌套 ,多用局部变量,提高内存的利用率。我觉得内存够不够与reentrant没什么关系。


使用特权

评论回复
10
gyt| | 2007-6-14 11:22 | 只看该作者

3楼对

使用特权

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

本版积分规则

51

主题

107

帖子

0

粉丝