ARM启动代码详细注释

ARM启动代码详细注释

syd168 2009-07-23

2410Init.s包括了板子上电后的初始化过程,具体有以下几个步骤:

1.屏蔽所有中断,关看门狗。

2.根据工作频率设置PLL寄存器

3.初始化存储控制相关寄存器

4.初始化各模式下的栈指针

5.设置缺省中断处理函数

6.将数据段拷贝到RAM中,将零初始化数据段清零

7.跳转到C语言Main入口函数中

;=========================================

; NAME: 2410INIT.S

; DESC: C start up codes

; Configure memory, ISR ,stacks

; Initialize C-variables

; HISTORY:

; 2002.02.25:kwtark: ver 0.0

; 2002.03.20:purnnamu: Add some functions for testing STOP,POWER_OFF mode

; 2002.04.10:SJS:sub interrupt disable 0x3ff -> 0x7ff

;=========================================

GET option.s ;GET相当INCLUDE 将一个源文件包含到当前源文件,这里表示包含option.s,并在当前位置进行汇编

GET memcfg.s

GET 2410addr.s

BIT_SELFREFRESH EQU (1<<22)

;SDRAM/DRAM 刷新控制器bit22 REFMD位0:CBR/AUTO REFRESH 1:SHIF REFRESH

;下面是对arm处理器模式寄存器对应值的常数定义,arm处理器中有一个CPSR程序状态寄存器,后五位决定目前的处理器模式。;Pre-defined constants ;PSR 模式位

USERMODE EQU 0x10 ;用户模式

FIQMODE EQU 0x11 ;FIQ快速中断模式

IRQMODE EQU 0x12 ;中断模式

SVCMODE EQU 0x13 ;超级用户模式

ABORTMODE EQU 0x17 ;中止模式

UNDEFMODE EQU 0x1b ;未定义指令模式

MODEMASK EQU 0x1f ;系统模式

NOINT EQU 0xc0 ;禁止IRQ和FIQ中断

在option.s中, _STACK_BASEADDRESS EQU (SDRAM_END-0x8000) ;0x33ff8000

;;定义各模式堆栈地址_STACK_BASEADDRESS

UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~ ; 用户模式堆栈

SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~0x3ff47ff ; 超级用户模式堆栈4k

UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~0x3ff57ff ; 未定义指令模式堆栈1k

AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~0x3ff5bff ; 中止模式堆栈1k

IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~0x3ff5fff ; 中断模式堆栈4k

FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~0x33ff6fff ; 快速中断模式堆栈4k

;arm处理器有两种工作状态

;1.arm:32位这种工作状态下执行字对齐的arm指令

;2.Thumb:16位这种工作状;态执行半字对齐的Thumb指令

;因为处理器分为16位32位两种工作状态程序的编译器也是分16位和32两种编译方式

;所以下面的程序用于根据处理器工作状态确定编译器编译方式

;code16伪指令指示汇编编译器,后面的指令为16位的thumb指令

;code32伪指令指示汇编编译器,后面的指令为32位的arm指令

;这段是为了统一目前的处理器工作状态和软件编译方式(16位编译环境使用tasm.exe编译)

;===========================================================================================

;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used. 检查是否是用tasm.exe进行16位编译

GBLL THUMBCODE ;声明一个全局变量并初始化为{FALSE}

[ {CONFIG} = 16 ;if config=16这里表示用16位编译方式THUMBCODE SETL {TRUE} ;SETL 给全局变量赋值,;设置THUMBCODE 为true CODE32 ;转入32位编译模式

| ; | 等同ELSE

THUMBCODE SETL {FALSE} ;设置THUMBCODE 为false

] ; ] 等同ENDIF

;========================================================================================== MACRO ;MACRO 定义宏

MOV_PC_LR ;宏名MOV_PC_LR

[ THUMBCODE ;if THUMBCODE=true

bx lr ;THUMBCODE 模式上返回ARM状态

| ;else

mov pc,lr ;ARM状态下返回

] ;end if

MEND ;宏结束

;================================================================

MACRO ;宏定义开始

MOVEQ_PC_LR ;宏名为MOVEQ_PC_LR

[ THUMBCODE ;if THUMBCODE=true

bxeq lr ;EQ 相等则跳转回ARM状态

| ;else

moveq pc,lr ;????

] ;end if

MEND ;宏结束

;==================================================================

;注意下面这段程序是个宏定义

;下面包含的HandlerXXX HANDLER HandleXXX将都被下面这段程序展开

;这段程序用于把中断服务程序的首地址装载到pc中,有人称之为“加载程序”。

;本初始化程序定义了一个数据区(在文件最后),34个字空间,存放相应中断服务程序的首地址。每个字,即4字节

;空间都有一个标号,以Handle***命名。

;在向量中断模式下使用“加载程序”来执行中断服务程序。

;这里就必须讲一下向量中断模式和非向量中断模式的概念

;向量中断模式是当cpu读取位于0x18处的IRQ中断指令的时候,系统自动读取对应于该中断源确定地址上的指令取代0x18处的指令,;通过跳转指令系统就直接跳转到对应地址

;函数中节省了中断处理时间提高了中断处理速度标例如ADC中断的向量地址为0xC0,则在0xC0处放如下代码:

;ldr PC,=HandlerADC 当ADC中断产生的时候系统会自动跳转到HandlerADC函数中

;非向量中断模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将interrupt pending寄存器中对应标志位置位

;然后跳转到位于0x18处的统一中断;函数中

;该函数通过读取interrupt pending寄存器中对应标志位来判断中断源,并根据优先级关系再跳到;对应中断源的处理代码中

;大致作用是把宏的第一个参数$HandlerLabel转变为一个标号,然后让程序跳转到第二个参数$HandleLabel(为一个地址)对应的值的地址去。

下面一句一句分析一下,为了便于分析,

假设sp = 0x33ff8000,$HandleLabel = 0x33ffff00, [0x33ffff00] = 0x10000000,r0 = 0x56001234:

$HandlerLabel HANDLER $HandleLabel 说明宏名字叫HANDLER ,有一个参数$HandlerLabel ,它定义了一个标号

sub sp,sp,#4 把栈顶指针减4,留出一个字的空间(用于保存跳转地址的值),sp=0x33ff7ffc

stmfd sp!,{r0} 首先把sp减 4 (sp=0x33ff7ff8),然后把将要使用的r0入栈,此时[0x33ff7ff8]=0x56001234

ldr r0,=$HandleLabel 给寄存器r0赋值,r0=0x33ffff00

ldr r0,[r0] 给寄存器r0赋值,r0=0x10000000

