启动代码startups分析
windows启动时自动运行程序-startup

windows启动时⾃动运⾏程序-startup第⼀种:需要登录才能运⾏的⽅法第⼀步:编写运⾏jar包的bat⽂件新建⼀个run.txt⽂件,将以下内容放进去,然后修改⽂件后缀为.bat@echo offjava -jar C:\Users\Administrator\Desktop\test-0.0.1-SNAPSHOT.jar > C:\Users\Administrator\Desktop\test.logpause解释:@echo off 执⾏该命令后,后⾯所有的命令⾏都不会显⽰出来(但是程序的打印输出会显⽰)> 将jar包控制台的输出输出到⼀个⽂件中(可以不输出到⽂件中,因为⽂件可能会特别⼤)pause 当执⾏到该命令时,会暂停命令⾏的执⾏,并打印显⽰"请输⼊任意键继续..."的字符。
可能是因为springBoot启动时需要打印⼀堆东西的缘故,可能会额外弹出⼀个窗⼝显⽰"请输⼊任意键继续..."的字符。
然后你按任意键继续即可,只要打印输出的窗⼝不关,额外弹出的窗⼝关闭也没事,就相当于⼀个启动完成的标志吧。
PS:如果想要在⼀个bat⽂件中运⾏多个jar包,要这样使⽤@echo offstart cmd /c "java -jar d:\test.jar"start cmd /c "java -jar d:\test2.jar"pause解释: start 表⽰要执⾏⼀个命令或⼀个可执⾏的⽂件等。
这样每执⾏⼀个start cmd /c 命令就会弹出⼀个命令⾏窗⼝,所以要想办法隐藏掉。
因为有⼀个控制台打印的进程⼀直开着,所以关闭是关闭不掉的。
第⼆步:编写vb脚本隐藏命令⾏窗⼝因为若只执⾏第⼀步的话,启动后会弹出⼀个或多个命令⾏窗⼝,当窗⼝关闭时,项⽬也停⽌了,所以编写⼀个vb脚本隐藏命令⾏窗⼝,操作步骤:新建⼀个txt⽂件,将以下内容copy进去,修改⽂件后缀为vbs即可。
Keil C51初始化代码 Startup.a51的中文说明

;
;;
; IDATA 存储器的空间的绝对起始地址总是 0.;
IDATALEN
EQU 80H ; 需用 0 进行初始化的 IDATA 存储器空间的字节数
;
XDATASTART
EQU
0H ; XDATA 存储器空间的绝对起始地址
XDATALEN
EQU
0H ; 需用 0 进行初始化的 XDATA 存储器的空间字节数.
0FFFFH+1; 将堆栈顶设置为最高地址+1.
;
;------------------------------------------------------------------------------
;
; 使用 COMPACT 存储器模式时 64K 字节 XDATA 存储器空间的分页定义
;
XBPSTACKTOP
EQU
0FFFFH+1; 将堆栈顶设置为最高地址+1.
;
; 使用 COMPACT 存储器模式时再入函数的堆栈空间.; 使用 COMPACT 存储器模式时再入函数的堆栈
PBPSTACK
EQU
0 ; 使用 COMPACT 存储器模式再入函数时将其设置成 1.
PBPSTACKTOP
EQU
MOVX
@DPTR,A
INC
DPTR
DJNZ
R7,XDATALOOP
DJNZ
R6,XDATALOOP
ENDIF
;
; 送 PDATA 存储器页面高位地址
IF PAGEENABLE <> 0
MOV
P2,#PPAGE
ENDIF
;
; 单片机上电 PDATA 内存清零 如果不需要上电清零 XDATA
cmdstartup指令

