微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Keil C中startup.a51的作用

Keil C中startup.a51的作用

时间:11-27 来源:互联网 点击:
启动文件. 清理RAM.设置堆栈等.即执行完start.a51后跳转到.c文件的main函数.

和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char data xxx="100";,那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51==变量的初始化)。这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或清零动作。. Y" |, ~# X D$ V
有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比如掉电保护的时候想保存一些变量, 但改startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。, 为什么还要去改? 可以这么说:任何时候都可以不需要改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.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top