str r0,[sp,#4] 把寄存器r0保存到0x33ff7ffc (sp=0x33ff7ff8+4),此时[0x33ff7ffc] = 0x10000000

ldmfd sp!,{r0,pc} 把栈顶的两个字弹出,分别保存到r0、pc,此时sp=0x33ff8000,r0=0x56001234,pc=0x10000000 ,通过比较不难发现,sp和r0在执行前后都没有变化,程序就跳转到0x10000000处执行

;所以,通过上面的分析可以看出,$HandlerLabel HANDLER $HandleLabel是让PC跳转到$HandleLabel中存放的地址执行。

MACRO ;宏定义

$HandlerLabel HANDLER $HandleLabel

;$HandlerLabel 行号展开时可替换成相应的符号

;HANDLER 宏名

;$HandleLabel 宏的形参

$HandlerLabel ; 展开时可替换成相应的符号

sub sp,sp,#4 ;sp-sp-4,空出的空间用于存放跳转地址假如sp原来为0x100,则现在sp为0x96

stmfd sp!,{r0} ;sp=sp-4,并将r0入栈,现在sp=0x92 r0存入0x96

ldr r0,=$HandleLabel ;获取存放跳转地址的标号HandleLabel到r0,假如HandleLabel为0x1000,则现在r0为0x1000

ldr r0,[r0] ;将HandleLabel中存放的跳转地址送给r0,r0为0x1000中的值,假如为0x3000

str r0,[sp,#4] ;将r0存放到sp+4的地方,

ldmfd sp!,{r0,pc} ;将中断函数首地址出栈,放入程序指针中,系统将跳转到对应中断处理函数

MEND ;宏定义结束

;==================================================================

;一个ARM由RO,RW,ZI三个段组成,其中RO(只读)为代码段,RW(读写)是已经初始化的全局变量,ZI是未初始化的全局变量

;对应于GNU工具的概念是TEXT,DATA,BSS

;bootloader要将RW段复制到RAM中,并将ZI段清零编译器使用下列方式来记录各段的起始和结束地址

; |Image$$RO$$Base| ; RO段起始地址

; |Image$$RO$$Limit| ; RO段结束地址加 1

; |Image$$RW$$Base| ; RW段起始地址

; |Image$$RW$$Limit| ; RW段结束地址加 1

; |Image$$ZI$$Base| ; ZI段起始地址

; |Image$$ZI$$Limit| ; ZI段结束地址加 1

;这些标号的值是通过编译器设定来确定的如编译软件中对ro-base和rw-base的设定分别为:ro-base=0xc000000 rw-base=0xc5f0000

IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)

IMPORT |Image$$RW$$Base| ; Base of RAM to initialise

IMPORT |Image$$ZI$$Base| ; Base and limit of area

IMPORT |Image$$ZI$$Limit| ; to zero initialise

;下面语句是声明引用外部函数

IMPORT Main ;C程序(在2410test.c) The main entry of mon program

;===================================================

AREA Init,CODE,READONLY ;Init 初始化程序

;异常中断矢量表(每个表项占4个字节)

;下面是中断向量表一旦系统运行时就可能有中断发生

;即使移植了操作系统(如linux),处理器已经把控制权交给了操作系统,但如果发生中断,处理器还是会跳转到从0x0开始的;中断向量表中某个中断表项(依据中断类型)开始执行。具体中断向量布局请参考s3c44b0 spec

;例如adc中断向量为0x000000c0下面对应表中第49项位置向量地址0x0+4*(49-1)=0x000000c0

;==========================================================

;板子上电和复位后程序开始从位于0x0处开始执行,硬件刚刚上电复位后程序从这里开始执行跳转到标为ResetHandler处执行

;DCD用于分配一段字内存单片,并用后面的伪指令初始化,分配字节由expr 个数决定

ENTRY ;程序入口

;1)The code, which converts to Big-endian, should be in little endian code.

;2)The following little endian code will be compiled in Big-Endian mode. The code byte order should be changed as the memory bus width.

;3)The pseudo instruction,DCD can't be used here because the linker generates error.

ASSERT :DEF:ENDIAN_CHANGE ;ASSERT 断言错误伪指令,这里表示是否定义过ENDIAN_CHANGE

[ ENDIAN_CHANGE ;如果定义了ENDIAN_CHANGE

ASSERT :DEF:ENTRY_BUS_WIDTH ;这里表示是否定义过ENTRY_BUS_WIDTH

[ ENTRY_BUS_WIDTH=32 ;if ENTRY_BUS_WIDTH=32

b ChangeBigEndian ;跳转到ChangeBigEndian (见下面红色代码),执行DCD 0xea000007 改变大小端数据模式

] ;end if

[ ENTRY_BUS_WIDTH=16 ;if ENTRY_BUS_WIDTH=16

andeq r14,r7,r0,lsl #20 ;当标志状态寄存器CPSR的Z位=1时,r14=r7+r0逻辑左移20位,执行DCD 0x0007ea00改变大小端模式] ;end if

[ ENTRY_BUS_WIDTH=8 ;if ENTRY_BUS_WIDTH=8

streq r0,[r0,-r10,ror #1] ;当标志状态寄存器CPSR的Z位=1时…,执行DCD 0x070000ea 改变大小端模式

] ;end if

| ;ELSE 即如果没定义ENDIAN_CHANGE

b ResetHandler ;复位处理模式

]

b HandlerUndef ;handler for Undefined mode 处理为定义模式

b HandlerSWI ;handler for SWI interrupt 处理软中断模式

b HandlerPabort ;handler for PAbort 处理终止程序访问终止模式

b HandlerDabort ;handler for DAbort 处理数据访问终止模式

b . ;reserved 保留,"."代表指令的地址,即表示进行死循环

b HandlerIRQ ;handler for IRQ interrupt 处理中断模式

b HandlerFIQ ;handler for FIQ interrupt 处理快速中断模式

;@0x20 "@" 存储区位置计数器的当前值

b EnterPWDN ;进入掉电模式,见下面的标号

ChangeBigEndian ;改变大小端数据模式

;@0x24

;=========================下面是大小端格式内存设置???=================== [ ENTRY_BUS_WIDTH=32 ;if ENTRY_BUS_WIDTH=32

DCD 0xee110f10 ;0xee110f10 => mrc p15,0,r0,c1,c0,0

DCD 0xe3800080 ;0xe3800080 => orr r0,r0,#0x80; //Big-endian

DCD 0xee010f10 ;0xee010f10 => mcr p15,0,r0,c1,c0,0

]

[ ENTRY_BUS_WIDTH=16 ;if ENTRY_BUS_WIDTH=16

DCD 0x0f10ee11

DCD 0x0080e380

DCD 0x0f10ee01

]

[ ENTRY_BUS_WIDTH=8 ;if ENTRY_BUS_WIDTH=8

DCD 0x100f11ee

DCD 0x800080e3

DCD 0x100f01ee

]

DCD 0xffffffff ;swinv 0xffffff is similar with NOP and run well in both endian mode.

DCD 0xffffffff

DCD 0xffffffff

DCD 0xffffffff

DCD 0xffffffff

b ResetHandler ;复位处理程式

;进入掉电模式功能

; 1. SDRAM 必须在自刷新模式.

; 2. 所有中断必须屏蔽for SDRAM/DRAM self-refresh.

; 3. LCD 关闭for SDRAM/DRAM self-refresh.

; 4. The I-cache 可能需要开启.

; 5. The location of the following code may have not to be changed.

;void EnterPWDN(int CLKCON); ;进入掉电模式

EnterPWDN

mov r2,r0 ;r2=rCLKCON CLKCON[3] power_off bit 0:disable 1:transition to power_off mode

tst r0,#0x8 ;判断POWER_OFF 是否为0 r0和#0X8相与更新CPSR 位

bne ENTER_POWER_OFF ;NE 不相等(则表示power_off不为O) 标志位Z=0

ENTER_STOP ;不进入掉电模式

ldr r0,=REFRESH ;0x48000024 ;DRAM/SDRAM refresh DRAM/SDRAM 刷新控制器

ldr r3,[r0] ;r3=rREFRESH

mov r1, r3 ;r1=r3

(1<<22) ;bit22 TREFMD位0:CBR/AUTO REFRESH 1:SHIF REFRESH orr r1, r1, #BIT_SELFREFRESH ;BIT_SELFREFRESH EQU

str r1, [r0] ;R1->[R0] Enable SDRAM self-refresh

mov r1,#16 ;延时wait until self-refresh is issued. may not be needed.

0 subs r1,r1,#1 ;0为局部标号(延时)

bne %B0 ; % 表示局部标号引用B:指示编译器向后搜索0为局部标号

ldr r0,=CLKCON ;enter STOP mode. CLKCON ;Clock generator control

str r2,[r0]

mov r1,#32

0 subs r1,r1,#1 ;1)延时wait until the STOP mode is in effect.

bne %B0 ;2) Or wait here until the CPU&Peripherals will be turned-off

; Entering POWER_OFF mode, only the reset by wake-up is available.

ldr r0,=REFRESH ;exit from SDRAM self refresh mode.

str r3,[r0]

MOV_PC_LR ;调用宏MOV_PC_LR

ENTER_POWER_OFF ;进入掉电模式

;NOTE.

;1) rGSTATUS3 should have the return address after wake-up from POWER_OFF mode.

