些库函数不能完全发挥作用,?C_LIB_DATA段的长度因不同应用问题而不同,其当前长度可在MAP文件中找到。
XDATASTART
XDATALEN 表明了需要以0初始化的PDATA区首址和长度,XDATASTART指明了XDATA区首址,X
DATALEN表明了需初始化的字节数。
PDATASTART
PDATALEN 表明了需以0初始化的PDATA区首址及长度,PDATASTART指明了首址,XDATALEN指
定了长度。
LBPSTACK
LBPSTACKTOP 定义了SMALL模式下创建的再入函数使用的栈区。LBPSTACK表明是否对栈指针(变
量?C_LBP)初始化,LBPSTACKTOP指明了栈顶首址。对于具有256字节内部RAM的8051系统,当存贮区作首址为0XFF的栈时,可不初始化。C51不作栈区是否满足特定应用的检查,用户必须自己进行测试。
XBPSTACK
XBPSTACKTOP 为在LARGE模式下创建的再入函数定义了栈区,XBPSTACK表明指针(变量?C_X
BP)是否初始化,XBPSTACKTOP指定了栈顶地址。当存贮区作为首址为0Xffff(在XDATA区)的栈时,可不作初始化。同上一样,C51不作栈检查,需要用户自己测试。
PBPSTACK
PBPSTACKTOP 为在COMPACT模式下创建的再入函数定义了栈区,PBPSTACK表明栈指针(变量?
C_PBP)是否初始化。PBPSTACKTOP指定了栈顶地址。当存贮区作为首址为0Xff(在PDATA区)的栈时,可不作初始化。同上一样,C51不作栈检查,需要用户自己测试。
PPAGEENABLE
PPAGE 当在COMPACT模式中用16位寻址XDATA存贮区时需要这些指令。对于使用LARGE模式
的程序,可用它提高运行速度或减小代码长度。PPAGEENABLE允许8051端口2的初始化,对端口2的寻址允许在任意XDATA页256字节变量空间的映射。这两个指令必须和L51的控制指令PDATA一起使用。PDATA指定了XDATA存贮器中PDATA区的首址。例:在STARTUP.A51中,PPAGEENABLE置为1,PPAGE置为10H。这种情况下PDATA区首址为1000H(10H页),而L51必须包含一个值在1000
和10FFH之间的控制语句:L51〈输入模块〉PDATA(1050H)。注:L51和C51都不对PPAGE/PDATA指令正确性进行检查,用户必须保证PPAGE和PDATA包含一个合适的值。
INIT.A51:
文件INIT.A51包含一个定义了“看门狗”刷新的宏。当系统包括“看门狗”以及用户变量初始化时间比“看门狗”刷新时间要长时,必须改变这个宏。这种情况下,宏WATCHCOG必须包含“看门狗”刷新的代码。
例: ;Watchdog refresh for 80515 system WATCHDOG MACRO SETB WDT SETB SWDT ENDM PUTCHAR.C
文件PUTCHAR.C包含字符输出的核心程序,该文件通过串行口输出。这种情况下考虑了XON/XOFF协议,字符LF()被转为字符串CR,LF,这在很多终端中是需要的。用户可按自己的要求改变putchar()函数。 GETKEY.C
文件GETKEY.C包含字符输入的核心程序,该文件从串行接口读入一个字符,不作数据转换,用户可根据需要修改getkey()函数。 1.17 优化程序
本节包含几个怎样提高8051程序效率的注解。
定位变量
经常访问的数据对象应放入在片内数据RAM中,这可在任一模式(COMPACT/LARGE)下用输入存贮器类型的方法实现。访问片内数据RAM要比访问外部数据存贮器快得多。片内RAM由寄存器组,位数据区栈和其它由用户用“data”类型定义的变量共享。由于片内RAM容量的限制(128~256字节,由使用的处理器决定),必须权衡利弊以解决访问效率和这些对象的数量之间的矛盾。
总是使用可能的最小数据类型
8051系列CPU都是8位机,因此,显然对具有“char”类型的对象的操作比“int”或“long”类型的对象方便得多。建议编程者只要满足要求,应尽量使用最小数据类型。 C51编译器直接支持所有的字节操作,因而如果不是运算符要求,就不作“int”类型的转换,这可用一个乘积运算来清楚说明,两个“char类型”对象的乘积与8051操作码“MUL AB”刚好相符。如果用整型量完成同样的运算,则需要调用库函数。 只要有可能,使用“unsigned”数据类型 8051系列CPU并不直接支持有符号数的运算。因而C51编译器必须产生与之相关的更多的代码以解决这个问题。如果使用无符号类型,产生的代码要少得多。 只要有可能,使用局部函数变量 编译器总是尝试在寄存器里保持局中变量。这样,将索引变量(如FOR和WHILE循环中计数变量)声明为局部变量是最好的,这个优化步骤只为局部变量执行。使用“unsigned char/int”的对象通常能获得最好的结果。 2 C51编译器控制指令 编译选项可能被控制指令激活、禁止或改变。这些指令可在命令行输入或在源文件上加入#pragma给预处理器。控制指令分为两组,即首要的和一般的,并可分为三类:源控制、目标控制、列表控制。见表2.1编译控制指令。“P/G”列表明指令是首要的或是一般的,首要指令仅出现一次,一般指令按需要可出现多次。 表2.1 编译控制指令 分 类 P/G 指 令 缩 写 默 认 值 P G G DEFINE SAVE RESTORE DF — — — — — 源 G P DISABLE [NO]EXTEND — —— — EXTEND P P P P P [NO]DEBUG [NO]OBJECT OPTIMIZE(n) SMALL COMPACT LARGE [NO]REGPARMS REGISTERBANK(n) [NO]AREGS [NO]INTVECTER OBJECTEXTEND ROM() [NO]DB [NO]OJ OT SM CP LA [NO]RP RB [NO]AR [NO]IV OE — NODEBUG OBJECT(名字.OBJ) OPTIMIZE(2) SMALL — — REGPARMS REGISTERBANK(0) AREGS INTVECTOR — ROM(LARGE) 目 标 P G G G P P P P P P [NO]LISTINCLUDE [NO]SYMBOLS [NO]PREPRINT [NO]CODE [NO]PRINT [NO]CODE PAGELENGTH(n) EJECT PAGEWIDTH(n) [NO]LC [NO]SB [NO]PP [NO]CD [NO]PR [NO]CO PL EJ PW NOLISTINCLUDE NOSYMBOLS NOPREPRINT NOCODE PRINT(名字.OBJ) CODE PAGELENGTH(69) — PAGEWIDTH(132) P P P P G P 列 表 2.1 源控制 2.1.1 DEFINE 名 字: DEFINE
相关推荐: