Keil C51 详细设置
一.target名更改
打开Keil后,左侧Project Workspace中的target可改,方法:右击Target——Manage Compnents——双击待修改项即可,若要添加,使用对话框内对应工具栏。
二.option for target 设置之TARGET项
1 MEMARY MODEL
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 .
2. CODE ROM SIZE
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方式.
3. OPERATING NONE:不适用操作系统 RTX51-TINY:使用TINY操作系统 RTX-FULL:使用FULL操作系统
Keil C51 提供了Tiny多任务操作系统,使用定时器0来做任务切换,效率很低,无实用价值。Full需要用户使用外部RAM,且需要单独购买运行库,不能使用,默认选NONE。
4. 存储器选择 1. Use On-chip ROM(0x0-0x1fff)
这个选项是使用片上的Flash Rom,我们知道At89c52有8k的flash Rom.取决于你的应用系统,你的单片机的EA接高电平的话,请选中这个选项,如果你的单片机的EA接低电平,表示使用外部Rom,那么不要选中该选项.
2. Off-chip Code memory
表示你在片外接的Rom的开始地址和大小,如果你没有外接程序存储器,那么不要填任何数据.我们在这里假设使用一个片外的Rom,地址从0x8000开始(不要填成8000,如果是8000,是10进制的数,一般填16进制的数),Size为外接Rom的大小.假设接了一块0x1000字节的rom.最多可以外接3块Rom,如果你还用了别的地址,那么就添上.
3. Off-Chip Xdata Memory
那么可以填上你外接的Xdata(外部数据存储器的起始地址和大小,一般的应用是接一个62256,我们在这里特殊的指定Xdata的起始地址为0x2000,大小为0x8000;
5. Code Banking
使用Code Banking技术.keil可以支持程序代码超过64k的情况,最大可以有2兆的程序代码.如果你的代码超过64k,那么就要使用Code Banking技术,以支持更多的程序空间.Code Banking是一个高级的技术,支持自动的Bank的切换,是建立一个大型系统的需要,比如你要在单片机里实现汉字字库,实现汉字输入法,都要用到该技术.我们会在以后的文章里论述Bank技术.我们在这里不选中它.
二.option for target 设置之output项
select folder for object:选择编译之后的目标文件所存放的目录,默认存放在工程文件夹中。
name of executable:设置生成的目标文件的名字,默认是工程名。
creat executable:生成OMF和HEX文件,OMF文件名同工程文件名但没有扩展名。
creat hex file:选中该项编译后生成可以少些的HEX文件。
creat library:生成lib库文件,默认不选。
after make :1.beep when complete:编译完成后提示声响
2.start debugging:编译完成后马上启动调试(软件仿真或硬件仿真),默认不选中
3.run user program1,run user program2:根据需要设置编译之后的应用程序,比如自己编写的烧写芯片的程序,或调用外部仿真程序。
3.listing
select folder for listings:选择列表文件存放的目录,默认为工程文件所在的目录。
*.lst,*.m51文件对了解程序用到了哪些idata、data、bit、xdata、code、RAM、ROM、Stack等有很重要的作用。
Assembly code生产汇编的代码,根据需要决定是否选择。
4.c51
用于对Keil的C51编译器编译过程进行控制,其中比较常用的是“code optimization”组,该组中level是优化等级,C51在对源程序进行编译时可以对代码多至9级优化,默认使用8级,一般不必修改。如果在编译中出现一些问题可以降低优化级别试一试。
emphasis是选择编译优先方式,第一项是代码量优化(最终生成的代码量小),第二项是速度优先(最终生成的代码速度快),第三项是默认的,是速度优先,可根据需要更改。
5.BL51 locat
使用KeilC51软件,可以很方便地将代码或者数据绝对定位到某个地址。
1、代码定位
方法1:使用伪指令CSEG。比如要将MyFunc1定位到代码区C:0x1000,则新建一个A51文件,添加以下内容:
PUBLIC MYFUNC1 CSEG AT 1000H MYFUNC1: ;其它代码 RET
在其它源文件中,就可以调用MyFunc()函数了。需要注意的是,编译器不检测传递参数的数目,仅检测函数是否有返回值。
方法2:使用BL51 Locate选项。比如在main.c中定义了一个MyFunc2函数,并且要将该函数定位到代码区C:0x2000,则从菜单中选择Project->Options for Target 'Target1',在弹出的对话框中选择BL51 Locate页,在下面的code栏中写上?PR?MYFUNC2?MAIN(0x2000)即可。如果想定位多个函数,也可以使用*通配符。
2、变量定位
只有全局变量可以绝对定位,局部变量无法实现绝对定位。
方法1:使用_at_关键字。声明一个全局变量unsigned char data MyBuf1[8] _at_ 0x20;
方法2:使用BL51 Locate选项。比如将main.c中定义的所有data型的全局变量定位到数据区D:0x28开始的空间,则从菜单中选择Project->Options for Target 'Target1',在弹出的对话框中选择BL51 Locate页,在下面的data栏中写上?DT?MAIN(0x28)即可。如果是idata,则使用?ID?MAIN(0x28),如果是xdata,则使用?XD?MAIN(0x28),如果是pdata,则使用?PD?MAIN(0x28)
3、堆栈定位
在STARTUP.A51文件中定义了堆栈区?STACK,其起始地址同样可以在BL51 Locate页中设置,在Stack栏写上?STACK(0x80)
4、函数定位
假如要把C源文件 tools.c 中的函数
int BIN2HEX(int xx) { ... }
放在CODE MEMORY的0x1000处,先编译该工程,然后打开该工程的M51文件,在
* * * C O D E M E M O R Y * * * ;行下找出要定位的函数的名称,应该形如: CODE xxxxH xxxxH UNIT ?PR?_BCD2HEX?TOOLS
然后在:Project->Options for Target ...->BL51 Locate:Code中填写如下内容:?PR?_BCD2HEX?TOOLS(0x1000)再次Build,在M51中会发现该函数已放在CODE MEMORY的0x1000处了
5、赋初值的变量定位:
要将某变量定位在一绝对位置且要赋初值,此时用 _at_ 不能完成,则如下操作:
在工程中建立一个新的文件,如InitVars.c,在其中对要处理的变量赋初值(假设是code变量):
char code myVer = {"COPYRIGHT 2001-11"};
然后将该文件加入工程,编译,打开M51文件,若定义的是code型,则在
* * * C O D E M E M O R Y * * * ;下可找到: CODE xxxxH xxxxH UNIT ?CO?INITVARS
然后在:Project->Options for Target ...->BL51 Locate:Code中填入:?CO?INITVARS(0x200),再次编译即可。
相应地,如为xdata变量,则InitVars.c中写:
char xdata myVer = {"COPYRIGHT 2001-11"};
然后将该文件加入工程,编译,打开M51文件,在
* * * X D A T A M E M O R Y * * * ;下可找到: XDATA xxxxH xxxxH UNIT ?XD?INITVARS
然后在:Project->Options for Target ...->BL51 Locate:Xdata中填入:?XD?INITVARS(0x200),再次编译即可。相应地,若定义的是data/idata等变量,则相应处理即可。
3、若有多个变量或函数要进行绝对地址定位,则应按地址从低到高的顺序排列。
====
http://zc20031999.blog.163.com/blog/static/7202622420109186285473/
Keil C51 详细设置的更多相关文章
- KEIL C51代码优化详细分析
阅读了<单片机与嵌入式系统应用>2005年第10期杂志<经验交流>栏目的一篇文章<Keil C51对同一端口的连续读取方法>(原文)后,笔者认为该文并未就此问题进行 ...
- Keil C51总线外设操作问题的深入分析
阅读了<单片机与嵌入式系统应用>2005年第10期杂志<经验交流>栏目的一篇文章<Keil C51对同一端口的连续读取方法>(原文)后,笔者认为该文并未就此问题进行 ...
- Keil C51编译及连接技术
主要介绍Keil C51的预处理方法如宏定义.常用的预处理指令及文件包含指令,C51编译库的选择及代码优化原理,C51与汇编混合编程的方法与实现以及超过64KB空间的地址分页方法的C51实现. 教学目 ...
- Keil C51中变量的使用
引言 8051内核单片机是一种通用单片机,在国内占有较大的市场份额.在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功.由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用 ...
- 关于Keil C51中using关键字的使用心得
刚才看到一位很牛的师兄写的一篇日志中提到了Keil C51中using这个关键字的用法,粗心的我本来一直都没有留意它是用来干嘛的(因为我一般看见它都是在中断服务函数的定义开头处,好像没有了它也可以中断 ...
- [51单片机] Keil C51中变量的使用方法详解
引言 8051内核单片机是一种通用单片机,在国内占有较大的市场份额.在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功.由于51内核单片机的存储结构的特殊性,Keil C51中变量 ...
- keil c51笔记
第一章 Keil C51开发系统基本知识 第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性. ...
- Keil C51汉字显示的bug问题
一.缘起 这两天改进MCU的液晶显示方法,采用“即编即显”的思路,编写了一个可以直接显示字符串的程序.如程序调用disstr("我是你老爸");液晶屏上就会显示“我是你老爸”. 二 ...
- KEIL、uVision、RealView、MDK、KEIL C51区别比较
KEIL uVision,KEIL MDK,KEIL For ARM,RealView MDK,KEIL C51,KEIL C166,KEIL C251 从接触MCS-51单片机开始,我们就知道有一个 ...
随机推荐
- 关于bat文件语法
@echo offecho 当前盘符:%~d0echo 当前盘符和路径:%~dp0echo 当前批处理全路径:%~f0echo 当前盘符和路径的短文件名格式:%~sdp0echo 当前CMD默认目录: ...
- cf437C The Child and Toy
C. The Child and Toy time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Exchange Server 2010/2013架构改变
Exchange Server 2010架构 Exchange Server 2013架构
- Oracle11gRAC安装
安装Oracle RAC 一.硬件环境 ①用虚拟机搭建两台机器,操作系统都为: [root@node1 ~]# cat /etc/issue Red Hat Enterprise Linux Serv ...
- poj 1486 Sorting Slides(二分图匹配的查找应用)
Description Professor Clumsey is going to give an important talk this afternoon. Unfortunately, he i ...
- Excel函数大全
我们在使用Excel制作表格整理数据的时候,经常要用到它的函数功能来自己主动统计处理表格中的数据.这里整理了Excel中使用频率最高的函数的功能.用法,以及这些函数在实际应用中的实例剖析,并配有具体的 ...
- WebSphere性能优化的几个方法
1.更改http server的配置文件参数KeepAlive. 原因:这个值说明是否保持客户与HTTP SERVER的连接,如果设置为ON,则请求数到达MaxKeepAliveRequest ...
- oracle数据库常用查询一
oracle数据库常用查询一 sqlplus / as sysdba; 或sqlplus sys/密码 as sysdba;两者都是以sys登录.conn scott/tiger@orcl; conn ...
- CentOS CVS安装使用
CentOS CVS安装使用 一.CVS简介 CVS(Concurrent Versions System)版本控制系统:是一种GNU软件包,CVS是一个C/S系统,主要用于在多人开发环境下的源码 ...
- 【转】iOS开发24:使用SQLite3存储和读取数据
转自:http://my.oschina.net/plumsoft/blog/57626 SQLite3是嵌入在iOS中的关系型数据库,对于存储大规模的数据很有效.SQLite3使得不必将每个对象都加 ...