ldr r0,=REFRESH

ldr r1,[r0] ;r1=rREFRESH

orr r1, r1, #BIT_SELFREFRESH

str r1, [r0] ;Enable SDRAM self-refresh

mov r1,#16 ;Wait until self-refresh is issued,which may not be needed.

0 subs r1,r1,#1 ;延时

bne %B0

ldr r1,=MISCCR ; ;Miscellaneous control

ldr r0,[r1]

orr r0,r0,#(7<<17) ;Make sure that SCLK0:SCLK->0, SCLK1:SCLK->0, SCKE=L during boot-up str r0,[r1]

ldr r0,=CLKCON

str r2,[r0]

b . ;CPU will die here. "."当前指令的地址CPU死在这

WAKEUP_POWER_OFF ;掉电唤醒

;Release SCLKn after wake-up from the POWER_OFF mode.

ldr r1,=MISCCR ;Miscellaneous control

ldr r0,[r1]

bic r0,r0,#(7<<17) ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:L->H

str r0,[r1]

;Set memory control registers

ldr r0,=SMRDATA

ldr r1,=BWSCON ;BWSCON Address 起始位置依次为BANKCON0 BANKCON1 BANKCON2 ........

add r2, r0, #52 ;End address of SMRDATA

ldr r3, [r0], #4 ;读取R0地址的数据到R3 R0=R0+4 读取SMRDATA 数组(BWSCON BANKCON0 ....)的值

str r3, [r1], #4 ;读取R3的数据到R1地址内存中R1=R1+4 赋给BWSON BANKCON0 ....寄存器

cmp r2, r0

bne %B0 ;判断是否赋完值

mov r1,#256

0 subs r1,r1,#1 ;1) wait until the SelfRefresh is released.

bne %B0 ;延时

ldr r1,=GSTATUS3 ;GSTATUS3 has the start address just after POWER_OFF wake-up

ldr r0,[r1] ;Saved data0(32-bit) before entering POWER_OFF mode

mov pc,r0

LTORG ;文字池

;下面是具体的中断处理函数跳转的宏,通过上面的$HandlerLabel的宏定义展开后跳转到对应的中断处理;函数(对于向量中断)

HandlerFIQ HANDLER HandleFIQ ;调用宏HANDLER

HandlerIRQ HANDLER HandleIRQ ;HandlerIRQ 行号HANDLER 宏名HandleIRQ 导入的形参

HandlerUndef HANDLER HandleUndef

HandlerSWI HANDLER HandleSWI

HandlerDabort HANDLER HandleDabort

HandlerPabort HANDLER HandlePabort

;下面这段程序是用来处理非向量中断,具体判断I_ISPR中各位是否置 1 ,置1表示目前此中断等待响应(每次只能有一位置1),;从最高优先级中断位开始判断,检测到等待服务中断就将pc置为中断服务函数首地址

IsrIRQ ;IRQ模式中断(片内外设中断引脚中断)

sub sp,sp,#4 ;预留pc返回指针的存储位置

stmfd sp!,{r8-r9} ;将R8~R9 放入堆栈

ldr r9,=INTOFFSET ;中断请求源偏移寄存器

ldr r9,[r9]

ldr r8,=HandleEINT0 ;IRQ 中断首址

add r8,r8,r9,lsl #2 ;r8=r8+ r9<<2 r9<<2(乘4)

ldr r8,[r8] ;取[r8]地址的数据放入R8

str r8,[sp,#8] ;将R8中的数据放入[sp+8]的地址中

ldmfd sp!,{r8-r9,pc} ;将堆栈内空恢复到R8 R9 PC

;===================================

; ENTRY

;===================================

;扳子上电和复位后程序开始从位于0x0执行,b ResetHandler 程序从跳转到这里执行

;板子上电复位后执行几个步骤。这里通过标号在注释中加1,2,3....标示标号表示执行顺序

;1.禁止看门狗屏蔽所有中断

ResetHandler ;复位处理程式

ldr r0,=WTCON ;关闭看门狗watch dog disable

ldr r1,=0x0

str r1,[r0] ;r1->[r0] 禁止看门狗

ldr r0,=INTMSK

ldr r1,=0xffffffff ;all interrupt disable

str r1,[r0] ;r1->[r0] 禁止所有中断

ldr r0,=INTSUBMSK

ldr r1,=0x7ff ;all sub interrupt disable, 2002/04/10 str r1,[r0]

[ {FALSE} ;fi

; rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);

; Led_Display

ldr r0,=GPFCON ;F口控制寄存器

ldr r1,=0x5500 ;GPF7-GPF6 output GPF5-GPF0 input str r1,[r0]

ldr r0,=GPFDAT ;F口数据寄存器

ldr r1,=0x10

str r1,[r0]

]

;2.根据工作频率设置pll

;这里介绍一下计算公式

;Fpllo=(m*Fin)/(p*2^s)

;m=MDIV+8,p=PDIV+2,s=SDIV

;Fpllo必须大于20Mhz小于66Mhz

;Fpllo*2^s必须小于170Mhz

;如下面的PLLCON设定中的M_DIV P_DIV S_DIV是取自option.h中;#elif (MCLK==40000000)

;#define PLL_M (0x48)

;#define PLL_P (0x3)

;#define PLL_S (0x2)

;所以m=MDIV+8=80,p=PDIV+2=5,s=SDIV=2

;硬件使用晶振为10Mhz,即Fin=10Mhz

;Fpllo=80*10/5*2^2=40Mhz

;To reduce PLL lock time, adjust the LOCKTIME register.

ldr r0,=LOCKTIME

ldr r1,=0xffffff

str r1,[r0]

[ PLL_ON_START

;Configure MPLL

ldr r0,=MPLLCON

ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=12MHz,Fout=50MHz str r1,[r0]

]

;Check if the boot is caused by the wake-up from POWER_OFF mode.

ldr r1,=GSTATUS2 ; GSTATUS2 复位状态寄存器

ldr r0,[r1]

tst r0,#0x2 ;判断R0 的第二位是否为0

;In case of the wake-up from POWER_OFF mode, go to POWER_OFF_WAKEUP handler.

bne WAKEUP_POWER_OFF

EXPORT StartPointAfterPowerOffWakeUp ;声明全局函数

StartPointAfterPowerOffWakeUp

;3.置存储相关寄存器的程序

;这是设置SDRAM,flash ROM 存储器连接和工作时序的程序,片选定义的程序

;SMRDATA map在下面的程序中定义

;SMRDATA中涉及的值请参考memcfg.s程序

