标签存档: KeilC

为什么KeilC51下char型指针是3个字节

今天看到有位网友提问:


单片机中的sizeof的问题
是用KEILC51,单片机型号是AT89S52如下程序:char i,k,*p;i=6  ; p=&i; k=sizeof p;DEBUG观察K的值,是0x03请问这是为什么?32位机指针大小是4,那么8位的单片机就应该是1啊”

    在看到这个问题时我也不知道KeilC51下char型指针的长度到底是多少,但肯定不是1。因为如果是1,那寻址空间就只有256,而51单片机的外部数据存储器是可以扩展到地址0xFFFF的。所以,指针变量的长度至少是2字节。另外,这里还要注意,在一个系统中,指针变量的长度跟具体的变量类型是无关的。那么,在KeilC51中指针变量的长度到底是多少呢?是不是像网友说的3个字节呢?

继续阅读 »

KeilC在debug时查看RAM内容的方法

      在51单片机编程的过程中,在debug模式下怎样查看RAM的内容呢?在一般的IDE中,Memory窗口中就可以看到RAM空间的内容。但是在keil 51 中,在Memory窗口中输入址值,我们看到的是程序代码区的内容。
      由于51采用的是哈佛结构,程序存储和数据存储分开。要查看各种内存区域的内容,只要在Address框内输入“字母:地址”即可显示相应的内存值。其中字母可以是C、D、I、X,分别代表的意义是:

继续阅读 »

Keil C调试时积累的一些经验

Keil uVision 的中文字体设置问题
相信很多人碰到uVision编辑中文字体错位的问题。下面给出一个解决方案:
Edit => Configuration => Colors & Fonts
选择需要修改字体的项目, 点击Font选择框,在Font对话框里面选择Font: Fixedsys
Size: 10 (此处很重要)
确定后回到源代码,输入汉字,OK,汉字显示问题解决了
BTW: 汉字在注释,或者字符串中才能正确显示,这是uVision的一个限制。
1、由于Keil C对中文支持不太好,因而会出现显示的光标与光标实际所在不一致的现象,这会对修改中文注释造成影响。在Windows2000下面,我们可以把字体设置为Courier,这样就可以显示正常。
2、当使用有片外内存的MCU(如W77E58,它有1K片外内存)的时候,肯定要设置标志位,并且编译方式要选择大模式,否则会出错。
3、当使用Keil C跟踪程序运行状态的时候,要把引起Warning的语句屏蔽,否则有可能跟踪语句的时候会出错。
4、在调用数组的时候,Keil C是首先把数组Load进内存。如果要在C中使用长数组的时候,我们可以使用code关键字,这样就实现了汇编的DB的功能,Keil C是不会把标志code的数组Load入内存的,它会直接读取Rom。
5、当编程涉及到有关通信,时序是很重要的。拉高管脚的执行速度远远比检查管脚电平的要快。
6、在等待管脚电平变化的时候,我们需要设置好超时处理,否则程序就会因为一个没有预计的错误而死锁。
7、能用C语言实现的地方,尽量不要用汇编,尤其在算法的实现,用汇编是晦涩难懂。
8、程序的几个参数数组所占篇幅很大,其中液晶背景数组最长,有四千个Byte,因而把那些初始化数组都放在另外一个C文件,在主文件使用使用关键字extern定义,这样就不会对主文件的编写造成干扰。
9、所有函数之间的相关性越低越有利于以后功能的扩展。
10、6.20版在编译带code关键字的数组时,编译通过但是单片机运行结果是错误的,改用6.14版后正常。

KeilC编译的hex文件的实际大小

<p>我发现我用KeilC编译处理的hex文件居然有11K,但是烧到AT89S52里面是可以运行的,奇怪。然后我查看了KeilC的Output Window中的信息 Program Size: data=206.5 xdata=0 code=3755,这显然不会有11K啊。</p>
<p>上21IC上搜了下,呵呵明白了。有人是这样解释的:<br />
&ldquo;HEX是用ASCII码记录的,里面还有附加格式,楼主需要Google InterHEX文件格式,里面可以看到地址。最简单的方法:用编程器(例如SuperPro之类)的软件打开HEX文件看下就知道了。&rdquo;</p>
<p>然后我用AVR_fighter.exe一看果然是这样,呵呵。<br />
&nbsp;</p>

KeilC 文件夹命名导致的莫名奇妙的问题

今天发现一个问题,使用KeilC uVision2时,如果文件夹的命名中含有. 则会导致编译出现问题,例如文件夹命名为“测试2010.05.19”,那么编译的时候就会出问题,但是我在公司里使用的时候没有问题。后来我发现在KeilC uVision3中是可以这样命名的,但是在KeilC uVision2中是不可以的。