cmdstartup指令是用于启动Tomcat服务器的命令。
在Windows中,你可以按下Win+R键,然后键入cmd并按Enter 键,或者在开始菜单中搜索cmd并单击打开,进入命令行窗口。
然后,你可以使用cd命令导航到包含startup.bat文件的目录。
例如,如果startup.bat位于C:\myapp目录中,你可以键入以下命令:cd C:\myapp。
然后输入以下命令启动startup.bat:startup.bat。
按Enter键以运行该命令。
你应该看到一些输出,指示startup.bat正在运行。
然而,如果在运行startup.bat时遇到任何错误,请检查startup.bat 文件是否存在,并确保它位于正确的位置。
同时也要检查环境变量设置是否正确,变量名是否填写正确。
如果这些都没有问题,那可能是你电脑中的Tomcat环境变量设置存在问题。
以上信息仅供参考,如果还有疑问,建议咨询专业技术人员。
STM32启动文件:startup_stm32f10x_hd.s等启动文件的简单描述

STM32启动⽂件:startup_stm32f10x_hd.s等启动⽂件的简单描述在官⽅的库⽂件中,分别有如下⽂件:startup│││├─arm││││ startup_stm32f10x_cl.s││││ startup_stm32f10x_hd.s││││ startup_stm32f10x_hd_vl.s││││ startup_stm32f10x_ld.s││││ startup_stm32f10x_ld_vl.s││││ startup_stm32f10x_md.s││││ startup_stm32f10x_md_vl.s││││ startup_stm32f10x_xl.sR8T6使⽤的MD.s,中容量的arm芯⽚,⼤致的启动内容如下:初始化堆栈指针 SP初始化程序计数器指针 PC设置堆、栈的⼤⼩设置中断向量表的⼊⼝地址配置外部 SRAM 作为数据存储器调⽤ SystemInit() 函数配置 STM32 的系统时钟设置 C 库的分⽀⼊⼝ "__main” (最终⽤来调⽤ main 函数)startup_stm32f10x_hd.s 是⼀个启动⽂件,⾥⾯是使⽤汇编语⾔写好的基本程序,当STM32 芯⽚上电启动的时候,受限会执⾏这⾥的汇编程序,从⽽建⽴起来C 语⾔的运⾏环境,所以我们把这个⽂件称为启动⽂件。
改⽂件使⽤的汇编指令是 Cortex-M3 内核⽀持的指令,可以参考《Cortex-M3 权威指南中⽂》内指令集章节。
startup_stm32f10x_hd.s ⽂件是由ST官⽅提供的,该⽂件可以从KEIL5 安装⽬录中找到,也可以从STV3.5库⾥⾯找到,找到该⽂件后吧启动⽂件添加到⼯程⾥⾯即可。
不同型号的芯⽚以及不同编译环境使⽤的汇编⽂件是不⼀样的,但功能相同。
在keilMDK4中只有STM32F10x.s⽂件。
在<<STM32不完全⼿册⾥⾯>>,所有的例程都采⽤了⼀个叫STM32F10x.s的启动⽂件,⾥⾯定义了STM32的堆栈⼤⼩以及各种中断的名字及⼊⼝函数名称,还有启动相关的汇编代码。
解析Tomcat的启动脚本--startup.bat