;具体寄存器各位含义请参考s3c44b0 spec

;Set memory control registers

ldr r0,=SMRDATA

ldr r1,=BWSCON ;BWSCON Address ;BWSCON Address 起始位置依次为BANKCON0 BANKCON1 BANKCON2 ........

add r2, r0, #52 ;End address of SMRDATA

ldr r3, [r0], #4 ;;读取R0地址的数据到R3 R0=R0+4 读取SMRDATA 数组(BWSCON BANKCON0 ....)的值str r3, [r1], #4 ;读取R3的数据到R1地址内存中R1=R1+4 赋给BWSON BANKCON0 ....寄存器

cmp r2, r0

bne %B0

;Initialize stacks

bl InitStacks ;初始化堆栈

;4.设置缺省中断处理函数

; Setup IRQ handler

ldr r0,=HandleIRQ ;This routine is needed

ldr r1,=IsrIRQ ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c

str r1,[r0]

;5.复制和初始化RW和ZI区域

;Copy and paste RW data/zero initialized data

ldr r0, =|Image$$RO$$Limit| ; Get pointer to ROM data read only code

ldr r1, =|Image$$RW$$Base| ; and RAM copy readwriter data

ldr r3, =|Image$$ZI$$Base| ;zero initializ data

;6.将数据段拷贝到ram中将零初始化数据段清零跳入C语言的main函数执行到这步结束bootloader初步引导结束;Zero init base => top of initialised data

cmp r0, r1 ; Check that they are different

beq %F2 ;向前搜索->

1

cmp r1, r3 ; Copy init data R1与R3比较R1减R3

ldrcc r2, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4 cc:无符号数小于

strcc r2, [r1], #4 ;--> STRCC r2, [r1] + ADD r1, r1, #4

bcc %B1 ;;向后搜索<-

2

ldr r1, =|Image$$ZI$$Limit| ; Top of zero init segment

mov r2, #0

3

cmp r3, r1 ; Zero init

strcc r2, [r3], #4

bcc %B3

[ :LNOT:THUMBCODE ;将THUMBCODE 做逻辑非操作

bl Main ; ;转入C程序Don't use main() because ......

b .

]

[ THUMBCODE ;for start-up code for Thumb mode

orr lr,pc,#1

bx lr

CODE16

bl Main ;;转入C程序Don't use main() because ......

b .

CODE32

]

;这是上面提到的对存储寄存器初始化的数据map

;function initializing stacks 初始化堆栈

InitStacks

;Don't use DRAM,such as stmfd,ldmfd......

;SVCstack is initialized before

;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'

mrs r0,cpsr ;r0<-cpsr

bic r0,r0,#MODEMASK ;MODEMASK=0x1f 清除CPSR中的PSR位(5bit) orr r1,r0,#UNDEFMODE|NOINT ;NOINT=0XC0 禁止IRQ和FIQ中断

msr cpsr_cxsf,r1 ;UndefMode cpsr_cxsf<-r1

ldr sp,=UndefStack

orr r1,r0,#ABORTMODE|NOINT

msr cpsr_cxsf,r1 ;AbortMode

ldr sp,=AbortStack

orr r1,r0,#IRQMODE|NOINT

msr cpsr_cxsf,r1 ;IRQMode

ldr sp,=IRQStack

orr r1,r0,#FIQMODE|NOINT

msr cpsr_cxsf,r1 ;FIQMode

ldr sp,=FIQStack

bic r0,r0,#MODEMASK|NOINT

orr r1,r0,#SVCMODE

msr cpsr_cxsf,r1 ;SVCMode

ldr sp,=SVCStack

;USER mode has not be initialized. 用户模式不初始化堆栈

mov pc,lr

;The LR register won't be valid if the current mode is not SVC mode.

UMAT全过程

UMAT全过程——技术篇 1.ABAQUS中非线性问题的处理2.用户子程序接口3.用户子程序和主程序的结合4.用户材料子程序UMAT接口的原理5.UMAT子程序流程ABAQUS是怎么计算的 I.ABAQUS一共有42个用户子程序接口,15个应用程序接口,可以定义包括边界条 件,荷载条件,接触条件,材料特性以及利用用户子程序和其它应用软件进行数值交换。 1.根据ABAQUS提供的相应接口,按照FORTRAN语法自己编写的代码,是一个独立的程序单元,可以独立地被储存和编译,也能被其他程序单元引用。 I.一般结构形式 II. 一个算例中,可以用到多个用户子程序,但必须把它们放在一个以.for为扩展名的文件中。 III.运行带有用户子程序的算例的两种方法 1.在CAE中运行,在EDIT JOB菜单中的GENRAL子菜单的USERSUBROUTINE GILE对话框中选择用户子程序所在的文件 2.在https://www.360docs.net/doc/fe17303484.html,MAND中运行语法如下 IV.编制用户子程序时应注意: 1.用户子程序相互之间不能调用,可以调用用户自己编写的Fortran子程序和 ABAQUS应用程序,ABAQUS应用程序必须由用户子程序调用。编写Fortran子程序时,建议子程序以K开头,以免和ABAQUS内部程序冲突。2.用户在用户子程序中利用OPEN打开外部文件时,要注意以下两点: (1)设备号的选择有限制,只能取15~18和大于100的设备号 (2)用户需提供外部文件的绝对路径而不是相对路径。3.对于不同的用户子程序,ABAQUS调用的时间不相同,有的在每个STEP的开始,有的在结尾,有的在每个 INCREMENT的开始。(当ABAQUS在调用用户子程序时,都会把当前的STEP 和INCREMENT 利用用户子程序的两个实参KSTEP 和KINC 传给用户子程序,用户可把他们输出到外部文件中,这样可清楚知道何时调用) V.ABAQUS提供给用户定义自己的材料属性的Fortran程序接口,用户材料子程序 UMAT 通过与ABAQUS主求解程序的接口实现与ABAQUS的资料交流,输入文件中,使用“UESER MATERIAL”表示定义用户材料属性。 I.UMAT子程序采用Fortran语言编制,包括以下几个部分:子程序定义语句、 ABAQUS 定义的参数说明、用户定义的局部变量说明、用户编制的程序主体、子程序返回和结束语句。I.

C语言注释规范

C语言注释规范 1.注释原则 同一软件项目开发中,尽量保持代码注释规范和统一。 注释方便了代码的阅读和维护。 边写代码边注释,修改代码时要相应修改注释,保证注释和代码的一致性。 注释要简洁明确,不要出现形容词。 对于写的好的注释,我们将是第一个受益者。 大型软件开发中,通过别人的注释可以快速知道他人所写函数的功能,返回值,参数的使用。 2.文件头部的注释 示例: / * Program Assignment : 该文件的作用 * Author: 作者 * Date: 2013/8/6 14:34 * Description: 该文件的描述 *****/ /* * Source code in : 源代码的路径 * Function List: * initLinear 初始化线性表 * destoryLinear 释放线性表申请的空间 * isLinearEmpty 判断线性表是否为空 * isLinearFull 判断线性表是否为满 * getLinearElementValue 取得下标为index的元素的值 */ 注意:这个函数列表可以快速查询到我们想要了解的函数。 3.结构体,全局变量等的注释 示例: typedef POLYNOMIAL USER_TYPE; /* 新的数据类型的描述*/ int a; /* 全局变量的作用*/ /* 说明结构体的功能*/ typedef struct LINEAR { USER_TYPE *data; /* 每个成员的意义(作用) */ int maxRoom; /* 每个成员的意义(作用) */

int elementCount; /* 每个成员的意义(作用) */ }LINEAR; 4.函数的注释 在逻辑性较强的的地方加入注释,以便其他人的理解,在一定的程度上排除bug。 示例: /* * Function Name: getLinearElementIndex * Purpose: 取得元素的index值 * Params : * @LINEAR linear 线性表实例 * @USER_TYPE var 类型为USER_TYPE的实例 * @int (*)() cmp 提供接口,让用户定义具体比较函数 * Return: int 返回元素的index值 * Limitation: 如果返回-1,则代表不存在var的元素 */ int getLinearElementIndex(LINEAR linear, USER_TYPE var, int (*cmp)()) { /* * 如果逻辑太过复杂,这里写明该算法的过程和思路。 */ boolean found = FALSE; int i; for(i = 0; i < && !found; i++) if(cmp[i], var) == 0) found = TRUE; if(i >= i = NOT_FOUND; return i; }

