|
不添加的话 就默认用默认的安装路径下面的库 加了的话 就用你添加的。 你可以稍微改动点试试 比如 内存清零部分 让只是清除部分内存 |
| 你管他干啥呢 选择OK就是了 重点是如何编程实现自己的设计目标, |
|
清理RAM.设置堆栈等.即执行完start.a51后跳转到.c文件的函数. ,在C中定义的那些变量和数组的初始化就在startup.a51中进,如果你在定义全局变量时带有数值,如unsigned char data xxx="100";,那 中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。 startup.a51==变量的初始化)。这些初始化完毕后,还会SP指针。对非,如堆栈区,将不会有赋值或清零动作。 有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,比如掉电保护的时候想保存一些变量, 但改startup.a51来实现,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低0xff处就可实现。为什么还要去改? 可以这么说:任何时候都可以不需startup.a51,如果你明白它的特性。 |
|
当在kiel C中新建项目时,会问: Copy standard 8051 Starup Code to Project Forder and add file to Project? 翻译为:复制8051启动代码到项目并和添加文件到项目? 其实无论您选是还是否,您的代码中都将包含该文件。 该文件的作用是 初始化 内外部 RAM使其清零,另外还初始化SP等。 如果上述提示框您选否,对哪些RAM清零将采用默认的方式。 如果您想改变RAM清零区域(假如希望复位时某些RAM不被清零时会很有用。),您可以选是,这样该文件的一个副本将添加到您的项目,您可以根据需要改写此文件。 其他SP,SAMLL/COMPACT、LARGE模式的重入函数的堆栈和指针的初始化等和RAM的道理是一样的。 关于51单片机启动文件STARTUP.A51的详细说明 ;STARTUP.A51:用户上电初始化程序 ;------------------------------------------------------------------------------ ; ; 用户定义需上电初始化的内存空间 ; ; 使用以下EQU命令可定义在CPU复位时需用0进行初始化的内存空间 ; ; ;IDATA 存储器的空间的绝对起始地址总是0. IDATALENEQU 80H ; 需用0进行初始化的IDATA存储器空间的字节数 ; XDATASTARTEQU 0H ; XDATA存储器空间的绝对起始地址 XDATALENEQU 0H ; 需用0进行初始化的XDATA存储器的空间字节数. ; PDATASTARTEQU 0H ; PDATA存储器的空间的绝对起始地址 PDATALENEQU 0H ; 需用0进行初始化的PDATA存储器的空间字节数. ; ; 注意: IDATA 存储器的空间在物理上包括了8051单片机的DATA和BIT存储器空间. ; 听说至少要保证与C51编译器运行库有关的存储器的空间进行0初始化不知是否 ;------------------------------------------------------------------------------ ; ; 再入函数模拟初始化 ; ; 以下用EQU指令定义了再入函数模拟堆栈指针的初始化 ; ; 使用SMALL存储器模式时再入函数的堆栈空间. IBPSTACKEQU 0 ; 使用SMALL存储器模式再入函数时将其设置成1. IBPSTACKTOPEQU 0FFH+1 ; 将堆栈顶设置为最高地址+1. ; ; 使用LARGE存储器模式时再入函数的堆栈空间. XBPSTACKEQU 0 ; 使用LARGE存储器模式再入函数时将其设置成1. XBPSTACKTOPEQU 0FFFFH+1; 将堆栈顶设置为最高地址+1. ; ; 使用COMPACT存储器模式时再入函数的堆栈空间. PBPSTACKEQU 0 ; 使用COMPACT存储器模式再入函数时将其设置成1. PBPSTACKTOPEQU 0FFFFH+1; 将堆栈顶设置为最高地址+1. ; ;------------------------------------------------------------------------------ ; ; 使用COMPACT存储器模式时64K字节XDATA存储器空间的分页定义 ; ; 以下用EQU指令定义PDATA类型变量在XDATA存储器空间的页地址 ; 使用EQU指令定义PFAGE时必须与L51连接定位器PDATA指令的控制参数一致 ; PPAGEENABLEEQU 0 ; 使用PDATA类型变量时将其设置成1. PPAGEEQU 0 ; 定义页号. ; ;------------------------------------------------------------------------------ NAME?C_STARTUP ; 模块名为?C_STAUTUP ?C_C51STARTUPSEGMENT CODE ; 代码 ?STACKSEGMENT IDATA ; 堆栈 RSEG?STACK ; 堆栈 DS 1 EXTRNCODE (?C_START) ; 程序开始地址 PUBLIC?C_STARTUP CSEGAT 0x8000 ; 定义用户程序的起始地址,用MON51仿真器时可能有用 ?C_STARTUP:LJMP STARTUP1 RSEG?C_C51STARTUP STARTUP1: ; ; 初始化串口 MOVSCON,#40H MOVTMOD,#20H MOVTH1,#0fdH SETBTR1 CLRTI ; 单片机上电IDATA内存清零如果不需要上电清零IDATA可以注销IF到IFEDN之间的话句 ; 或者修改IDTALEN的长度为了具有掉电保护功能不知IDTALEN多长为好 IFIDATALEN <> 0 MOVR0,#IDATALEN - 1 CLR A IDATALOOP:MOV @R0,A DJNZR0,IDATALOOP ENDIF ; ; 单片机上电XDATA内存清零如果不需要上电清零XDATA可以注销IF到IFEDN之间的话句 ; 或者修改XDATALEN的长度 IFXDATALEN <> 0 MOVDPTR,#XDATASTART MOVR7,#LOW (XDATALEN) IF(LOW (XDATALEN)) <> 0 MOVR6,#(HIGH (XDATALEN)) +1 ELSE MOVR6,#HIGH (XDATALEN) ENDIF CLR A XDATALOOP:MOVX @DPTR,A INCDPTR DJNZR7,XDATALOOP DJNZR6,XDATALOOP ENDIF ; ; 送PDATA存储器页面高位地址 IFPPAGEENABLE <> 0 MOVP2,#PPAGE ENDIF ; ; 单片机上电PDATA内存清零如果不需要上电清零XDATA可以注销IF到IFEDN之间的话句 ; 或者修改PDATALEN的长度 IFPDATALEN <> 0 MOVR0,#PDATASTART MOVR7,#LOW (PDATALEN) CLR A PDATALOOP:MOVX @R0,A INCR0 DJNZR7,PDATALOOP ENDIF ; ; 设置使用SMALL存储器模式时再入函数的堆栈空间. IFIBPSTACK <> 0 EXTRNDATA (?C_IBP) MOV?C_IBP,#LOW IBPSTACKTOP ENDIF ; ; 设置使用LARGE存储器模式时再入函数的堆栈空间. IFXBPSTACK <> 0 EXTRNDATA (?C_XBP) MOV?C_XBP,#HIGH XBPSTACKTOP MOV?C_XBP+1,#LOW XBPSTACKTOP ENDIF ; ; 设置使用COMPACT存储器模式时再入函数的堆栈空间. IFPBPSTACK <> 0 EXTRNDATA (?C_PBP) MOV?C_PBP,#LOW PBPSTACKTOP ENDIF ; ; 设置堆栈的起始地址 MOVSP,#?STACK-1 ; 例如MOV SP,#4FH ; ;This code is required if you use L51_BANK.A51 with Banking Mode 4 ; 如果你的程序使用了Mode 4 程序分组技术请启动下面的程序,不会吧你的程序超过64K 利害 ;EXTRN CODE (?B_SWITCH0) ;CALL ?B_SWITCH0 ; init bank mechanism to code bank 0 ; 程序从第一组bank 0 块开始执行 ; 跳转到用户程序MAIN函数 LJMP?C_START END |