解析Tomcat的启动脚本--startup.bat 概述我们通常使⽤ Tomcat 中的 startup.bat 来启动 Tomcat. 但是这其中⼲了⼀些什么事呢?⼤家都知道⼀个 Java 程序需要启动的话, 肯定需要 main ⽅法, 那么这个 main ⽅法在哪呢?Tomcat 脚本中⼜是配置了⼀些什么参数呢, 什么情况下 Tomcat 会启动失败呢?带着⼀些列的疑问我们来分析 Tomcat 的三个最重要的启动脚本:startup.batcatalina.batsetclasspath.batstartup.bat 脚本该脚本主要做了以下⼏件事:设置 CATALINA_HOME 环境变量的值找到 catalina.bat 脚本调⽤ catalina.bat 脚本, 并把参数传过去贴出简化版本的 startup.bat 脚本的内容@echo offrem 执⾏这个命令之后, 增加或者改动的环境变量只限于匹配到 endlocal 命令或者到达⽂件末尾.setlocalrem 假设 CATALINA_HOME 环境变量没有定义rem 取当前⽬录的路径值, 赋给 CURRENT_DIR 变量, 就是 ./apache-tomcat-x.x.xx/binset "CURRENT_DIR=%cd%"rem 如果 CATALINA_HOME 变量值不是 "" 的话, 调到 gotHome 标签处if not "%CATALINA_HOME%" == "" goto gotHomerem 如果 CATALINA_HOME 是 "" 的话, 设置 CATALINA_HOME 变量值为当前⽬录的路径值(./apache-tomcat-x.x.xx/bin) set "CATALINA_HOME=%CURRENT_DIR%"rem 判断当前路径下的是否有 bin\catalina.bat, 也就是 ./apache-tomcat-x.x.xx/bin/bin/catalina.batrem 如果存在的话, 直接调到 okHome 标签处, 显然是不存在的if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHomerem 不存在的话, CATALINA_HOME 取上级⽬录的值, 也就是(./apache-tomcat-x.x.xx/)cd ..set "CATALINA_HOME=%cd%"rem 进⼊ CURRENT_DIR(./apache-tomcat-x.x.xx/bin)cd "%CURRENT_DIR%":gotHomerem 通过上⾯的设置, CATALINA_HOME 的值已经是: ./apache-tomcat-x.x.xx/rem 所以整理是可以找到 catalina.bat 脚本的, 直接调到 okHome 标签处if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHomeecho The CATALINA_HOME environment variable is not defined correctlyecho This environment variable is needed to run this programgoto end:okHomerem 设置 EXECUTABLE 变量指向为 catalina.bat 脚本set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"rem 检查⽬标可执⾏⽂件(catalina.bat)是否存在, 通常情况下是存在的, 直接调到 okExec 标签处rem 如果不存在的话, 直接退出. 启动 Tomcat 结束if exist "%EXECUTABLE%" goto okExececho Cannot find "%EXECUTABLE%"echo This file is needed to run this programgoto end:okExecrem 获取剩余的没有⽤ shift 取出来的命令⾏参数, 并保存它们在 CMD_LINE_ARGSset CMD_LINE_ARGS=:setArgsrem 如果第⼀个命令⾏参数是空的话, 跳到 doneSetArgs 标签处rem "%1" : 表⽰执⾏命令之后的第⼀个参数if ""%1""=="""" goto doneSetArgsrem 第⼀个参数不是空的话, 拼接到 CMD_LINE_ARGS 变量set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1rem 这个命令可以⾃⾏百度shiftgoto setArgs:doneSetArgsrem 上⾯设置了 EXECUTABLE 变量的值是指向了 catalina.bat 脚本, 这个利⽤ call 命令执⾏调⽤, 并把参数传进去rem 接下来, 咱们看 catalina.bat 脚本的内容rem 完整的命令: ./apache-tomcat-x.x.xx/bin/catalina.bat startcall "%EXECUTABLE%" start %CMD_LINE_ARGS%:end要想理解脚本中的⼀些命令, ⾸先来了解⼀下常⽤的命令(我们⽤的 Window 版的)rem : 该命令后的代码不会被执⾏, 相当于注释@echo off : 关闭命令的显⽰, 如果没有设置, 执⾏了哪些命令都会显⽰出来echo : 输出后⾯的内容setlocal : 执⾏这个命令之后, 增加或者改动的环境变量的作⽤范围只限于匹配到 endlocal 命令或者到达⽂件末尾.set : 设置⼀个变量:xxx : 定义⼀个标签goto : 跳转到制定的标签处call : 执⾏命令我们来⼀⾏⾏分析 startup.bat 脚本set "CURRENT_DIR=%cd%"%cd% : 表⽰⽂件所在的⽬录的路径如果我们解压的 Tomcat 所在的⽬录为 D:/apache-tomcat-x.x.x/ . 因为 startup.bat 命令在 bin ⽬录下, 所以此时 %cd% 表⽰的⽬录是 D:/apache-tomcat-x.x.x/binif not "%CATALINA_HOME%" == "" goto gotHome我们通常情况下不会配置 CATALINA_HOME 这个环境变量的, 所以这⾥不会调到 gotHome 标签处.set "CATALINA_HOME=%CURRENT_DIR%"直接把当前⽬录假设为 CATALINA_HOME 的值if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome然后通过固定的格式来判断⼀下是否有 catalina.bat 脚本, 当然这⾥是肯定不会存在的, 因为 CATALINA_HOME = D:/apache-tomcat-x.x.x/bincd ..set "CATALINA_HOME=%cd%"因为 Tomcat 的⽬录格式是固定的, 所以这⾥直接进⼊上级⽬录(cd ..), 然后设置 CATALINA_HOME 的值为上级⽬录(D:/apache-tomcat-x.x.x ).if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHomeecho The CATALINA_HOME environment variable is not defined correctlyecho This environment variable is needed to run this programgoto end继续往下看, 这⾥⼜⼀次判断了⼀下 catalina.bat 在这样的⽬录结构是是否能找到, 如果我们解压完 Tomcat 后, 把 startup.bat放在⾮ Tomcat 的 bin ⽬录下之后, 这⾥是找不到的, 就直接 goto end, 退出 Tomcat 的启动.好了, 这⾥我们直接调到 okHome 标签处.:okHomeset "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"好了, 这⾥很简单, 设置⼀个 EXECUTABLE 变量的值指向 catalina.bat 脚本.if exist "%EXECUTABLE%" goto okExececho Cannot find "%EXECUTABLE%"echo This file is needed to run this programgoto end⼜⼀次的检查了⼀下这个脚本是否存在, 存在的话, 直接调到 okExec 标签处, 可以执⾏了.如果没有通过检查的话, 依旧退出启动, 并打印错误信息.:okExecset CMD_LINE_ARGS=:setArgsif ""%1""=="""" goto doneSetArgsset CMD_LINE_ARGS=%CMD_LINE_ARGS% %1shiftgoto setArgs先设置了⼀个 CMD_LINE_ARGS 变量, 并且其值暂且为空这⾥出现了⼀个 ""%1""=="""", 拆开看就是判断 "%1" 是否等于 "". 那么 "%1" ⼜是什么呢?这是 window 批处理的⼀个语法, 表⽰的是执⾏命令之后的第⼀个参数, 对于这⾥, 我们并没有传递什么参数, 所以这⾥的 "%1"是 ""(空).直接跳转到 doneSetArgs 标签处.如果不是空的话, 就拼在后⾯呗.这⾥这个 shift 命令意思就是移除⼀个参数, 举个例⼦就知道了:@echo offecho "%1"shiftecho "%1"建⼀个 test.bat 批处理程序, 然后把上⾯代码复制进去, 在 cmd 中执⾏并给它两个参数下⾯是执⾏结果, 这⾥⼤家可以把 @echo off 去掉再执⾏, 验证⼀下这个命令的作⽤PS D:\> .\test Hello World"Hello""World"PS D:\>这样, ⼤家应该可以理解了.继续分析:doneSetArgscall "%EXECUTABLE%" start %CMD_LINE_ARGS%:end在上⾯设置了 EXECUTABLE = %CATALINA_HOME%\bin\catalina.bat , 所以这⾥实际上是调⽤了 catalina.bat 这个脚本, 然后传递⼀个 start 参数给它.如果我们在 cmd 中运⾏ startup.bat 并且后⾯跟着⼀些参数的话, 这⾥也⼀起传递过去了.这⾥实际上就是执⾏了: %CATALINA_HOME%\bin\catalina.bat start总结这个脚本还是挺简单的, ⽬的就是找到 catalina.bat 并调⽤它.以上就是本⽂的全部内容,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,下篇继续介绍Tomcat相关知识--《》,有兴趣的朋友可以看下。
运行startup.bat的启动过程

运行startup.bat的启动过程一、前言一般启动tomcat都是找到bin目录下的startup.bat(windows)下或者startup.sh(linux下),所以要研究tomcat的启动,startup脚本是避不开的。
那么下面就来看一看windows下面的startup.bat。
二、bat文件要看懂startup.bat,首先得对bat文件有个基本的了解。
bat文件是dos下的批处理文件。
批处理文件是无格式的文本文件,这个文件的每一行都是一条DOS命令。
它的文件扩展名为 .bat 或 .cmd。
在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。
使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。
批处理简单语法:rem:该命令用于注释,rem起始的行不会作为代码执行pause:该命令用于暂停正在执行的批处理文件,并且提示用户按键,然后程序继续执行echo:该命令用于在dos控制台显示一段文本,相当于print,如果想要显示环境变量需要在环境变量前后加上%,例如显示操作系统echo %OS%echo off:该命令可以防止将批处理文件中的具体命令打印出来,而只会输出执行结果。
@echo off:该命令与echo off相同,唯一的区别在于@echo off不仅会隐藏具体命令还会连'echo off'这个自身命令也隐藏起来。
set:设置环境变量,例如 set A = 100 设置A变量为100label:使用':'(冒号)来设置一个标签,供给goto命令使用,例如':init'代表一个init标签。
goto:该命令使正在执行的命令强制跳转到他指定的标签。
例如我需要跳转指定A标签下的命令,如下:goto Anot: 该命令用来取反,相当于逻辑非。
if:该命令表示判断exist: 该命令通常用来测试文件是否存在,一般和if一起使用shift: 该命令用来将参数后移一位即将%2%赋值给%1%,%3%赋值给%2%,也可以理解为参数列表左移即删除现有参数列表的第一位。
单片机STARTUP.A51详解
单片机STARTUP.A51详解
Startup code:启动代码。
在Keil中,启动代码在复位目标系统后立即被执行。
启动代码主要实现以下功能:
(1) 清除内部数据存储器
(2) 清除外部数据存储器
(3) 清除外部页存储器
(4) 初始化small模式下的可重入栈和指针
(5) 初始化large模式下的可重入栈和指针
(6) 初始化compact模式下的可重入栈和指针
(7) 初始化8051硬件栈指针
(8) 传递初始化全局变量的控制命令或者在没有初始化全局变量时给main 函数传递命令。
在每一个启动文件中,提供了可供用户自己修改有来控制程序执行的汇编常量。
见表1。
tomcat之startup.bat详解
今天自学了X老师的课堂录制视频,虽然以前也曾用TOMCAT开发的软件,特别刚开始从事JA V A Web 环境变量的配置都只知道要配置!以前都是跟着课本上的步骤配置TOMCA T的环境变量,而也没有问过为什么要这样配置。
因为我们搞JA VA的初级人员对.bat 中的命令不通!今天在老师的讲解下,对.bat执行也有了初步的理解,对配置也就豁然开朗了@!因此,我也不得不承认,这儿的培训的确比当今大多数的培训机构都牛!但这并不能说明什么,因为在实际的开发的,或者根本不需要。
1.TOMCAT 为什么要配置环境变量对tomcat 安装目录下bin/startup.bat 批处理文件代码的理解:每一条批处理语句相当于一条DOS下的命令@echo off --------->DOS在运行批处理时,会依次执行批处理中的每条命令,并且会在显示器上显示,如果你不想让它们显示,可以加一个“echo off”,当然,“echo off”也是命令,它本身也会显示,如果连这条也不显示,就在前面加个“@”。
┝------------------------->rem 表示后面的是注释rem Licensed to the Apache Software Foundation (ASF) under one or morerem contributor license agreements. See the NOTICE file distributed withrem this work for additional information regarding copyright ownership.rem The ASF licenses this file to You under the Apache License, Version 2.0rem (the "License"); you may not use this file except in compliance withrem the License. You may obtain a copy of the License atremrem /licenses/LICENSE-2.0remrem Unless required by applicable law or agreed to in writing, softwarerem distributed under the License is distributed on an "AS IS" BASIS,rem WITHOUT W ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. rem See the License for the specific language governing permissions andrem limitations under the License.if "%OS%" == "Windows_NT" setlocalrem ---------------------------------------------------------------------------rem Start script for the CATALINA Serverremrem $Id: startup.bat 908749 2010-02-10 23:26:42Z markt $rem ---------------------------------------------------------------------------rem Guess CATALINA_HOME if not defined设置CURRENT_DIR 为当前目录set "CURRENT_DIR=%cd%"如果CATALINA_HOME为空去执行gotHomeif not "%CATALINA_HOME%" == "" goto gotHome设置环境变量为变量CURRENT_DIR的值set "CATALINA_HOME=%CURRENT_DIR%"如果"%CATALINA_HOME%\bin\catalina.bat 文件存在goto okHomeif exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome回到上一级目录cd ..设置环境变量为变量为当前路径set "CATALINA_HOME=%cd%"相当于DOS下的cd 命令cd "%CURRENT_DIR%"gotHome 程序块:gotHome如果下面的批处理文件存在goto okHomeif exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome输出以下的消息echo The CATALINA_HOME environment variable is not defined correctly echo This environment variable is needed to run this programgoto endgoto end之后的语句意思都差不多,不在备注:okHomeset "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"rem Check that target executable existsif exist "%EXECUTABLE%" goto okExececho Cannot find "%EXECUTABLE%"echo This file is needed to run this programgoto end:okExecrem Get remaining unshifted command line arguments and save them in theset CMD_LINE_ARGS=:setArgsif ""%1""=="""" goto doneSetArgsset CMD_LINE_ARGS=%CMD_LINE_ARGS% %1shiftgoto setArgs:doneSetArgscall "%EXECUTABLE%" start %CMD_LINE_ARGS%:end从以上可知,会调用\bin\catalina.bat批处理问题,而在catalina 批处理文件中又会执行setclasspath.bat 批处理文件。
Linux里startup.sh和shutdown.sh
最后执行 ./startup.sh 即可完成启动!
1、启动 startup.sh
# ---------------------------------------------------# Start script for the Socekt Server # ---------------------------------------------------#!/bin/sh ps -ef |grep socketServer.jar |grep -v grep if [ $? -eq 0 ];then
PID_1024=$(echo `netstat -apn |grep 1024 | awk '{print $NF}'|awk -F '/' '{print $1}'`) kill $PID_1024 echo 'Socket server has shutdown!' else echo 'Not found socket PID!' fi
echo 'Socket server iat -apn |grep 1024 if [ $? -eq 0 ];then
PID_1024 = $(echo `netstat -apn |grep 1024 | awk '{print $NF}'|awk -F '/' '{print $1}'`) kill $PID_1024 fi echo "startup socket server:" nohup java -jar socketServer.jar & fi
Oracle启动例程STARTUP参数说明
Oracle启动例程STARTUP参数说明1. pfile:指定用于初始化数据库的参数文件的路径和名称。
Oracle数据库允许使用静态的初始化参数文件(pfile)或动态的服务器参数文件(spfile)。
pfile是一个文本文件,包含了数据库启动和运行所需的各种设置,例如内存配置、日志文件设置、网络配置等。
如果不指定此参数,默认将使用默认的pfile。
2. spfile:指定用于初始化数据库的动态服务器参数文件的路径和名称。
与pfile不同的是,spfile是二进制文件,数据库启动后会加载到内存中,可以在运行时动态地修改其中的参数值。
当spfile文件不存在时,可以通过pfile启动数据库,然后手动创建spfile文件并修改其中的参数值。
如果不指定此参数,默认将使用默认的spfile。
3. nomount:不打开数据库,只将实例启动到nomount状态。
在nomount状态下,数据库实例只加载参数文件,但不打开具体的数据库文件。
这个状态常用于创建数据库控制文件、重建控制文件或修改pfile/spfile文件等操作。
4. restrict:在nomount状态下打开数据库,并限制只有具有CREATE DATABASE权限的用户才能够连接到数据库。
这个选项常用于在数据库创建期间,限制只有授权用户可以进行相关操作。
5. mount:打开数据库并挂载数据库文件。
在mount状态下,数据库控制文件和数据文件都已加载到内存中,但数据库还没有打开,用户无法访问数据库中的数据。
6. open:打开数据库,使得用户可以对数据库进行正常的读写操作。
在open状态下,数据库可以被用户连接并执行各种操作。
7. force:强制Oracle数据库启动。
如果数据库之前没有正确关闭,或者出现了一些系统故障,导致数据库处于其中一种异常状态,可以使用force选项来强制启动数据库。
8. parallel:在启动数据库的过程中,使用并行化技术来同时加载多个数据库文件和数据块。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
启动代码start.s(相当于bootloader的前端代码),开机就执行的代码,即0x0000处放置的代码。
给CPU一个合适的工作环境。
面向CPU内核和外围硬件,所以一般用汇编编写。
1、在起始地址分配中断向量表即中断处理函数(CPU要求的),以为向量空间只有4字节,所以一般只是一个跳转指令,去别处执行。
2、之后初始化存储器系统3、初始多个模式下的堆栈(模式切换时,硬件给SP置位)4、初始化有特殊要求的外围设备,如LED灯、看门狗5、初始化用户的执行环境(在FLASH中运行太慢了,把代码整体搬迁到RAM中)6、切换处理器的工作模式7、调用主程序(没见到有存储控制器的配置代码,也没见到有时钟初始化代码)下面分析,所给的2410的启动代码实现了以上的那些功能,实现得显然不全,或者不需要,或者在工程代码的其它部分实现。
读程序时注意,所有程序都是逐行顺序执行的,要看清跳转指令。
GET 2410addr.s //用到了2410addr.s中的寄存器地址宏定义;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Some ARM920 CPSR bit discriptions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Pre-defined constants//预定义的变量,一下后续代码中使用方便,与CPSR相关USERMODE EQU 0x10FIQMODE EQU 0x11IRQMODE EQU 0x12SVCMODE EQU 0x13ABORTMODE EQU 0x17UNDEFMODE EQU 0x1bMODEMASK EQU 0x1fNOINT EQU 0xc0I_Bit * 0x80F_Bit * 0x40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MMU Register discription ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p15 CP 15;c0 CN 0;c1 CN 1;c2 CN 2;c3 CN 3CtrlMMU * 1CtrlAlign * 2CtrlCache * 4CtrlWBuff * 8CtrlBigEnd * 128CtrlSystem * 256CtrlROM * 512;initialization L0 is MMU FULL_ACCESS, DOMAIN, SECTIONTLB_L0_INIT * 0x0C02 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Start here //执行代码从这里开始;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;//IMPORT ,定义表示这是一个外部变量的标号,不是在本程序定义的//EXPORT ,表示本程序里面用到的变量提供给其他模块调用的。
//以上两个在汇编和C语言混合编程的时候用到AREA Init,CODE,READONLYIMPORT __use_no_semihosting_swiIMPORT Enter_UNDEF //有点extern的感觉IMPORT Enter_SWIIMPORT Enter_PABORTIMPORT Enter_DABORTIMPORT Enter_FIQENTRY //这是程序的入口//中断/异常向量表(跳转),上电第一条就执行 b ColdReset,跳转到ColdReset。
b ColdResetb Enter_UNDEF ;UndefinedInstructionb Enter_SWI ;syscall_handler or SWIb Enter_PABORT ;PrefetchAbortb Enter_DABORT ;DataAbortb . ;ReservedHandlerb IRQ_Handler ;IRQHandlerb Enter_FIQ ;FIQHandler;deal with IRQ interruptEXPORT IRQ_Handler //IRQ中断处理子程序IRQ_HandlerIMPORT ISR_IrqHandler //服务程序在外部定义STMFD sp!, {r0-r12, lr}BL ISR_IrqHandler //跳转至服务程序LDMFD sp!, {r0-r12, lr}SUBS pc, lr, #4;=======; ENTRY;=======EXPORT ColdResetColdReset //上电执行复位异常函数,就跳转到这里来ldr r0,=WTCON ;watch dog disable//关闭看门狗,还没初始化完系统,防止没“喂狗”再次复位,写看门狗寄存器WTCON即可ldr r1,=0x0str r1,[r0]ldr r0,=INTMSK //关闭所有中断ldr r1,=0xffffffff ;all interrupt disablestr r1,[r0]ldr r0,=INTSUBMSK//关闭所有次级中断ldr r1,=0x7ff ;all sub interrupt disable, 2002/04/10str r1,[r0];****************************************************;* Initialize stacks * //进行堆栈初始化;****************************************************bl InitStacks ; Stack Setup for each MODE//跳转到initstack,对各个模式下的堆栈进行初始化。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; copy excption table to sram at 0x0//对堆栈初始化之后,进行域初始化;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IMPORT |Load$$EXCEPTION_EXEC$$Base|IMPORT |Image$$EXCEPTION_EXEC$$Base|IMPORT |Image$$EXCEPTION_EXEC$$Length|ldr r0, =|Load$$EXCEPTION_EXEC$$Base| ;source dataldr r1, =|Image$$EXCEPTION_EXEC$$Base| ;place exception talbe at 0x0ldr r2, =|Image$$EXCEPTION_EXEC$$Length|exception_cploop//这段没读明白,但是猜测是将flash中的程序代码拷贝到SDRAM中运行sub r2, r2, #4ldmia r0!, {r3}stmia r1!, {r3}cmp r2, #0bge exception_cploop;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; start main function in C language//跳转到用户代码main() ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IMPORT __mainBL __main ;Don't use main() because ......B .;****************************************************;* The function for initializing stack *;****************************************************IMPORT UserStack//堆栈指针的值是在外部就定义好的。
IMPORT SVCStackIMPORT UndefStackIMPORT IRQStackIMPORT AbortStackIMPORT FIQStackInitStacks;Don't use DRAM,such as stmfd,ldmfd......;SVCstack is initialized before;Under toolkit ver 2.50, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1' //每个模式下都有自己的堆栈指针SP,我们对其进行设置的前提就是进入该模式,即对CPSR 进行置位,才能访问这个模式下的SP,模式切换的时候,硬件会自动给SP置我们赋给的值。
对CPSR的操作时按照“读出—修改—写入”的步骤进行的。
即先用mrs读出,再用msr写入。
mrs r0,cpsrbic r0,r0,#MODEMASKorr r1,r0,#UNDEFMODE|NOINTmsr cpsr_cxsf,r1 ;UndefMode//未定义模式堆栈初始化ldr sp,=UndefStack//cpsr_cxsf 下划线后表示域,即操作哪些位。
orr r1,r0,#ABORTMODE|NOINTmsr cpsr_cxsf,r1 ;AbortMode//中止模式堆栈初始化ldr sp,=AbortStackorr r1,r0,#IRQMODE|NOINTmsr cpsr_cxsf,r1 ;IRQMode//IRQ模式ldr sp,=IRQStackorr r1,r0,#FIQMODE|NOINTmsr cpsr_cxsf,r1 ;FIQMode//FIQ模式ldr sp,=FIQStack;bic r0,r0,#MODEMASK|NOINT//管理模式orr r1,r0,#SVCMODE|NOINTmsr cpsr_cxsf,r1 ;SVCModeldr sp,=SVCStack;USER mode is not initialized.//没有对用户模式下的堆栈进行初始化。