ABAQUS子程序UMAT里弹塑本构的实现

前言 有限元法是工程中广泛使用的一种数值计算方法。它是力学、计算方法和计算机技术相结合的产物。在工程应用中,有限元法比其它数值分析方法更流行的一个重要原因在于:相对与其它数值分析方法,有限元法对边界的模拟更灵活,近似程度更高。所以,伴随着有限元理论以及计算机技术的发展,大有限元软件的应用证变得越来越普及。 ABAQUS软件一直以非线性有限元分析软件而闻名,这也是它和ANSYS,Nastran等软件的区别所在。非线性有限元分析的用处越来越大,因为在所用材料非常复杂很多情况下,用线性分析来近似已不再有效。比方说,一个复合材料就不能用传统的线性分析软件包进行分析。任何与时间有关联,有较大位移量的情况都不能用线性分析法来处理。多年前,虽然非线性分析能更适合、更准确的处理问题,但是由于当时计算设备的能力不够强大、非线性分析软件包线性分析功能不够健全,所以通常采用线性处理的方法。 这种情况已经得到了极大的改善,计算设备的能力变得更加强大、类似ABAQUS这样的产品功能日臻完善,应用日益广泛。 非线性有限元分析在各个制造行业得到了广泛应用,有不少大型用户。航空航天业一直是非线性有限元分析的大客户,一个重要原因是大量使用复合材料。新一代波音 787客机将全部采用复合材料。只有像 ABAQUS这样的软件,才能分析包括多个子系统的产品耐久性能。在汽车业,用线性有限元分析来做四轮耐久性分析不可能得到足够准确的结果。分析汽车的整体和各个子系统的性能要求(如悬挂系统等)需要进行非线性分析。在土木工程业, ABAQUS能处理包括混凝土静动力开裂分析以及沥青混凝土方面的静动力分析,还能处理高度复杂非线性材料的损伤和断裂问题,这对于大型桥梁结构,高层建筑的结构分析非常有效。 瞬态、大变形、高级材料的碰撞问题必须用非线性有限元分析来计算。线性分析在这种情况下是不适用的。以往有一些专门的软件来分析碰撞问题,但现在ABAQUS在通用有限元软件包就能解决这些问题。所以,ABAQUS可以在一个软件完成线性和非线性分析。 ABAQUS给用户提供了强大二次开发接口,尤其是在材料本构方面,给用户开发符合实际工程的材料本构模型提供了强大帮助,本文将针对其用户材料子程序展开研究,总结常用材料模型的开发方法。

程序代码注释编写规范

程序代码注释编写规范 为提高控制程序的阅读性与可理解性,现制定相关代码程序代码注释编写的编写规范。 一般情况下,源程序有效注释量必须在20%以上,注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。 常规注释有以下两种方式。 单行:以"//"符号开始,任何位于该符号之后的本行文字都视为注释。 多行:以"/*"符号开始,以"*/"结束。任何介于这对符号之间的文字都视为注释。 一、说明性文件 说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。 示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************* COPYRIGHT (C), MicTiVo International. Co., Ltd. File NAME: // 文件 Author: Version: Date: // 作者、版本及完成日期 DESCRIPTION: // 用于详细说明此程序文件完成的主要功能,与其他模块 // 或函数的接口,输出值、取值范围、含义及参数间的控 // 制、顺序、独立或依赖等关系 Others: // 其它内容的说明 Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明 1.... History: // 修改历史记录列表,每条修改记录应包括修改日期、修改 // 者及修改内容简述 1. Date: Author: Modification: 2. .. *************************************************/ 二、源文件头 源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。 示例:下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************************ COPYRIGHT (C), MicTiVo International. Co., Ltd. FileName: Author:

abaqus简单umat子程序

SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,RPL,DDSDDT, 1 DRPLDE,DRPLDT,STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED, 2 CMNAME,NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,DROT, 3 PNEWDT,CELENT,DFGRD0,DFGRD1,NOEL,NPT,LAYER,KSPT,KSTEP,KINC) include 'aba_param.inc' CHARACTER*8 CMNAME DIMENSION STRESS(NTENS),STATEV(NSTATV),DDSDDE(NTENS,NTENS), 1 DDSDDT(NTENS),DRPLDE(NTENS),STRAN(NTENS),DSTRAN(NTENS), 2 TIME(2),PREDEF(1),DPRED(1),PROPS(NPROPS),COORDS(3),DROT(3,3), 3 DFGRD0(3,3),DFGRD1(3,3) C UMAT FOR ISOTROPIC ELASTICITY C CANNOT BE USE D FOR PLAN E STRESS C ---------------------------------------------------------------- C PROPS(1) - E C PROPS(2) - NU C ---------------------------------------------------------------- C IF (NDI.NE.3) THEN WRITE (*,*) 'THIS UMAT MAY ONLY BE USED FOR ELEMENTS 1 WITH THREE DIRECT STRESS COMPONENTS' CALL XIT ENDIF open(400,file='D:\test.txt') C ELASTIC PROPERTIES EMOD=PROPS(1) ENU=PROPS(2) EBULK3=EMOD/(1-2*ENU) EG2=EMOD/(1+ENU) EG=EG2/2 EG3=3*EG ELAM=(EBULK3-EG2)/3 write(400,*) 'temp=',temp C ELASTIC STIFFNESS C DO K1=1, NDI DO K2=1, NDI DDSDDE(K2, K1)=ELAM END DO DDSDDE(K1, K1)=EG2+ELAM

程序代码注释编写规范

程序代码注释编写规范 XXX份公司

为提高控制程序的阅读性与可理解性,现制定相关代码程序代码注释编写的编写规范。 一般情况下,源程序有效注释量必须在20%以上,注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。 常规注释有以下两种方式。 单行:以"//"符号开始,任何位于该符号之后的本行文字都视为注释。 多行:以"/*"符号开始,以"*/"结束。任何介于这对符号之间的文字都视为注释。 一、说明性文件 说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。 示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************* COPYRIGHT (C), MicTiVo International. Co., Ltd. File NAME: // 文件 Author: Version: Date: // 作者、版本及完成日期 DESCRIPTION: // 用于详细说明此程序文件完成的主要功能,与其他模块 // 或函数的接口,输出值、取值范围、含义及参数间的控 // 制、顺序、独立或依赖等关系 Others: // 其它内容的说明 Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明 1.... History: // 修改历史记录列表,每条修改记录应包括修改日期、修改 // 者及修改内容简述 1. Date: Author: Modification: 2. .. *************************************************/ 二、源文件头 源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。 示例:下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************************

