tag 标签: 定义

相关博文
  • 热度 14
    2015-1-5 22:27
    783 次阅读|
    0 个评论
    第一天,fpga的输入端信号 不可以直接定义为线网类型,可以定义一个新名称为线网类型,再让输入端信号赋值等于它即可,quartus ii中的signal tap ii中综合下载程序,需要把生成的stp文件给勾掉,在setting选项中设置,还有电平转换时,选择电平转换芯片时需要考虑到驱动能力是否足够大,一般化xilinx中默认的没有用到的IO管脚需要设置为上拉或者下拉状态。
  • 热度 20
    2014-9-16 11:27
    2909 次阅读|
    0 个评论
      常用ARM指令及汇编包括   1、ARM处理器寻址方式 2、指令集介绍 3、伪指令 4、ARM汇编程序设计 5、C与汇编混合编程   ARM处理器寻址方式   1、寄存器寻址:操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值操作 MOV  R1, R2       ;R2-R1 SUB  R0, R1,R2    ;R1-R2 - R0   2、立即寻址:立即寻址指令中的操作码字段后面的地址码部分就是操作数本身,也就是说,数据就包含在指令当中,取出指令就取出了可以立即使用的操作数 SUBS R0,R0,#1      ;R0-1 - R0 MOV  R0,#0xff00    ;0xff00 - R0 注:立即数要以"#"为前缀,表示16进制数值时以"0x"表示   3、寄存器偏移寻址:是ARM指令集特有的寻址方式,当第2操作数是寄存器偏移方式时,第2个寄存器操作数在与第1个操作数结合之前选择进行移位操作 MOV  R0,R2,LSL #3       ;R2的值左移3位,结果存入R0,即R0 = R2 * 8 ANDS R1,R1,R2,LSL R3   ;R2的值左移R3位,然后和R1相与操作,结果放入R1   寄存器偏移寻址可采用的移位操作如下 (1)、LSL(Logical Shift Left)逻辑左移,寄存器中字的低端空出补0 (2)、LSR(Logical Shift Right)逻辑右移,寄存器中字的高端空出补0 (3)、ASR(Arthmetic Shift Right)算术右移,移位中保持符号位不变,即如果源操作数为正数,字高端空出补0,否则补1 (4)、ROR(Rotate Right)循环右移,由字的低端移出的位填入高端空出的位 (5)、RRX(Rotate Right eXtended by 1 place),操作数右移一位,左侧空位由CPSR的C填充   4、寄存器间接寻址:寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针 LDR R1,    ;将R2中的数值作为地址,取出此地址中的数据保存在R1中 SWP R1,R1, ;将R2中的数值作为地址,取出此地址中的数值与R1中的值交换   5、基址寻址:将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器访问等。 LDR R2,    ;将R3的数值加0x0F作为地址,取出此地址的数值保存在R2中 STR R1,      ;将R0中的数值减2作为地址,把R1中的内容保存到此地址位置   6、多寄存器寻址:一次可以传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器 LDMIA R1!,{R2-R7,R12}  ;将R1所指向的地址的数据读出到R2-R7,R12,R1自动更新 STMIA R0!,{R3-R6,R10}  ;将R3-R6,R10中的数值保存到R0指向的地址,R0自动更新   7、堆栈寻址:堆栈是特定顺序进行存取的存储区,堆栈寻址时隐含的使用一个专门的寄存器(堆栈指针),指向一块存储区域(堆栈),存储器堆栈可分为两种: 向上生长:向高地址方向生长,称为递增堆栈 向下生长:向低地址方向生长,称为递减堆栈 如此可结合出四中情况: 1、满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址,指令如 LDMFA,STMFA 2、空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置,指令如 LDMEA,STMEA 3、满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址,指令如 LDMFD,STMFD 4、空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置,指令如 LDMED,STMED STMFD SP!,{R1-R7,LR}  ;将R1-R7,LR入栈,满递减堆栈 LDMFD SP!,{R1-R7,LR}  ;数据出栈,放入R1-R7,LR寄存器,满递减堆栈   8、块拷贝寻址:多寄存器传送指令用于一块数据从存储器的某一位置拷贝到另一位置 STMIA R0!,{R1-R7}     ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,方向为向上增长 STMIB R0!,{R1-R7}     ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,方向为向上增长 SIMDA R0!,{R1-R7}     ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,方向为向下增长 STMDB R0!,{R1-R7}     ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,方向为向下增长 不论是向上还是向下递增,存储时高编号的寄存器放在高地址的内存,出来时,高地址的内容给编号高的寄存器   9、相对寻址:是基址寻址的一种变通,由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址 BL ROUTE1    ;调用到 ROUTE1 子程序 BEQ LOOP     ;条件跳转到 LOOP 标号处   ================================================================================================================ 指令集介绍   指令格式:opcode {cond}{S}Rd,Rn,{operand2} 其中内的项是必须的,{}内的项是可选的 opcode   指令助记符,如 LDR,STR等 cond     执行条件,如 EQ,NE等 S        是否影响CPSR寄存器的值,书写时影响CPSR,否则不影响 Rd       目标寄存器 Rn       第一个操作数的寄存器 operand2 第二个操作数   指令格式举例如下: LDR R0,       ;读取R1地址上的存储器单元内容,执行条件AL(无条件执行) BEQ DATAEVEN      ;跳转指令,执行条件EQ,即相等跳转到DATAEVEN ADDS R1,R1,#1     ;加法指令,R1+1 = R1 影响CPSR寄存器,带有S SUBNES R1,R1,#0xD ;条件执行减法运算(NE),R1-0xD = R1,影响CPSR寄存器,带有S   条件码表 条件码助记符 标志 含义 EQ Z=1 相等 NE Z=0 不相等 CS/HS C=1 无符号数大于或等于 CC/LO C=0 无符号数小于 MI N=1 负数 PL N=0 正数 VS V=1 溢出 VC V=0 没有溢出 HI C=1,Z=0 无符号数大于 LS C=0,Z=1 无符号数小于或等于 GE N=V 带符号数大于或等于 LT N!=V 带符号数小于 GT Z=0,N=V 带符号数大于 LE Z=1,N!=V 带符号数小于或等于 AL   任何无条件执行(指令默认条件) 条件码应用举例: 1、比较两个值大小,C代码如下: if(ab) a++; else b++; 写出相应的ARM指令 代码如下:设R0为a,R1为b CMP R0, R1              ; R0与R1比较 ADDHI R0,R0,#1      ; 若R0R1,则R0=R0+1 ADDLS R1,R1,#1     ; 若R0=R1,则R1=R1+1   2、若两个条件均成立,则将这两个数值相加 C代码为: if((a!=10)(b!=20)) a=a+b; 对应的ARM指令为: CMP R0,#10     ;比较R0是否为10 CMPNE R1,#20  ;若R0不为10,则比较R1是否为20 ADDNE R0,R0,R1; 若R0不为10且R1不为20,则执行 R0 = R0+R1   3、若两个条件有一个成立,则将这两个数值相加 C代码为: if((a!=10)||(b!=20)) a=a+b; 对应的ARM指令为: CMP R0,#10      CMPEQ R1,#20   ADDNE R0,R0,R1 ARM存储访问指令: LDR、STR、LDM、STM、SWP LDR/STR:加载/存储字和无符号字节指令 从寻址方式的地址计算方法分,加载/存储指令有以下4种形式: 1,零偏移:LDR Rd, 2,前索引偏移: LDR Rd, !,LDR Rd, Rn不允许为R15 3,程序相对偏移:LDR Rd,label,label为程序标号,该形式不能使用后缀! 4,后索引偏移: LDR Rd, ,#0x04,Rn不允许是R15   指令举例如下: LDR R2,     ;加载R5指定地址上的数据(字),放入R2中 STR R1,    ;将R1的数据存储到 R0+0x04存储单元,R0的值不变 (若有!,则R0就要更新) LDRB R3, ,#1    ;读取R2地址上的一字节数据并保存到R3中,R2=R2+1 STRH R1, !   ;将R1的数据保存到R0+2的地址中,只存储低2字节数据,R0 =R0+2 LDM和STM是批量加载/存储指令,LDM为加载多个寄存器,STM为存储多个寄存器,主要用途是现场保护,数据复制、参数传递等,其模式有8种,前4种用于数据块的传输,后4种用于堆栈操作  IA:每次传送后地址加4 IB:每次传动前地址加4 DA:每次传送后地址减4 DB:每次传送前地址减4 FD:满递减堆栈 ED:空递增堆栈 FA:满递增堆栈 EA:空递增堆栈   批量加载/存储指令举例如下: LDMIA R0!,{R3-R9}     ;加载R0指向的地址上的多字数据,保存到R3-R9中,R0值更新 STMIA R1!,{R3-49}     ;将R3-R9的数据存储到R1指向的地址上,R1值更新 STMFD SP!,{R0-R7,LR}  ; 现场保存,将R0~R7、LR入栈 LDMFD SP!,{R0-R7,PC}^ ;恢复现场,异常处理返回   使用LDM/STM进行数据复制 LDR R0,=SrcData    ;设置源数据地址,LDR此时作为伪指令加载地址要加 = LDR R1,=DstData    ;设置目标地址 LDMIA R0,{R2-R9}   ;加载8字数据到寄存器R2 ~ R9 STMIA R1,{R2-R9}   ;存储寄存器R2-R9到目标地址上   使用LDM/STM进行现场保护,常用在子程序或异常处理中 STMFD SP!,{R0-R7,LR} ;寄存器入栈 ..... BL DELAY             ;调用DELAY子程序 ..... LDMFD SP!,{R0-R7,PC} ;恢复寄存器,并返回     SWP是寄存器和存储器交换指令,可使用SWP实现信号量操作 12C_SEM EQU 0x40003000   ;EQU定义一个常量 12C_SEM_WAIT             ;标签 MOV R1,#0 LDR R0,=12C_SEM           SWP R1,R1,           ;取出信号量,并设置为0 CMP R1,#0                ;判断是否有信号 BEQ 12C_SEM_WAIT         ;若没有信号,则等待 ARM数据处理指令包括 1、数据传送指令 2、算术逻辑运算指令 3、比较指令 4、乘法指令   ADC指令:带进位加法指令,将操作数2的数据与Rn的值相加,再加上CPSR中C条件标志位,结果保存到Rd中 使用ADC指令实现64位加法 ADDS R0,R0,R2   ; R0+R2 = R0,影响CPSR中的值 ADC  R1,R1,R3   ;(R1、R0) = (R1、R0)+(R3、R2) SBC指令:带借位减法指令,用寄存器Rn减去操作数2,再减去CPSR中的C条件标志位的非(即若C标志清零,则结果减去1),结果保存在Rd中 使用SBC实现64位减法 SUBS R0,R0,R2 SBC  R1,R1,R3  ;使用SBC实现64位减法,(R1,R0) - (R3,R2)   AND指令:按位与操作 ANDS R0,R0,#0x01  ;取出最低位数据   ORR指令:按位或操作 ORR R0,R0,#0x0F   ;将R0的低4位置1   EOR指令是进行异或操作,BIC指令是位清除指令(遇1清0)   TST:位测试指令 TST R0,#0x01     ; 判断R0的最低位是否是为0   TEQ:相等测试指令 TEQ R0,R1     ; 比较R0与R1是否相等,也可看作相减,相等则为0,Z=1   MUL指令:乘法指令 MUL R1,R2,R3   ; R1=R2*R3 MULS R0,R3,R7  ; R0=R3*R7,同时设置CPSR中的N位和Z位   MLA是乘加指令,将操作数1和操作数2相乘再加上第3个操作数,结果的低32位存入到Rd中 UMULL是64位无符号乘法指令 UMULL R0,R1,R5,R8   ; (R1、R0) = R5 * R8   BL指令:带链接的跳转指令,指令将下一条指令拷贝到R14(即LR)链接寄存器中,然后跳转到指定地址运行 BL指令用于子程序调用,例如:BL DELAY BX指令:带状态切换的跳转指令,例如 BX R0 ;跳转到R0指定的地址,并根据R0的最低位来切换处理器的状态   MCR:ARM寄存器到协处理器寄存器的数据传送指令 MRC:协处理器寄存器到ARM寄存器的数据传送指令   MRC/MCR指令格式如下: MRC/MCR {cond} coproc,opcode1,Rd,CRn,CRm{,opcode2} coproc是指令操作的协处理器名,标准名为pn,n为0-15 opcode1 协处理器的特定操作码 Rd  MRC操作时,作为目标寄存器的协处理器寄存器,MCR操作时,作为ARM处理器的寄存器 CRn 存放第1个操作数的协处理器寄存器 CRm 存放第2个操作数的协处理器寄存器 opcode2 可选的协处理器特定操作码   MRC/MCR指令举例如下: mcr/mrc p15,0,r0,c1,c0,0   SWI指令:SWI指令用于产生中断,从而实现用户模式变换到管理模式,CPSR保存到管理模式的SPSR中,执行转移到SWI向量 SWI 0x123456  ;软中断,中断立即数 0x123456   在SWI异常中断处理程序中,取出SWI立即数的步骤为:首先确定引起软中断的SWI指令是ARM指令还是THUMB指令,这可通过对SPSR访问得到,然后要取得该SWI指令的地址,这可通过访问LR寄存器得到,接着读出指令,分解出立即数 程序代码如下: T_bit EQU 0x20                ;0010 0000 SWI_Hander     STMFD SP!,{R0-R3,R12,LR}  ;现场保护     MRS R0,SPSR               ;读取SPSR     STMFD SP!,{R0}            ;保存SPSR     TST R0, #T_bit            ;测试T标志位,0为ARM,1为THUMB     LDRNEH  R0,       ;若是THUMB指令,读出产生中断的指令码(16位)     BICNE R0,R0,#0xFF00       ;取得THUMB指令的8位立即数     LDREQ R0,         ;若是ARM指令,读取产生中断的指令码(32位)     BICEQ R0,R0,#0xFF000000   ;取得ARM指令的24位立即数     BL  C_SWI_Handler     LDMFD SP!,{R0-R3,R12,PC}^ ;SWI异常中断返回     MRS指令:读状态寄存器指令,在ARM处理器中,只有MRS指令可以从状态寄存器CPSR或SPSR读出到通用寄存器 MRS R1,CPSR     ;将CPSR状态寄存器读取,保存到R1 MRS R2,SPSR     ;将SPSR状态寄存器读取,保存到R2   MRS应用: 1、使能IRQ中断 ENABLE_IRQ MRS R0,CPSR BIC R0,R0,#0x80       ;1000 0000 MSR CPSR,R0 MOV PC,LR   2、禁止IRQ中断 DISABLE_IRQ MRS R0,CPSR ORR R0,R0,#0x80 MSR CPSR,R0 MOV PC,LR   MSR:写状态寄存器指令,在ARM处理器中,只有MSR指令可以直接设置状态寄存器CPSR或SPSR   ================================================================================================================ ARM伪指令介绍 ARM伪指令不是ARM指令集中的指令,只是为了编程方便编译器定义了伪指令 ARM地址读取伪指令有四条,分别是 ADR    伪指令 ADRL   伪指令 LDR    伪指令 NOP    伪指令   作用的范围不一样,由小到大: ADR,ADRL,LDR ADR、ADRL指令将基于PC相对偏移的地址读取到存储器中,例如 ADR  R0 , DISP_TAB    ; 加载转换表地址 LDR  R1,    ;使用R2作为参数,进行查表 ..... DISP_TAB DCB     0xc0,0xf9,0xa4,0x99,0x92,0x82,0xf8,0x80     LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器,前加 = LDR R0,=0x123456     ;加载32位立即数0x123456 LDR R0,=DATA_BUF+60  ;加载DATA_BUF地址+60   NOP是空操作伪指令   宏是一段独立的程序代码,它是通过伪指令定义的,在程序中使用宏指令即可调用宏,当程序被汇编时,汇编程序将对每个调用进行展开,用宏定义取代源程序中的宏指令     符号定义伪指令 1、全局变量声明:GBLA、GBLL 和 GBLS 2、局部变量声明:LCLA、LCLL 和 LCLS 3、变量赋值:SETA、SETL、和 SETS 4、为一个通用寄存器列表定义名称:RLIST 5、为一个协处理器的寄存器定义名称:CN 6、为一个协处理器定义名称:CP   最后一个字符 A代表算术变量,初始值为0,L代表逻辑变量,初值为FALSE,S代表字符串,初值为空 伪指令应用举例如下: MACRO               ;声明一个宏 SENDDAT $dat        ;宏的原型 $表示后面是变量 LCLA bitno          ;声明一个局部算术变量 ... bitno SETA 8        ;设置变量值为8 ... MEND                ;结束   RLIST指令格式: name RLIST {reglist},例如: LoReg RLIST {R0-R7}   ;定义寄存器列表LoReg   CN指令的用法: name CN expr,其中name是要定义的协处理器的寄存器名称,expr对应的协处理器的寄存器编号,数值范围 0 ~ 15 MemSet CN 1  ;将协处理器的寄存器1名称定义为 MemSet   CP指令的用法,举例如下: DivRun CP 5  ;将协处理器5名称定义为DivRun     数据定义伪指令: 1、声明一个文字池:LTORG 2、定义一个结构化的内存表的首地址:MAP 或 ^ 3、定义结构化内存表中的一个数据域:FIELD 或 # 4、分配一块内存空间,并用0初始化: SPACE 或 % 5、分配一段字节内存单元,并用指定的数据初始化: DCB 6、分配一段字的内存单元,并用指令的数据初始化: DCD 和 DCDU 7、分配一段双字的内存单元,并用64位整数数据初始化: DCQ 和 DCQU 8、分配一段半字的内存单元,并用指定的数据初始化: DCW 和 DCWU   LTORG 用于声明一个文子池,在使用LDR伪指令时,要在适当的地址加入LTORG声明文子池,这样就会把要加载的数据保存在文子池内,再用ARM的加载指令读出数据(若没有使用LTORG声明文子池,则汇编器会在程序末尾自动声明) LTORG伪指令应用举例如下: ... LDR R0,=0x12345678 ADD R1,R1,R0 MOV PC,LR LTORG        ;声明文子池 DCD 0x333 DCD 0x555   MAP 用于定义一个结构化的内存表的首地址,^与MAP同义 MAP 0x00, R9  ;定义内存表的首地址为R9   FIELD 用于定义一个结构化内存表的数据域,#与FIELD同义 ^ _ISR_STARTADDRESS    ; ^ is synonym for MAP HandleReset  #  4      ; 定义数据域 HandleReset,长度为4字节   SPACE用于分配一块内存单元,并用0初始化,%与SPACE同义 伪指令应用举例如下: AREA DataRAM,DATA,READWROTE   ;声明一数据段,名为DataRAM DataBuf SPACE 1000            ;分配1000字节空间   DCB伪指令格式: {label} DCB expr{,expr} ... 加{}的代表可有可无,DCD、DCW指令格式与DCB基本相同     ASSERT为断言错误伪指令,在汇编编译器对汇编程序的第二遍扫描中,若其中ASSERT条件不成立,ASSERT伪指令将报告该错误信息 ASSERT TopTemp    ;断言Top 不等于 Temp ASSERT :DEF:ENDIAN_CHANGE            汇编控制伪指令   1、条件汇编控制:IF、ELSE 和 ENDIF IF、ELSE 和 ENDIF 伪指令能够根据条件把一段代码包括在汇编程序内或将其排除在程序之外 与 ENDIF 同义 伪指令应用举例如下:                  ; ] 代表 ENDIF     2、MACRO 和 MEND MACRO 和 MEND 伪指令用于宏定义,MACRO表示宏定义的开始,MEND表示宏定义的结束,用MACRO和MEND定义的一段代码,称为宏定义体,伪指令应用如下: MACRO CSI_SETB        ;宏名为CSI_SETB,无参数 LDR R0,=rPDATG  ;读取GPG0 口的值 LDR R1, ORR R1,R1,#0x01 ;CSI置位操作 STR R1,     ;输出控制 MEND     3、WHILE 和 WEND WHILE 和 WEND 伪指令用于根据条件重复 编相同的或几乎相同的一段源程序 伪指令应用举例 WHILE no 5 no SETA no+1 ... WEND     杂项伪指令:在汇编程序设计较为常用,如段定义伪指令,入口点设置伪指令,包含文件伪指令,标号导出或引入声明 1、边界对齐:ALIGN 2、段定义: AREA 3、指令集定义:CODE16 和 CODE32 4、汇编结束: END 5、程序入口: ENTRY 6、常量定义:EQU 7、声明一个符号可以被其它文件引用:EXPORT 和 GLOBAL 8、声明一个外部符号:IMPORT 和 EXTERN 9、包含文件: GET 和 INCLUDE 10、给特定的寄存器命名: RN
  • 热度 17
    2014-8-20 14:14
    988 次阅读|
    0 个评论
     温度是表征物体冷热程度的物理量。温度只能通过物体随温度变化的某些特性来间接测量,而用来量度物体温度数值的标尺叫温标。它规定了温度的读数起点(零点)和测量温度的基本单位。目前国际上用得较多的温标有华氏温标、摄氏温标、热力学温标和国际实用温标。   一、华氏温标   华氏温标(ºF)规定:在标准大气压下,冰的熔点为32度,水的沸点为212度,中间划分180等分,每第分为报氏1度,符号为ºF。   二、摄氏温度   摄氏温度(℃)规定:在标准大气压下,冰的熔点为0度,水的沸点为100度,中间划分100等分,每第分为报氏1度,符号为℃。   摄氏温度值t和华低温度值tF有如下关系:     三、热力学温标   热力学温标又称开尔文温标,或称绝对温标,它规定分子运动停止时的温度为绝对零度,记符号为K。   四、国际实用温标   国际实用温标是一个国际协议性温标,它与热力学温标相接近,而且复现精度高,使用方便。目前国际通用的温标是1975年第15届国际权度大会通过的《1968年国际实用温标—1975年修订版》,记为:IPTS—68(Rev—75)。但由于IPTS—68温示存在一定的不足,国际计量委员会在18届国际计量大会第七号决议授权予19***会议通过了1990年国际温标ITS—90,ITS—90温标替代IPTS—68。我国自1994年1月1日起全面实施ITS—90国际温标。   1990年国际温标(ITS—90)简介如下。   1、温度单位   热力学温度(符号为T)是基本功手物理量,它的单位为开尔文(符号为K),定义为水三相点的热力学温度的1/273.16。由于以前的温标定义中,使用了与273.15K(冰点)的差值来表示温度,因此现在仍保留这各方法。用这种方法表示的热力学温度称为摄氏温度,答号为t,定义为:     式中:t/℃--分子为摄氏温度,分母为摄氏温度的单位;T/K—分子为开尔文温度,分母为开尔文温度的单位。   根据定义,摄氏度的大小等于开尔文,温差亦可以用摄氏度或开尔文来表示。   国际温标ITS—90同时定义国际开尔文温度(符号为T90)和国际摄氏温度(符号为t90)。T90和t90之间的关系与T和t一样,即:     它们的单位及符号热力学温度T和摄氏温度t一样。   2、国际温标ITS—90的通则   ITS—90由0.65K向上到普朗克辐射定律使用单色辐射实际可测量的最高温度。ITS—90是这样制订的,即在全量程中,任何温度的T90值非常接近于温标采纳时T的最佳估计值,与直接测量热力学温度相比,T90的测量要方便得多,而且更为精密,并具有很高的复现性。   3、ITS—90的定义   第一温区为0.65K到5.00K之间, T90由3He和4He的蒸气压与温度的关系式来定义。   第二温区为3.0K到氖三相点(24.5661K)之间T90是用氦气体温度计来定义,   第二温区为平衡氢三相点(13.8033K)到银的凝固点(961.78℃)之间,T90是由铂电阻温度计来定义.它使用一组规定的定义固定点及利用规定的内插法来分度,   银凝固点(961.78℃)以上的温区,T90是按普朗克辐射定律来定义的,复现仪器为光学高温计,   ITS—90的定义固定点共17个,列于表   表 ITS—90定义固定点   TD class=td2 align=middle width="8%" 序号 国际实用温标规定值 物质 状态 T90/K t90/℃ 1 3~5  -270.15~-268.15 He 蒸气压点(V) 2 13.8033 -259.3467 e-H 2 三相点(T) 3 ~17 ~-256.15 e-H 2  或(He) 蒸气压点(V)(或气体温度计)(G) 4 ~20.3 ~-252.85 e-H 2  或(He) 蒸气压点(V)(或气体温度计)(G) 5 24.5561 ~248.5939 Ne 三相点(T) 6 54.3584 ~-218.7916 O 2 三相点(T) 7 83.8058 -189.3442 Ar 三相点(T)  
  • 热度 23
    2014-8-14 14:15
    1439 次阅读|
    0 个评论
    6.3 函数注释  6.3.1 函数头部注释  函数头部注释应包括函数名称、函数功能、入口参数、出口参数等内容.如有必要还可增加作者、创建日期、修改记录(备注)等相关项目.  函数头部注释放在每个函数的顶端,用"/*……*/"的格式包含.其中函数名称应简写为FunctionName(),不加入、出口参数等信息.  /***********************************************************  函数名称:  函数功能:  入口参数:  出口参数:  备 注:  ***********************************************************/  6.3.2 代码注释  代码注释应与被注释的代码紧邻,放在其上方或右方,不可放在下面.如放于上方则需与其上面的代码用空行隔开.一般少量注释应该添加在被注释语句的行尾,一个函数内的多个注释左对齐;较多注释则应加在上方且注释行与被注释的语句左对齐.  函数代码注释用"//…//"的格式.  通常,分支语句(条件分支、循环语句等)必须编写注释.其程序块结束行"}"的右方应加表明该程序块结束的标记"end of ……", 尤其在多重嵌套时.  6.4 变量、常量、宏的注释  同一类型的标识符应集中定义,并在定义之前一行对其共性加以统一注释.对单个标识符的注释加在定义语句的行尾.  全局变量一定要有详细的注释,包括其功能、取值范围、哪些函数或过程存取它以及存取时的注意事项等.  注释用"//…//"的格式.  7 单片机C51编程规范-函数  7.1 设计原则  函数的基本要求:  l 正确性:程序要实现设计要求的功能.  l 稳定性和安全性:程序运行稳定、可靠、安全.  l 可测试性:程序便于测试和评价.  l 规范/可读性:程序书写风格、命名规则等符合规范.  l 扩展性:代码为下一次升级扩展留有空间和接口.  l 全局效率:软件系统的整体效率高.  l 局部效率:某个模块/子模块/函数的本身效率高.  编制函数的基本原则:  l 单个函数的规模尽量限制在200行以内(不包括注释和空行).一个函数只完成一个功能.  l 函数局部变量的数目一般不超过5~10个.  l 函数内部局部变量定义区和功能实现区(包含变量初始化)之间空一行.  l 函数名应准确描述函数的功能.通常使用动宾词组为执行某操作的函数命名.  l 函数的返回值要清楚明了,尤其是出错返回值的意义要准确无误.  l 不要把与函数返回值类型不同的变量,以编译系统默认的转换方式或强制的转换方式作为返回值返回.  l 减少函数本身或函数间的递归调用.  l 尽量不要将函数的参数作为工作变量.  7.2 函数定义  l 函数若没有入口参数或者出口参数,应用void明确申明.  l 函数名称与出口参数类型定义间应该空一格且只空一格.  l 函数名称与括号()之间无空格.  l 函数形参必须给出明确的类型定义.  l 多个形参的函数,后一个形参与前一个形参的逗号分割符之间添加一个空格.  l 函数体的前后花括号"{}" 各独占一行.  7.3 局部变量定义  l 同一行内不要定义过多变量.  l 同一类的变量在同一行内定义,或者在相邻行定义.  l 先定义data型变量,再定义idtata型变量,再定义xdata型变量.  l 数组、指针等复杂类型的定义放在定义区的最后.  l 变量定义区不做较复杂的变量赋值.  7.4 功能实现区规范  l 一行只写一条语句.  l 注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级.  l 各程序段之间使用一个空行分隔,加以必要的注释.程序段指能完一个较具体的功能的一行或多行代码.程序段内的各行代码之间相互依赖性较强.  l 不要使用难懂的技巧性很高的语句.  l 源程序中关系较为紧密的代码应尽可能相邻.  l 完成简单功能、关系非常密切的一条或几条语句可编写为函数或定义为宏.   
  • 热度 28
    2010-4-28 11:04
    3570 次阅读|
    5 个评论
    什么是“3G”? 这是一个好象很简单,其实很复杂的大问题。任何一个学过通信,或是呆在通信业的人都知道,3G是第三代移动通信,它可以支持更高的移动数据网络,带宽不低于384Kbps。但是这样一个定义对于用户而言有价值吗?它能干什么?它能有什么商业模式,会产生什么应用,对于用户的学习、工作和生活有哪些影响和改变?看不出来。 而对于通信业的行业人士而言,一个带宽为基础的3G定义正在产生一些误导,这个误导的结果,就是对于3G发展的理解,只是以网络和带宽为核心,却忽视了其他因素的作用。没有强大的智能终端,其实完全不可能实现3G的应用,也不可能发挥3G带宽的价值,没有较好业务接入、管理、计费平台,3G的业务开展永远是失去了足够的支撑,不会有好的商业模式,没有足够的应用的支持,3G永远只是一个概念。 其实今天绝大部分运营商给用户推销的“3G”不过是“伪3G”和“假3G”。在这种定义下的3G,其实用户得不到多少有益的东西,而用户体验却是很糟糕的,对于运营商的员工而言,一方面他们需要给用户推销3G,另一方面用户得不到有价值的东西,却不知道原因在什么地方?不知道需要从哪些地方入手解决问题。甚至不知道怎么解释我们现在的问题。我们也看到了在战略上和政策上出现的问题的偏差,比如一度运营商把上网本和上网卡作为3G的重要产品进行推广,结果是堵死了网络,却带不来多少有收入。而今天中国明明是远没有进入3G时代,目前只是网络建设过程中,智能终端还有巨大差距、业务管理平台基本没有形成,业务开发体系远远不够完善。却把发展3G用户数作为一个重要目标。其实我们在听到已经达到多少用户数了,大家都心知肚明,这些用户真是“3G”用户吗? 对于行业中人来说,我们一定要知道,随着产业的发展,3G的概念,远远已经超越了通信技术,也已经远远超越了带宽这个层面,只有从网络、终端、业务管理平台、应用几个层面来看3G,这样3G才真正有价值,只有几个方面的问题都解决好了,3G才能发展起来。对于3G有了清醒的认识,我们才能做到不过度夸张而误导消费者,做到管理部门实事求事的看待3G的进程,也能做到切实从不同层面解决我们应该解决的问题。因此,我重新为“3G”下了一个定义,这个定义不是只基于网络的定义,而是一个更加宽广的产业角度的定义: 3G是高速度移动数据网络、智能终端和基于身份识别、位置、电子支付的应用整合而成的一种新的服务模式。3G不是一种技术,它是网络、终端和应用整合的服务模式和用户体验。 真正意义的上3G,它必须有高速度移动网络的支撑,在需要高带宽时,具有较好的带宽的支持,同时我们用户手中的终端,不但是能接入WCDMA、 CDMA2000、TD-SCDMA网络,而且这个终端必须是智能的,是有较高的处理速度,有较大的存储能力,能实现位置服务、电子支付的功能,还有需要相当的应用支持我们使用享受更多新的体验。有了这样的网络、终端和应用,用户才会惊喜,也才能买单。今天距这些还有距离,这不要紧,我们承认现在的情况,我们通过努力在改善。但是我们绝不能“伪3G”来给消费者,结果用户的结论是“3G”是没有什么价值的,这样的3G怎么可能有未来和有机会。 有业内的朋友告诉我,你这个定义还是太专业了,需要一个更大众化的,让消费者都能理解和明白,我同意,我需要找到一个更通俗的表述,不过我希望更多的专业人士理解和传播现在这个较专业的定义。 (文/飞象网项立刚 xiangligang@gmail.com  中国通信第一网 飞象网  手机访问飞象网 wap.cctime.com)    
相关资源