首页 » 智能 » Keil C51具体设置Target选项页具体设置_变量_文件

Keil C51具体设置Target选项页具体设置_变量_文件

南宫静远 2025-01-10 08:09:40 0

扫一扫用手机浏览

文章目录 [+]

一.target名变动

打开Keil后,左侧Project Workspace中的target可改,方法:右击Target——Manage Compnents——双击待修正项即可,若要添加,利用对话框内对应工具栏。

Keil C51具体设置Target选项页具体设置_变量_文件 Keil C51具体设置Target选项页具体设置_变量_文件 智能

二.optionfor target 设置之TARGET项

Keil C51具体设置Target选项页具体设置_变量_文件 Keil C51具体设置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.

 这便是差异,便是说这几个选项只是影响没有特殊指定变量的存储空间的时候,默认存储在哪里,比如上面的变量定义unsignedchar a .

2. CODE ROM SIZE

Small: program 2K or less ;适用于89c2051这些芯片,2051只有2k的代码空间,以是跳转地址只有2k,编译的时候会利用ACALLAJMP这些短跳转指令,而不会利用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,那么就要利用CodeBanking技能,以支持更多的程序空间.CodeBanking是一个高等的技能,支持自动的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 userprogram2:根据须要设置编译之后的运用程序,比如自己编写的烧写芯片的程序,或调用外部仿真程序。

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 forTarget '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处了

2、赋初值的变量定位:

要将某变量定位在一绝对位置且要赋初值,此时用 _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、若有多个变量或函数要进行绝对地址定位,则应按地址从低到高的顺序排列。

标签:

相关文章