ABAQUS-二次开发资料-UMAT

各个楼层及内容索引 2-------------------------------------什么是UMAT 3-------------------------------------UMAT功能简介 4-------------------------------------UMAT开始的变量声明 5-------------------------------------UMAT中各个变量的详细解释 6-------------------------------------关于沙漏和横向剪切刚度 7-------------------------------------UMAT流程和参数表格实例展示 8-------------------------------------FORTRAN语言中的接口程序Interface 9-------------------------------------关于UMAT是否可以用Fortran90编写的问题 10-17--------------------------------Fortran77的一些有用的知识简介 20-25\30-32-----------------------弹塑性力学相关知识简介 34-37--------------------------------用户材料子程序实例JOhn-cook模型压缩包下载 38-------------------------------------JOhn-cook模型本构简介图 40-------------------------------------用户材料子程序实例JOhn-cook模型完整程序+david详细注解[欢迎大家来看看,并提供意见,完全是自己的diy的,不保证完全正确,希望共同探讨,以便更正,带"?"部分,还望各位大师\同仁指教] 1什么是UMAT??? 1.1 UMAT功能简介!!![-摘自庄茁老师的书 UMAT子程序具有强大的功能,使用UMAT子程序: (1)可以定义材料的本构关系,使用ABAQUS材料库中没有包含的材料进行计算,扩充程序 功能。ABAQUS软件2003年度用户年会论文集 (2)几乎可以用于力学行为分析的任何分析过程,几乎可以把用户材料属性赋予ABAQUS中 的任何单元; (3)必须在UMAT中提供材料本构模型的雅可比(Jacobian)矩阵,即应力增量对应变增量 的变化率。 (4)可以和用户子程序“USDFLD”联合使用,通过“USDFLD”重新定义单元每一物质点上传 递到UMAT中场变量的数值。 1.2 UMAT开始的变量声明 由于主程序与UMAT之间存在数据传递,甚至共用一些变量,因此必须遵守有关书写格式,UMAT中常用的变量在文件开头予以定义,通常格式为: SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD, 1 RPL,DDSDDT,DRPLDE,DRPLDT, 2STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,CMNAME 3 NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,DROT,PNEWDT,

C语言编写规范之注释

1、头文件包含Includes 2、私有类型定义 Private typedef 3、私有定义Private define 4、私有宏定义 Private macro 5、私有变量 Private variables 6、私有函数原型Private function prototypes 7、私有函数Private functions 8、私有函数前注释 /****************************************************************************** * * Function Name : FSMC_NOR_Init * Description : Configures the FSMC and GPIOs to interface with the NOR memory. * This function must be called before any write/read operation * on the NOR. * Input : None * Output : None * Return : None ******************************************************************************* / 9、程序块采用缩进风格编写,缩进空格为4。 10、相对独立的程序块之间、变量说明之后必须加空行; 11、较长的字符(>80字符)要分成多行书写,长表达式要在低优先级操作符划分新行,操作符放在新行之首,新行要恰当缩进,保持排版整齐; 12、循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首; 13、若函数或过程中的参数较长,则要进行适当的划分。 14、不允许把多个短语句写在一行中,即一行只写一条语句。 15、if、for、do、while、case、switch、default等语句自占一行,且if、for、 do、while等语句的执行语句部分无论多少都要加括号{}。 16、对齐只使用空格键,不使用TAB键; 17、 函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case 语句下的情况处理语句也要遵从语句缩进要求 18、 程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一 列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以 及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。 19、 在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或

程序源代码注释规范

程序注释规范说明 程序注释规范应包括以下三方面: 一、文件头部注释 在代码文件的头部进行注释,这样做的好处在于,我们能对代码文件做变更跟踪。在代码头部分标注出创始人、创始时间、修改人、修改时间、代码的功能,这在团队开发中必不可少,它们可以使后来维护/修改的同伴在遇到问题时,在第一时间知道他应该向谁去寻求帮助,并且知道这个文件经历了多少次迭代、经历了多少个程序员的开发和修改。 样本: /***************************************************** ** 作者:Liuchao ** 创始时间:2007-11-12 ** 修改人:Liuchao ** 修改时间:2007-11-12 ** 修改人:Liaochao ** 修改时间:2007-11-12 ** 描述: ** 主要用于产品信息的资料录入,… *****************************************************/ 二、函数、属性、类等注释 请使用///三斜线注释,这种注释是基于XML的,不仅能导出XML制作帮助文档,而且在各个函数、属性、类等的使用中,编辑环境会自动带出注释,方便你的开发。以protected,protected Internal,public声明的定义注释都建议以这样命名方法。 例如: ///

/// 用于从ERP系统中捞出产品信息的类 ///

class ProductTypeCollector { … } 三、逻辑点注释 在我们认为逻辑性较强的地方加入注释,说明这段程序的逻辑是怎样的,以方便我们自己后来的理解以及其他人的理解,并且这样还可以在一定程度上排除BUG。在注释中写明我们的逻辑思想,对照程序,判断程序是否符合我们的初衷,如果不是,则我们应该仔细思考耀修改的是注释还是程序了… 四、变量注释 我们在认为重要的变量后加以注释,说明变量的含义,以方便我们自己后来的理解以及其他人的理解,并且这样还可以在一定程度上排除BUG.我们常用///三斜线注释。 /// 用于从ERP系统中捞出产品信息的类 class ProductTypeCollector { int STData;/// … }

Abaqus材料用户子程序UMAT基础知识与手册例子完整解释

1、为何需要使用用户材料子程序(User-Defined Material, UMAT )? 很简单,当ABAQUS 没有提供我们需要的材料模型时。所以,在决定自己定义一种新的材料模型之前,最好对ABAQUS 已经提供的模型心中有数,并且尽量使用现有的模型,因为这些模型已经经过详细的验证,并被广泛接受。 UMAT 子程序具有强大的功能,使用UMAT 子程序: (1)可以定义材料的本构关系,使用ABAQUS 材料库中没有包含的材料进行计算,扩充程序功能。 (2) 几乎可以用于力学行为分析的任何分析过程,几乎可以把用户材料属性赋予ABAQU S 中的任何单元。 (3) 必须在UMAT 中提供材料本构模型的雅可比(Jacobian )矩阵,即应力增量对应变增量的变化率。 (4) 可以和用户子程序“USDFLD ”联合使用,通过“USDFLD ”重新定义单元每一物质点上传递到UMAT 中场变量的数值。 2、需要哪些基础知识? 先看一下ABAQUS 手册(ABAQUS Analysis User's Manual )里的一段话: Warning: The use of this option generally requires considerable expertise(一定的专业知识). The user is cautioned that the implementation (实现) of any realistic constitutive (基本) model requires extensive (广泛的) development and testing. Initial testing on a single eleme nt model with prescribed traction loading (指定拉伸载荷) is strongly recommended. 但这并不意味着非力学专业,或者力学基础知识不很丰富者就只能望洋兴叹,因为我们的任务不是开发一套完整的有限元软件,而只是提供一个描述材料力学性能的本构方程(Constitutive equation )而已。当然,最基本的一些概念和知识还是要具备的,比如: 应力(stress),应变(strain )及其分量; volumetric part 和deviatoric part ;模量(modul us )、泊松比(Poisson’s ratio)、拉梅常数(Lame constant);矩阵的加减乘除甚至求逆;还有一些高等数学知识如积分、微分等。 3、UMAT 的基本任务? 我们知道,有限元计算(增量方法)的基本问题是: 已知第n 步的结果(应力,应变等)n σ,n ε,然后给出一个应变增量1+n d ε,计算新的应力1+n σ。UMAT 要完成这一计算,并要计算Jacobian 矩阵DDSDDE(I,J) =εσΔ?Δ?/。σΔ是应力增量矩阵(张量或许更合适),εΔ是应变增量矩阵。DDSDDE(I,J) 定义了第J 个应变分量的微小变化对

UMAT子程序在复合材料强度分析中的应用

UMAT子程序在复合材料强度分析中 的应用 本例使用UMAT用户子程序进行复合材料单层板的应力分析和渐进损伤压缩强度分析,介绍UMA T用户子程序编写方法及在Abaqus/CAE中的设置。本章使用最大应变强度理论作为复合材料单层板的失效准则,相应的Fortran程序简单易读,便于理解UAMT子程序的工作原理。 知识要点: 强度分析 UMAT用户子程序 最大应变理论 刚度折减讲师:孔祥宏 版本:Abq 6.14 难度: 关键词:强度分析,UMAT

『 2 』 第&章复合材料分析入门 &.1 本章内容简介 本章通过两个实例介绍UMAT用户子程序在复合材料单层板的应力分析和强度分析中的应用。在第一个实例中,对一个简单的复合材料单层板进行应力分析,UMAT子程序主要计算应力,不进行强度分析,本例用于验证UMA T子程序的计算精度。在第二个实例中,对复合材料单层板进行渐进损伤强度分析,UMAT子程序用于应力计算、强度分析和刚度折减。 本章所用复合材料为T700/BA9916,材料属性如表&-1所示。 表&-1 T700/BA9916材料属性 参数值强度值 E1/GPa 114 X T/MPa 2688 E2/GPa 8.61 X C/MPa 1458 E3/GPa 8.61 Y T/MPa 69.5 μ120.3 Y C/MPa 236 μ130.3 Z T/MPa 55.5 μ230.45 Z C/MPa 175 G12/GPa 4.16 S XY/MPa 136 G13/GPa 4.16 S XZ/MPa 136 G23/GPa 3.0 S YZ/MPa 95.6

java注释规范总结大全

在软件开发的过程中总是强调注释的规范,但是没有一个具体的标准进行说明,通常都是在代码编写规范中简单的描述几句,不能作为一个代码注释检查的标准和依据,做什么都要有一个依据吗:),现在我特整理了一个《Java的注释规范》,内容来自网络、书籍和自己的实际积累。 JA V A注释规范 版本/状态作者版本日期 1.0 ghc 2008-07-02 一、背景 1、当我们第一次接触某段代码,但又被要求在极短的时间内有效地分析这段代码,我们需要什么样的注释信息? 2、怎么样避免我们的注释冗长而且凌乱不堪呢? 3、在多人协同开发、维护的今天,我们需要怎么样的注释来保证高质、高交的进行开发和维护工作呢? 二、意义 程序中的注释是程序设计者与程序阅读者之间通信的重要手段。应用注释规范对于软件本身和软件开发人员而言尤为重要。并且在流行的敏捷开发思想中已经提出了将注释转为代码的概念。好的注释规范可以尽可能的减少一个软件的维护成本, 并且几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护。好的注释规范可以改善软件的可读性,可以让开发人员尽快而彻底地理解新的代码。好的注释规范可以最大限度的提高团队开发的合作效率。长期的规范性编码还可以让开发人员养成良好的编码习惯,甚至锻炼出更加严谨的思维能力。 三、注释的原则 1、注释形式统一 在整个应用程序中,使用具有一致的标点和结构的样式来构造注释。如果在其他项目组发现他们的注释规范与这份文档不同,按照他们的规范写代码,不要试图在既成的规范系统中引入新的规范。 2、注释的简洁 内容要简单、明了、含义准确,防止注释的多义性,错误的注释不但无益反而有害。 3、注释的一致性 在写代码之前或者边写代码边写注释,因为以后很可能没有时间来这样做。另外,如果有机会复查已编写的代码,在今天看来很明显的东西六周以后或许就不明显了。通常描述性注释先于代码创建,解释性注释在开发过程中创建,提示性注释在代码完成之后创建。修改代码的同时修改相应的注释,以保证代码与注释的同步。 4、注释的位置 保证注释与其描述的代码相邻,即注释的就近原则。对代码的注释应放在其上方相邻或右方的位置,不可放在下方。避免在代码行的末尾添加注释;行尾注释使代码更难阅读。不过在批注变量声明时,行尾注释是合适的;在这种情况下,将所有行尾注释要对齐。 5、注释的数量 注释必不可少,但也不应过多,在实际的代码规范中,要求注释占程序代码的比例达到20%左右。注释是对代码的“提示”,而不是文档,程序中的注释不可喧宾夺主,注释太多了会让人眼花缭乱,注释的花样要少。不要被动的为写注释而写注释。 6、删除无用注释

代码编写规范说明书

代码编写规范说明书(c#.net与https://www.360docs.net/doc/fe17303484.html,)目录 1 目的 2 范围 3 注释规范 3.1 概述 3.2 自建代码文件注释 3.3 模块(类)注释 3.4 类属性注释 3.5 方法注释 3.6 代码间注释 4 命名总体规则 5 命名规范 5.1 变量(Variable)命名 5.2 常量命名 5.3 类(Class)命名 5.4 接口(Interface)命名 5.5 方法(Method)命名 5.6 名称空间Namespace)命名 6 编码规则 6.1 错误检查规则 6.2 大括号规则 6.3 缩进规则 6.4 小括号规则 6.5 If Then Else规则 6.6 比较规则 6.7 Case规则 6.8 对齐规则 6.9 单语句规则 6.10 单一功能规则 6.11 简单功能规则 6.12 明确条件规则 6.13 选用FALSE规则 6.14 独立赋值规则 6.15 定义常量规则 6.16 模块化规则 6.17 交流规则 7 编程准则 7.1 变量使用 7.2 数据库操作 7.3 对象使用 7.4 模块设计原则 7.5 结构化要求 7.6 函数返回值原则 8 代码包规范 8.1 代码包的版本号

8.2 代码包的标识 9 代码的控制 9.1 代码库/目录的建立 9.2 代码归档 10 输入控制校验规则 10.1 登陆控制 10.2 数据录入控制 附件1:数据类型缩写表 附件2:服务器控件名缩写表 1 目的 一.为了统一公司软件开发设计过程的编程规范 二.使网站开发人员能很方便的理解每个目录,变量,控件,类,方法的意义 三.为了保证编写出的程序都符合相同的规范,保证一致性、统一性而建立的程序编码规范。 四.编码规范和约定必须能明显改善代码可读性,并有助于代码管理、分类范围适用于企业所有基于.NET平台的软件开发工作 2 范围 本规范适用于开发组全体人员,作用于软件项目开发的代码编写阶段和后期维护阶段。 3 注释规范 3.1 概述 a) 注释要求英文及英文的标点符号。 b) 注释中,应标明对象的完整的名称及其用途,但应避免对代码过于详细的描述。 c) 每行注释的最大长度为100个字符。 d) 将注释与注释分隔符用一个空格分开。 e) 不允许给注释加外框。 f) 编码的同时书写注释。 g) 重要变量必须有注释。 h) 变量注释和变量在同一行,所有注释必须对齐,与变量分开至少四个“空格”键。 如:int m_iLevel,m_iCount; // m_iLevel ....tree level // m_iCount ....count of tree items string m_strSql; //SQL i) 典型算法必须有注释。 j) 在循环和逻辑分支地方的上行必须就近书写注释。 k) 程序段或语句的注释在程序段或语句的上一行 l) 在代码交付之前,必须删掉临时的或无关的注释。 m) 为便于阅读代码,每行代码的长度应少于100个字符。 3.2 自建代码文件注释 对于自己创建的代码文件(如函数、脚本),在文件开头,一般编写如下注释: /****************************************************** FileName: Copyright (c) 2004-xxxx *********公司技术开发部 Writer: create Date: Rewriter:

