单片机startup.a51文件标号和清零程序的内容详细解答

1.标号
idatalen equ 80h ; the length of idata memory in bytes.
这里idatalen只是一个标号而已,和idata不是一回事!你要是愿意,这段程序里的idatalen你完全可以改成dog呀,pig呀,playboy呀这些标号(其实我的理想是过猪一样的生活,不愁吃喝,无忧无虑,可惜做不到),上面的这一句是说程序里面凡是用到idatalen的地方其实就是可以看成是80h这个数,你用80h去代替idatalen是完全对的。
之所以取idatalen这么个名字,只是为了好记,表明和idata有一点点关系,不至于你的程序长了,假使你本来是用了playboy作为标号的,写到后来你就会忘了playboy到底是什么含义了。idata的范围是0~ffh。如果你想改成ffh,完全可以。
2。清零
if idatalen 0
mov r0,#idatalen - 1
clr a
idataloop: mov @r0,a
djnz r0,idataloop
关于这一段,很明显是在清零,如果上面idatalen=80h,那么是对0~7fh清零;如果
你的程序是改写成:
idatalen equ 0100h ;
就是对0~ffh清零。
还要注意的是那条if语句,下面再谈。
二、如何按你意愿加载这段程序
一般考虑到这个往往是你的设计中要区分上电复位和程序复位。有时候当程序复位时你不希望一些内存单元被清零了,那么你不对startup.a51作点修改,就不行了。
默认是自动加载这段startup.a51的。
所以你要这样做:
把lib目录下的原始startup.a51文件拷到你的项目所在目录下,再把你项目目录下的这个startup.a51加入到你的项目中(在keil的集成环境中,希望你对这个是知道如何做的),然后对这个startup.a51加以修改。
比如改成:
idatalen equ 00h ; the length of idata memory in bytes.
然后编译链接。这样你的程序中就不会包含对idata清零的内码了。
为什么?上面提到的if语句的作用呀!当定义idatalen=0时,清零代码被跳过!
////////////////////////////////////////////
startup.a51的中文说明
;------------------------------------------------------------------------------
; startup.a51: 用户上电初始化程序
;------------------------------------------------------------------------------
;
; 用户定义需上电初始化的内存空间
;
; 使用以下equ命令可定义在cpu复位时需用0进行初始化的内存空间
;
;; ; idata 存储器的空间的绝对起始地址总是0.;
idatalen equ 80h ; 需用0进行初始化的idata存储器空间的字节数
;
xdatastart equ 0h ; xdata存储器空间的绝对起始地址
xdatalen equ 0h ; 需用0进行初始化的xdata存储器的空间字节数.
;
pdatastart equ 0h ; pdata存储器的空间的绝对起始地址
pdatalen equ 0h ; 需用0进行初始化的pdata存储器的空间字节数.
;
; 注意: idata 存储器的空间在物理上包括了8051单片机的data和bit存储器空间.
; 听 说 至少要保证与c51编译器运行库有关的存储器的空间进行0初始化 不知是否
;------------------------------------------------------------------------------
;
; 再入函数模拟初始化
;
; 以下用equ指令定义了再入函数模拟堆栈指针的初始化
;
; 使用small存储器模式时再入函数的堆栈空间 .
ibpstack equ 0 ; 使用small存储器模式再入函数时将其设置成1.
ibpstacktop equ 0ffh+1 ; 将堆栈顶设置为最高地址+1.
;
; 使用large存储器模式时再入函数的堆栈空间.; 使用large存储器模式时再入函数的堆栈空间.
xbpstack equ 0 ; 使用large存储器模式再入函数时将其设置成1.
xbpstacktop equ 0ffffh+1; 将堆栈顶设置为最高地址+1.
;
; 使用compact存储器模式时再入函数的堆栈空间.; 使用compact存储器模式时再入函数的堆栈空间.
pbpstack equ 0 ; 使用compact存储器模式再入函数时将其设置成1.
pbpstacktop equ 0ffffh+1; 将堆栈顶设置为最高地址+1.
;
;------------------------------------------------------------------------------
;
; 使用compact存储器模式时64k字节xdata存储器空间的分页定义
;
; 以下用equ指令定义pdata类型变量在xdata存储器空间的页地址
; 使用equ指令定义pfage时必须与l51连接定位器pdata指令的控制参数一致
;
ppageenable equ 0 ; 使用pdata类型变量时将其设置成1.
ppage equ 0 ; 定义页号.
;
;------------------------------------------------------------------------------
name ?c_startup; 模块名为 ?c_stautup
?c_c51startup segment code ; 代码
?stack segment idata ; 堆栈
rseg ?stack ; 堆栈
ds 1
extrnextrn code ((?c_start)) ; 程序开始地址
public ?c_startup
cseg at 0x8000 ; 定义用户程序的起始地址,用mon51仿真器时可能有用
?c_startup: ljmp startup1
rseg ?c_c51startup
startup1::
;
; 初始化串口
mov scon,#40h
mov tmod,#20h
mov th1,#0fdh
setb tr1
clr ti
; 单片机上电idata内存清零 如果不需要上电清零idata 可以注销if到ifedn之间的话句
; 或者修改idtalen的长度 为了具有掉电保护功能 不知idtalen多长为好
if idatalen 0
mov r0,#idatalen - 1
clr a
idataloop: mov @r0,a
djnz r0,idataloop
endif
;
; 单片机上电xdata内存清零 如果不需要上电清零xdata 可以注销if到ifedn之间的话句
; 或者修改xdatalen的长度
if xdatalen 0
mov dptr,#xdatastart
mov r7,#low ((xdatalen)
if (low (xdatalen) 0
mov r6,#(high (xdatalen) +1
else
mov r6,,#high ((xdatalen)
endif
clr a
xdataloop: movx @dptr,a
inc dptr
djnz r7,xdataloop
djnz r6,xdataloop
endif
;
; 送pdata存储器页面高位地址
if pageenable 0
mov p2,#ppage
endif
;
; 单片机上电pdata内存清零 如果不需要上电清零xdata 可以注销if到ifedn之间的话句
; 或者修改pdatalen的长度
if pdatalen 0
mov r0,#pdatastart
mov r7,#low (pdatalen)
clr a
pdataloop: movx @r0,a
inc r0
djnz r7,pdataloop
endif
;
; 设置使用small存储器模式时再入函数的堆栈空间.
if ibpstack 0
extrn data (?c_ibp)
mov ?c_ibp,#low ibpstacktop
endif
;
; 设置使用large存储器模式时再入函数的堆栈空间.
if xbpstack 0
extrn data (?c_xbp)
mov ?c_xbp,#high xbpstacktop
mov ?c_xbp+1,#low xbpstacktop
endif
;
; 设置使用compact存储器模式时再入函数的堆栈空间.
if pbpstack 0
extrn data (c_pbp)
mov ?c_pbp,#low pbpstacktop
endif
;
; 设置堆栈的起始地址
mov sp,#?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
;linshengfeng

金属3D打印零件品质受哪些因素影响
MAX3747A/MAX3747B多速率限幅放大器
!销售/回收HP34401A数字万用表HP34401A 小兵
诺基亚回归全民刷屏,因为他有三点现在没有人够做到包括三星和华为
边缘计算是什么,边缘计算的优势是什么
单片机startup.a51文件标号和清零程序的内容详细解答
做拍拍乐电商竞拍商城模式系统APP开发
为什么二极管在线测量时,反向有电压?
MultiButton事件驱动型按键驱动移植测试
aigo国民好物固态硬盘S500和P3000,该如何选?
新能源项目中PLC数据采集物联网可以实现什么功能
如何使用健康传感器平台测量体温
乐视呆账风暴:大联大认列逾期坏账3.3亿元
小米6最新消息:小米6疯狂出击,2499元血洗2017年旗舰市场!
高通推出 Qualcomm神经处理软件开发包SDK
一年时间从零基础到成为研究科学家的历程
微型光学心率监护仪参考设计方案
福布斯发布数字经济百强榜 中国14家企业上榜 BAT入选
ATSC频谱分析及NTSC抑制滤波器的信号检测
irf540n开关电路