论坛风格切换切换到宽版
  • 3749阅读
  • 6回复

关于Keil C 的Small 和Compact 模式请教 [复制链接]

上一主题 下一主题
离线BD0AAI
 
发帖
3050
只看楼主 倒序阅读 0楼 发表于: 2007-10-08
国庆几天一直关在家里写程序,遇到一个问题至今没有解决请高人指教:

c程序在small 模式编译运行一切正常, 但是一旦改成compact 模式 (pdata)后,从24c512读出的数据送到带字库的12864显示就会混乱不堪,(但西文还是正常的,汉字变成其他莫名奇妙的汉字),没有仿真器,不太好确定问题在哪,而且发现遇到sprintf 函数程序就会停止,请问高手我该如何解决?

我现在的办法是尽量把所有的变量都放在24c512里,几乎不用全局变量,尽可能使用small模式写完程序,但是程序刚写了60-70%的样子,(代码8k多了),就只剩10多个字节的ram可用了,所以请高手速速帮忙,谢谢
离线ljchip
发帖
459
只看该作者 1楼 发表于: 2007-10-09
检查你的指令
离线BD0AAI
发帖
3050
只看该作者 2楼 发表于: 2007-10-10
查不出来, 但现在基本解决, 所有的变量都放在24c512里,全局变量就用了17个字节,好在读的多, 写的少,每次运算变量只需写一次,用fm的估计30年没问题。就是速度有些慢。
2000多行,编译后19k的code,花了4天时间(每天只睡3小时),愣是用小模式搞定了,真tmd累,要是能用中模式,黄金周本该更美好的。
离线BG1JLG
发帖
62
只看该作者 3楼 发表于: 2007-10-11
向你致敬!我也正在学习呢.
佩服佩服
离线oxalis
发帖
958
只看该作者 4楼 发表于: 2007-10-12
存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种:

1. small模式
所有缺省变量参数均装入内部ram,优点是访问速度快,缺点是空间有限,只适用于小程序。

2. compact模式
所有缺省变量均位于外部ram区的一页(256bytes),具体哪一页可由p2口指定,在startup.a51文件中说明,也可用pdata指定,优点是空间较small为宽裕速度较small慢,较large要快,是一种中间状态。
离线oxalis
发帖
958
只看该作者 5楼 发表于: 2007-10-12
存储模式和代码效率

存储模式决定了缺省变量的存储空间,而访问各空间变量的汇编代码的繁简程度决定了代码率的高低。

例如:一个整形变量i,如放于内存18h、19h空间,则++i的操作编译成四条语句:

inc 0x19

mov a,0x19

jnz 0x272d

inc 0x18

0x272d:

而如果放于外存空间0000h、0001h则++i的操作编译成九条语句:

mov dptr,0001

movx a,@ dptr

inc a

movx @ dptr,a

jnz #5

mov optr,#0000

movx a,@dptr

inc a

movx @ dptr,a

就汇编之后的语句而言,对外部存储器的操作较内部存储器操作代码率要低得多,生成的语句为内存的两倍以上,而程序中有大量的这种操作,可见存储模式对代码率的响了。

因此程序设计的原则是

1、存储模式从small-compact-large依次选择,实在是变量太多,才选large模式。

2、即使选择了large模式,对一些常用的局部的或者可放于内存中的变量,最好放于内存中,以尽量提高程序的代码率。
离线BD0AAI
发帖
3050
只看该作者 6楼 发表于: 2007-10-13
谢谢, 道理我明白, 可就是small模式下正常的程序, 到了compact里就出错