一起学习UMAT 的一些公式注释

一起学习UMAT的一些公式注释 ZHANG chunyu herrliubs comments in formulas 知识积累和储备 在进行ABAQUS子程序UMAT的编写前,要弄清楚:ABAQUS调用UMAT子程序流程;要建立的材料模型的本构关系和屈服准则等;UMAT子程序中相关参数、以及矩阵的表达。 主要求解过程:每一个增量步开始,ABAQUS主程序在单元积分点上调用UMAT 子程序,并转入应变增量、时间步长及荷载增量,同时也传入当前已知的状态的应力、应变及其他求解过程相关的变量;UMAT子程序根据本构方程求解应力增量及其他相关的变量,提供Jacobian矩阵给ABAQUS主程序以形成整体刚度矩阵;主程序结合当前荷载增量求解位移增量,继而进行平衡校核;如果不满足指定的误差,ABAQUS将进行迭代直到收敛,然后进行下一增量步的求解。 弹性力学相关知识(基本) 仿真论坛(https://www.360docs.net/doc/fe17303484.html,/forum.php ... &highlight=UMAT) ABAQUS二次开发版块这个人帖子结合例子,列出了弹性力学的基本公式。 UMAT变量含义 UMAT中可以得到的量增量步开始时刻的,应力(Stress),应变(Strain), 状态变量(Solution-dependent state variables (SDVs)) 增量步开始时刻的,应变增量(Strain increment),转角增量(Rotation increment),变形梯度(Deformation gradient) 时间总值及增量(Total and incremental values of time),温度(Temperature),用户定义场变量 材料常数,材料点的位置,特征单元长度 当前分析步,增量步 必须定义的变量应力,状态变量,材料Jacobian矩阵(本构关系) 可以定义的变量应变能,塑性耗能,蠕变耗能 新建议的时间增量 变量分类 UMAT中可以直接调用(Call ……)的子程序或子函数 SINV(STRESS,SINV1,SINV2,NDI,NSHR)——用于计算应力不变量。其中:SINV1=第一应力不变量;SINV2=第二应力不变量。 SPRINC(S,PS,LSTR,NDI,NSHR)——用于计算主应力或应变值。其中:S=应力或应变张量;PS(I),I=1,2,3, 主应力或应变值;LSTR=标识,1表示S为应力张量,2表示S为应变张量。 SPRIND(S,PS,AN,LSTR,NDI,NSHR)——用于计算主应力或应变的方向。其中:AN(K1,I),I=1,2,3,表示PS(K1)的法向的方向余弦。 ROTSIG(S,R,SPRIME,LSTR,NDI,NSHR)——用于复原已旋转的张量。其中:R=转角矩阵;SPRIME=已旋转的应力或应变张量。XIT——用于停止分析,并关闭所有与分析相关的文件。 Variables Define STRESS(NTENS)该增量步开始之前的应力向量,在增量步结束之后,必须进行更新。如果指定了初始应力,则该向量在分析开始始将保持初始应力。真实Cauchy 应力。需要定义的变量,在所有分析情况下均适用。

代码注释规范说明

Comments criterion of the Code 在多个PROJIECT共同开发的前提下,为了减少修改升级CODE过程中出现失误和方便SI 人员对代码的维护,加强部门整体代码注释规范,建议通过在每一次代码修改过程中添加代码标志符进行注释,这样可以使软件工程师在升级代码的过程中减少错误率,同时可以保持对以前版本代码的修改思路清晰,能在最短时间里复查代码中的错误。 标准C++/C的文件结构: // Copyright (c) Microsoft Corporation. All rights reserved. // Use of this source code is subject to the terms of the Microsoft end-user // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT. // If you did not accept the terms of the EULA, you are not authorized to use // this source code. For a copy of the EULA, please see the LICENSE.RTF on your // install media. /** * Port Copyright (c) Hisys Corporation. All rights reserved. * @file batt_pdd.c * Abstract * This file contains battery driver PDD implementation. * Change Log * 2006.2.21 Shi Yuehua Initial Version * **/ 代码注释规范如下: //***********COMMENTS-HISTORY***********// /****************************************************************************** *NAME | SIGN | PROJECT | SUMMARY * *------------------------------------------------------------------------------ *Johson.Li M060806_A HXS006 Use the two methods to measure the battery voltage. *Johson.Li M060812_A HXS010 Change the init array value from 4 to 8. *Johson.Li M060812_B COMMON Change the USB CHANGING conditions. * ........... * ........... ******************************************************************************/ 代码注释标题声明包含四部分: 1.作者名称 2.标记符 3.项目名称 4.摘要 1.《NAME》:修改该部分CODE的软件人员名称(英文名称&中文名称拼音缩写),第一个字母大写。 2.《SIGN》:该标记符应在所有本次修改代码前面声明,主要是为了方便搜索,当我们想查找本次为了实现某个功能所做的代码修改时,可以搜索此标记符,即可找到全部修改过的相关代码段。 标记符:M060806_A M: 英文缩写 060806:代表修改日期为2006.08.06 A:代表当天添加或者修改的第一项功能。如果当日继续做其他有别与本次功能差异的修改,可以采用M060806_B的方法,依次类推(A、B、C、D、E、F……) .

UMAT符号说明

******************************************************************** inp ********************************************************* *MATERIAL, NAME= <用户自定义材料的名称> *USER MATERIAL, CONSTANTS= 8<需输入的变量个数>,(UNSYMN) 30.E6, 0.3, 30.E3, 0., 40.E3, 0.1, 50.E3, 0.5 <依次给出需输入的变量的值> *DEPVAR 13 <定义求解过程中的状态变量(SDVs)需要的存储空间,即状态变量个数,=NSTATV> *INITIAL CONDITIONS, TYPE=SOLUTION <依次给出状态变量的值,也可不写> *USER SUBROUTINES,(INPUT=) ******************************************************************** Fortran程序 ************************************************ SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD, 1 RPL,DDSDDT,DRPLDE,DRPLDT, 2 STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,CMNAME, 3 NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,DROT,PNEWDT, 4 CELENT,DFGRD0,DFGRD1,NOEL,NPT,LAYER,KSPT,KSTEP,KINC) C INCLUDE 'ABA_PARAM.INC' C CHARACTER*80 CMNAME DIMENSION STRESS(NTENS),STATEV(NSTATV), 1 DDSDDE(NTENS,NTENS),DDSDDT(NTENS),DRPLDE(NTENS), 2 STRAN(NTENS),DSTRAN(NTENS),TIME(2),PREDEF(1),DPRED(1), 3 PROPS(NPROPS),COORDS(3),DROT(3,3),DFGRD0(3,3),DFGRD1(3,3) user coding to define DDSDDE, STRESS, STATEV, SSE, SPD, SCD and, if necessary, RPL, DDSDDT, DRPLDE, DRPLDT, PNEWDT RETURN END

相关文档
最新文档