导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→C51编程:请教问题[xiaotan97]

 *第7952篇: C51编程:请教问题

  
楼 主:xiaotan97 2003年1月28日10:56
 C51编程:请教问题
    向各位老师,朋友请教几个为题。我在用supper ice16仿真器进行软件编写的时候发现
几个问题,这段时间这个问题一直困扰着我,工作进度也因为这个问题而放慢。
    第1个问题是,我在进行C51编程的时候发现定义为idata 和xdata会直接影响结果的正
确性,比如说我在编写点阵液晶显示的时候需要显示汉字或是菜单项,我定义了一些数组来
存放字库,起先我把数组定义在xdata外部数据存储器,发现显示的时候屏幕显示的东西十
一些乱码,不能达到预期的目的。这个问题我在编写段码LCD显示的时候就发现了这个问
题,但是当时没有太在意。因为我用idata代替xdata就解决了。可是现在不行,应为字库的
字节数太大,而idata只有256字节空间,不能存放这么大的数据量。
    第2个问题是,我把字库定义在code外部程序存储器,可是编译的时候报错,不能调用c
ode段。我查了几本书也没有能够找到答案。
    这两个问题是我急需知道答案的。请教各位老师,朋友这是什么原因?!请大家能够给
予我帮助。
  
2楼:tm1300 2003年1月28日12:42
 参考
首先:XDATA为外部扩展的RAM区(例如6264),最多可以外扩64K,而且使用过程中必须选择
使用片内还是片外RAM区;尽管有些单片机将部分外部扩展的RAM集成到片内,但是也必须通
过特定的指令来选择外部扩展的RAM区。
其次:定义到CODE区,初始化时程序存储到ROM区,当使用时,其实是查表形式进行,类似
汇编的 MOVC 指令。
  
3楼:xiaotan97 2003年1月28日14:26
 请教
    您说的有道理。但是有一点我没有搞清楚,一般来说在进行片外或片内RAM区选择时,
如果是用Keil C51或者Franklin C51语言来编写时只需指定为idata和xdata来确定是把数据
存储在内部存储器或是外部存储器的,那么定义好后,实际上在进行操作的时候应该是直接就
可以完成的.当然,如果是用标准单片机语言来写的话是通过MOVX来选择外部数据存储器.
    同样,定义外部程序存储器器时也是同样的方法,比如说我定义我现在定义的结构数组用
于存放字库,我就把他定义在CODE区,但是我在进行编译时弹出警告信息,指明不能调用CODE
段,这让我没有搞清楚到底是怎么回事,这也可能是因为我对这个仿真器的软件设置没有正确
所造成的.请指教!
  
4楼:tm1300 2003年1月29日10:07
 参考
 你说的没有错:“如果是用Keil C51或者Franklin C51语言来编写时只需指定为
idata和xdata来确定是把数据存储在内部存储器或是外部存储器的,那么定义好后,实
际上在进行操作的时候应该是直接就可以完成的”
你注意看看,你在使用芯片的时候“ON—CHIP—RAM”有没有选择,并且如果外部地址
不连续的话,你对它的地址区有没有定义。
其次,定义在CODE区的数据,一般只能通过“读”的方式调用;而不能对CODE区进行
“写”
操作。
  
5楼:xiaotan97 2003年1月29日13:08
 有道理
  我同意您的观点,我的确没有注意“on_chip_ram”有没有选择的问题,对外部地址连
续不连续的问题也没有引起注意。感谢您的支持和帮助!
  
6楼:xiaotan97 2003年1月29日14:38
 关于code段的一点认识
    我前面提到的关于把变量或是数组等定义在code段时,弹出报错信息。我当时没有找到
原因,不过我在编译调试的过程中发现了一个现象,就是如果我把一个变量定义在code段,
但是我在程序中没有调用code任何一个变量,那么在编译的时候就会出现这个警告信息,但
如果程序中有调用定义在code段中的变量,那么即使定义在code段中还有一些变量没有在程
序中引用也不会再出现警告信息,程序能够正常编译。当然我这里仅仅指的是用SUPPER 
ICE16仿真器编译软件时有这样的一种现象,在别的仿真器有没有这种现象我不知道。
  
7楼:tm1300 2003年2月5日22:59
 补充一下
我也吃过编译器的不少苦头,尤其是编译级别,它可能把你许多程序给所谓的"优化"了,往往
害的我要去看看编译成的汇编程序是什么样的,呵呵.现在稍微有点经验了.
还有,一些定义的子程序,如果没有调用,也会警告,但是编译能通过,也可以用,这只是
系统不知道该不该把它优化掉。
  
8楼:xiaotan97 2003年2月7日08:59
 你说的很好
    您说的挺有道理的。
    说实在的我以前是搞DELPHI高级语言软件开发的,从事搞单片机嵌入式软件的设计的时
间才开始一个月,开始的时候碰到好多的问题,有时从理论上分析的结果是对的,可是实际
上在真正编译得时候出现好多的问题,一下子不知道从那入手来解决,好在有身边的老师朋
友指点和帮助,让我少走了许多弯路。仿真器以及编译器有时候是直接引起这种现象的原因
之一。其实到现在我还没有完全了解编译级别的区分,还有一点我也没有试过去看编译成的
汇编程序,我想您的这一点建议对我来说很有用。我会在以后的设计中应用这一方法的。
  
9楼:tm1300 2003年2月7日11:54
 相互提高而已,客气了
  
10楼:a12345678 2003年1月28日22:13
 可以肯定的是你的程序设计错误,其次你选用的开发装置设计不善

>>>>>>对该主题发表你的看法

本主题贴数10,分页: [第1页]


[上一篇主题]:C51编程:8051的程序超过64K怎么办?怎么调试? 

[下一篇主题]:初学者:〈给年轻工程师的十大忠告〉后话