找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4867|回复: 5
收起左侧

请问Keil启动文件STARTUP.A51有什么用处?

[复制链接]
ID:885725 发表于 2021-2-24 16:26 | 显示全部楼层 |阅读模式
新建单片机项目时,没有选择拷贝启动文件,程序也能运行。请问这个启动文件有什么用处呢? jt1.png
回复

使用道具 举报

ID:155507 发表于 2021-2-24 18:54 | 显示全部楼层
当在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


评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:372579 发表于 2021-2-24 19:50 | 显示全部楼层
清理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,如果你明白它的特性。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:390416 发表于 2021-2-24 21:10 | 显示全部楼层
你管他干啥呢  选择OK就是了 重点是如何编程实现自己的设计目标,
回复

使用道具 举报

ID:883242 发表于 2021-2-25 17:16 | 显示全部楼层
startup.a51在库文件.lib里面已经存在了,所以你不加人工程也可以用。但是你要是想修改其中的内容,来符合你的工程,就必须加入你的工程里面了。.a51会被编译成.obj,链接的时候优先级比.lib文件高,自然会替代库文件里面的内容。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:886627 发表于 2021-2-26 13:17 | 显示全部楼层
不添加的话 就默认用默认的安装路径下面的库

加了的话  就用你添加的。
你可以稍微改动点试试

比如 内存清零部分
让只是清除部分内存
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表