Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1270618
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: C/C++

2011-03-15 18:58:35


Image     


12)会出现一个选项:Image
Xtal (Mhz):是设置你的单片机的工作的频率,默认是24.0MHZ,如果你的单片机的晶振用的是11.0592Mhz,那么在框里输入11.0592(单位是Mhz,所以带小数点).
Use On-chip ROM(0x0-0x1fff):这个选项是使用片上的Flash Rom,我们知道At89c52有8k的flash 
Rom.取决于你的应用系统,你的单片机的EA接高电平的话,请选中这个选项,如果你的单片机的EA接低电平,表示使用外部Rom,那么不要选中该选项.我们在这里选中它
Off-chip Code memory:表示你在片外接的Rom的开始地址和大小,如果你没有外接程序存储器,那么不要填任何数据.我们在这里假设使用一个片外的Rom,地址从 0x8000开始(不要填成8000,如果是8000,是10进制的数,一般填16进制的数),Size为外接Rom的大小.假设接了一块0x1000字 节的rom.最多可以外接3块Rom,如果你还用了别的地址,那么就添上.
Off-Chip Xdata Memory :那么可以填上你外接的Xdata(外部数据存储器的起始地址和大小,一般的应用是接一个62256,我们在这里特殊的指定Xdata的起始地址为0x2000,大小为0x8000;
Code Banking:是使用Code Banking技术.keil可以支持程序代码超过64k的情况,最大可以有2兆的程序代码.如果你的代码超过64k,那么就要使用Code Banking技术,以支持更多的程序空间.Code Banking是一个高级的技术,支持自动的Bank的切换,是建立一个大型系统的需要,比如你要在单片机里实现汉字字库,实现汉字输入法,都要用到该技 术.我们会在以后的文章里论述Bank技术.我们在这里不选中它.
Memory Model:用鼠标点击Memory Model的下拉箭头,会有3个选项.
Image 
Small:变量存储在内部ram里.
Compact:变量存储在外部ram里,使用页8位间接寻址
Large:变量存储在外部Ram里,使用16位间接寻址. 
我们一般使用Small来存储变量,就是说单片机优先把变量存储在内部ram里,如果内部ram不够了,才会存到外部去.Compact的方式要自己通 过程序来指定页的高位地址,编程比较复杂,如果外部ram很少,只有256个字节,那么对该256个字节的读取就比较快,用MOVX @Ri,A 或MOVX A,@Ri指令.
如果超过256字节,那么要不断地进行切换的话,就比较麻烦.Compact模式适用于比较少的外部ram的情 况.Large模式,是指变量会优先分配到外部ram里,用MOVX A,@DPTR或MOVX @DPTR,A来读取.要注意的是,3种存储方式都支持内部256字节和外部64k字节的ram.区别是变量的优先(或默认)存储在哪里的区别.除非你不 想把变量存储在内部ram,才使用后面的Compact,Large模式.因为变量存储在内部ram里,运算速度比存储在外部ram要快的多,大部分的应 用都是选择Small的模式.使  用Small的方式:也不是说变量就不可以存储在外部,一样可以存储在外部,只是你要指定,比如:
unsigned char xdata a;那么变量a就存储在外部的ram.
unsigned char a;变量存储在内部ram.


假如用Large的模式:
unsigned char xdata a;那么变量a就存储在外部的ram.
unsigned char a;变量存储在外部ram.




这就是区别,就是说这几个选项只是影响没有特别指定变量的存储空间的时候,默认存储在哪里,比如上面的变量定义unsigned char a . 


那么我们最好选择Small.
Code Rom Size:用鼠标点击下拉箭头,将有3个选项:
Image 
Small: program 2K or less ;适用于89c2051这些芯片,2051只有2k的代码空间,所以跳转地址只有2k,编译的时候会使用ACALL AJMP这些短跳转指令,而不会使用LCALL,LJMP指令.如果你的代码跳转超过2k,那么会出错. 
Compact:2k functiongs ,64k program:表示每个子函数的程序大小不超过2k,整个工程可以有64k的代码.就是说在main()里可以使用LCALL, LJMP指令,但在子程序里只会使用ACALL,AJMP指令.除非你确认你的每个子程序不会超过2k,否则不要用Compact方式.
Large:64K program:表示程序或子函数都可以大到64k.使用code bank还可以更大.通常我们都选用该方式.Code Rom Size选择Large方式速度不会比Small慢很多,所以一般没有必要选择Compact和Small的方式.我们这里选择Large方式.
Operating:点击下拉箭头有3个选项: 
Image
None:表示不使用操作系统
RTX-51 Tiny Real-Time Os:表示使用Tiny操作系统
RTX-51 Full Real-Time Os:表示使用Full操作系统
Keil c51提供了tiny系统(demo版没有tiny系统,正版软件才有),Tiny是一个多任务操作系统,使用定时器0来做任务切换.一般用 11.0592Mhz时,切换任务的速度为30毫秒.如果有10个任务同时运行,那么切换时间为300毫秒.同时不支持中断系统的任务切换.也没有优先 级.因为切换的时间太长,实时性大打折扣,多任务情况下(比如5个),轮一次就要150毫秒,150毫秒才处理一个任务,连实现键盘扫描这些事情都不行. 更不要说串口接收,外部中断等.同时切换需要大概1000个机器周期,对cpu的浪费很大,对内部ram的占用也很厉害.实际上用到多任务操作系统的情况 少之又少.关键是不适用.多任务操作系统一般适合于16位,32位的cpu,不适合8位cpu.
Keil C51 Full Real-Time OS:是比Tiny要好一些的系统,但需要用户使用外部ram.支持中断方式的多任务和任务优先级.但是keil c51里不提供该运行库,要另外购买,价格在3万人民币左右,只好望而止步. 
Keil 的多任务操作系统的思想值得学习,特别是任务切换的算法,如何切换任务和保存堆栈等,有一定的研究价值.如果熟悉了其切换的方法,可以编写更好的切换(比 如将一次切换的时间从30毫秒改为3毫秒,实用性会好一些.引入windows消息的思想,可以支持更为复杂的应用.)这些可能是一些发烧友研究的一个课 题.也有免费的UCOS ii,我没有用过,不知道好不好用. 
我们不推荐大家使用多任务操作系统.这里选择none. 




内容


1)接上一章的内容.上面我们讲到了Target栏的设置,下面要对Output栏进行设置:
Image
这一栏有很多的选项:
Select Folder for Objects:点击这个按钮可以选择编译之后的目标文件存储在哪个目录里,如果不设置的话,就是在你的工程文件的目录里.
Name of Executable:是设置生成的目标文件的名字,缺省是跟你的工程的名字是一样的.
目标文件可以生成库或者obj,hex的格式.
Create Executable:是生成OMF以及HEX文件:一般是选中Debug Information,选中Browse Information.这两个选项一般要选中,这样才有详细的调试所需要的信息,比如你要做c语言程序的调试,如果不选的话,调试时你将无法看到高级语 言写的程序.
Create Hex File:这个选项一般是要选中的.很多网友在bbs上问到,他编译之后没有生成Hex文件,这是因为这个选项没有被选中的原因.要生成Hex文件,一定 要选中该选项,如上图所示.还有人问到如何生成OMF的文件,事实上Keil在每次编译之后都生成了OMF文件,那个跟你的工程文件名一样的,但是没有带 扩展名的文件就是OMF格式的文件.例如我们这个工程的名字是test.uv2,将会生成一个OMF文件test(不带扩展名).默认是不选中的,所以要 自己做设置.
Create Library:选中时将生成lib库文件.根据你的需要是否要生成库文件,一般的应用是不生成库文件的.
After Make:有几个设置:
Beep when complete:编译完成之后发出咚的声音.
Start Debugging:马上启动调试(软件仿真或硬件仿真).根据你的需要做设置,一般是不选中.
Run User Program #1,Run User Program #2:这个选项可以设置编译完之后运行别的应用程序,比如有些用户自己编写的烧写芯片的程序(编译完便执行将hex文件写入芯片),或调用外部的仿真程序.根据自己的需要设置.
2)我们来看Listing栏的设置: 
Image
Keil C51在编译之后除了生成目标文件之外,还生成*.lst *.m51的文件.那么这两种扩展名的文件对你了解你的程序用到了那些idata ,data ,bit ,xdata,code ,ram,rom,stack等有很重要的作用.有些人就问到我如何知道我的程序需要多少的代码空间?那么在这两个文件里,会告诉你,一般按照上图进行设 置.如果你不想生成某些内容,可以不选.
选中Assembly Code还会生成汇编的代码.很多网友不知道如何用汇编来写一个long型数的乘法,那么你可以用c来写,写了之后编译,你就可以得到用汇编实现的代码. 而不必在那里苦想.有了高级的工具,我们就要它来帮助你更好的设计.就算你是写汇编的,如果你熟悉c,也会给你带来很大的帮助.比如if(){ }for;while,case等一些c语言的结构,如何用汇编来做到,那么可以自己写一段c,然后编译,你就可以得到汇编实现这些高级语言算法的结构. 这是很有用的.所以请你选中Assembly Code.对于一个高级的单片机程序员,往往既要熟悉汇编,同时也要熟悉c语言,才能更好的去编写程序.因为汇编和c都是工具,可能在某些地方用c无法实 现,但用汇编却很容易.有些地方用汇编,很繁琐,用c就很方便.在bbs上多次有人争论汇编和c的问题.我们无法说c好,还是汇编好,有时要取决于你的项 目.我们认为能够最快的实现和完成你的设计的就是好的.多数情况下,是用c语言做设计比较快.特别是代码比较多的设计,c的优势就更为明显.如果用c也不 好,用汇编也不好,那么就混合使用吧,keil c51是支持c和汇编混合编程的. 
Select Folder for Listings:选择生成的列表文件存放的目录.不做选择时使用工程文件所在的目录.
阅读(2633) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~