首页 > 代码库 > ARM基础知识学习笔记

ARM基础知识学习笔记

/*****************数电知识*******************/

  PN结(Positive-Negative)

 三极管:BJT(双极结型三极管Bipolar Junction Transistor)
               FET(场效应管Field Effect Transistor)
         (单极结型) 1.MOSFET (金属氧化物半导体Metal Oxide Semiconductor FET)
               2.JFET(结型Junction FET)
          ↓    ↓
         
 门电路(Gate):TTL  CMOS →     (双稳态存储单元)锁存器(Latch),触发器(Flip-flop)
     与(AND),或(OR),非(NOT)
     与非(NAND)  或非(NOR)
     同或(Exclusive OR),异或(Exclusive NOR)
          ↓        ↓
 组合逻辑电路(Combinational Logic  circuit)          时序逻辑电路(Sequential ~)
 编码(Code),译码(Decoder)
 选择,比较,运算(半加、全加)。                       寄存器(Register),计数器,
                RAM,ROM,CPLD
                                 
                
                      
/****************计算机结构******************/

1.冯诺依曼结构:运算,存储,输入输出。数据程序统一

2.哈佛结构: 程序,数据独立

 

CPU :(ALU+)
register: 触发器(Flip-flop)

Cache(缓存)SRAM((双稳态触发)静态static):速度最快,集成度小,价格高(稳定)

内存 :RAM:DRAM((电容)动态dynamic random access):速度较快,集成度大,价格低(要刷新)
            SDRAM (synchronous DRAM(同步))
     DDR SDRAM:(双倍速率)
    DDR3 SDRAM:(第三代,更低电压,更高性能)
 

ROM  :MROM(掩膜)->PROM(熔丝)->EPROM(光)->E2PROM(电)

FLASH :NOR  : 字读,字写 (快),块擦除(慢),集成低,尺寸大,价格高,可靠性好 -->Super vivi
              (独立数据,地址总线,可直接读取执行)
   NAND:  页读,页写(慢),块擦除(快 ),集成高,尺寸小,价格低 ,有失效块-->文件系统
     (数据,地址同一总线,串行读取,加载到RAM执行)                      (硬盘)
硬盘

 


/*******************数据*******************/

十进制(Decimal):
二进制(Binary):
八进制(Octal):
十六进制(hexadecimal):

 


 字节byte          字符   char         8
 半字half word    短整型   short int    16
 字word            整型   int(integer)   32
                长整型  long int     32
                单精度  float        32
 双字(double word)双精度  double       64
   结构体  struct **
   数组   *** *[]      


大端(big-endian):高字节-低地址
小端(little-endian):高字节-高地址

 

指令:CISC:复杂指令集(Complex Instruction Set Computer)
  数量多,长度可变(1-15字节),20%实用,执行慢,
  寻址多样,操作寄存器和内存,硬件复杂
     RISC:精简指令集(Reduced Instruction Set Computer)
  数量少,长度固定(4字节),执行每一条指令,执行快
  简单寻址,只操作寄存器,硬件简单


流水线(pipeline):三级流水(ARM7)
    LDR流水
    分支流水
    中断流水
    五级流水(ARM9TDMI)
    LDR互锁

 

/******************ARM处理器******************/

ARM:1.Advanced RISC Mechine技术 
 2.公司名,英国剑桥。
 3. 处理器体系

优点:1.低功耗 2.高性能 3.RISC指令集

体系(版本version):(1996)ARMv4(arm7,8,9),(1999)ARMv5(arm10,xscale),(2001)ARMv6(arm11),
                    (2004)ARMv7(v7A,v7R,v7M)(arm cortex-A,R,M)

处理器(实现implementation):ARM7TDMI
                               ARM920TDMI    (ARMxyzTDMIEJF-S)
       (系列-MMU-cache-Thumb16-JTAG-快速乘法-跟踪宏单元)
        (增强指令-Jazelle-向量浮点单元-可综合版本)
     Cortex-M,Cortex-R,Cortex-A,

设备(芯片):S3C2440,S3C6410

开发板:mini240(友善之臂)


/******************我的ARM******************/

开发板:mini240(友善之臂)

处理器芯片:S3C2440(三星公司)    CPU:ARM920T    版本体系: ARMv4

内存: HY57V561620  4Banks x 4M x 16Bit Synchronous DRAM (hynix 韩国)
Nor Flash: Am29LV160DB 2 M x 8-Bit  CMOS 3.0 Volt-only Boot Sector Flash Memory(AMD)
Nand Flash: k9f2g08x0a_rev13 256M x 8 Bit NAND Flash Memory (三星公司)

 


模式:(七种)
 用户模式(usr)user
      特权模式 (Privileged Modes)
  异常模式(Exception Modes)
   快速中断模式(FIQ)fast interrupt request
   外部中断模式(IRQ)interrupt request
   管理模式(svc)    supervisor
   终止模式(abt)    abort
   未定义模式(und)  undefined
  系统模式(sys)system

寄存器(register) :(三十七个)
 通用寄存器:R0-R13
            未分组寄存器(the unbanked registers) R0-R7
  分组寄存器 (the banked registers)
     R8-R12(快速中断模式独立)
     R13(SP(stack point)) R14(LR(link register))(各异常模式独立)
 程序计数器 (program count) R15(PC)
    
 状态寄存器:CPSR(current program status register)
   SPSR(save program status register)

R13:SP堆栈指针,
R14:LR链接寄存器,1.保存子程序返回地址2.异常模式返回地址
R15:PC程序计数器
CPSR:当前程序状态寄存器
SPSR: 保存程序状态寄存器

      N Z C V - - - - - - - - - - - -  -I F T M4 M3 M2 M1 M0
      negtiv负数                   保留     IRQ禁止 
    zero零           FIQ禁止
          carry进位(加法1)                         Thumb状态
           借位(减法0)
   overflow溢出

   
      M4 M3 M2 M1 M0 :MODE模式控制位
 10000:Usr
 10001:FIQ
 10010:IRQ
 10011:Svr
 10111:Abort
 11011:Undefined
 11111:System


异常:(优先级)类型   模式       偏移向量表(Vector Table)

3 FIQ中断      ->FIQ     ->0x0000001c
4 IRQ中断      ->IRQ     ->0x00000018
/ 保留      ->/       ->0x00000014
2 数据中止      ->Abt     ->0x00000010
5 预取指中止     ->Abt     ->0x0000000c
6 软件中断SWI    ->Svc     ->0x00000008
6 未定义指令 ->Und      ->0x00000004
1 复位          ->Svr      ->0x00000000
      

 

指令:编码存储格式

 

 
 cond        28-31        16(15)      条件码(是否执行)
 type        26-27        4()      指令类型码
 I              
 opcode   21-24        8      指令操作码
 S        20           1     是否影响状态CPSR
 Rn       19-16      16 (R0-R15)  第一个操作数寄存器
 Rd        12-15     16 (R0-R15)   目标寄存器
 Operand2    0-11     2^12   第二个操作数

指令书写格式:

  opcode +  [cond] +  [S]  +   Rd    +         Rn     +        operand2
 助记符      条件执行   状态影响   目标寄存器   第一个操作数寄存器    第二个操作数
 


常见:
1.立即数:#3
2.寄存器:R3
3.寄存器间接:[R3] ,即R3里存放内存中的地址


数据处理
  传送
  MOV
  MVN
  移位(桶形移位器BarrelShifter),指令中附加
       LSL(logic shift left)
  LSR(logic shift right)
  ASR  算术右移
  ROR  循环右移
      RRX  带扩展的循环右移
  算术
      ADD
 ADC  +Carry
 SUB   Rd=Rn-operand2
 SBC  +Carry
 RSB   Rd=operand2-Rn
 RSC  +Carry
  逻辑
 AND    按位与
 ORR    按位或
 EOR Eclusive OR按位异或
 BIC BIt Clear   Rd &(!eperand2)用掩码清除某些位

  比较  自动更新CPSR标志位
 CMP  compare  Rn - operand2 -->判断Z(0-相等,1-不相等)
 CMN  compare NOT Rn -! operand2 -->判断Z()
 TST  test         位测试 Rn & operand2 -->判断z(0-设置,非0-未设置)
 TEQ  test equal    相等测试 Rn 按位异或^ operand2 -->判断z(1-相等,0-不相等)
  乘法
 MUL       32位  MUL Rd,Rm,Rs    Rd=Rm*Rs
 MLA  ADD   32位乘加  MUL Rd,Rm,Rs,Rn  Rd=(Rm*Rs)+Rn  Rd和Rn必须是不同的寄存器
 SMULL  signed MUL long  64位   SMULL Rdlo,Rdhi,Rm,Rs
 SMLAL  signed MLA long  64位乘加
 UMULL  unsigned MUL long
 UMLAL  ensigned MLA long


数据加载与存储指令
 
  load-store    寄存器<-->内存

前索引
    LDR R5,[R6,#0X04]        LDR R5,[R6,R4,LSL #2]
自动索引
    LDR R5,[R6,#0X04]!
后索引
    LDR R5,[R6],#0X04

单寄存器
  字节    LDRB /STRB   LDRB时,读内存(任意地址)8位到Rd,高24位清零。
    STRB时,Rd中的低8位保存到内存中。
  半字节  LDRH /STRH
  字     LSR /STR
  有符号字 LSRSB /LDRSH

多寄存器

  加载存储
  加载
   LDMIA R0!,{R6-R8} 后增  increasing after
   LDMIB R0!,{R6-R8} 先增
   LDMDA R0!,{R6-R8} 后减 
   LDMDB R0!,{R6-R8} 先减  decreasing before

 堆栈操作
  建栈 LDR R13,=0X90010
  LDR SP,=0X90010
  进栈  STMFD SP!,{R2-R4}  Full Descending  ==DB 先减
       STMED SP!,{R2-R4}
       STMFA SP!,{R2-R4} 
       STMEA SP!,{R2-R4}  Empty Ascending
  出栈  LDMFD SP!,{R2-R4}                 ==IA  进栈出栈相同形式。
       LDMED SP!,{R2-R4}
       LDMFA SP!,{R2-R4}
       LDMEA SP!,{R2-R4}
   

交换指令
  字  SWP R0,R1,[R2]   [R2]->R0 ,R1->[R2]
      SWP R0,R0,[R1]   R0与R1指向的数据交换
 字节  SWPB R0,R1,[R2]
      SWPB R0,R0,[R1]


分支指令
 分支:B  Branch
 带返回:BL  Branch + Link
 带状态切换:BX
 带返回+状态切换 :BLX   Branch + Link + exchange


程序状态寄存器访问指令
读  MRS R0,CPSR/MRS R0,SPSR   CPSR->R0
写  MSR CPSR_c,R0              R0->CPSR,仅修改cpsr中的控制位域


软件中断
 SWI SoftWare Interrupt
    SWI 0X02

伪指令

ARM伪指令
 ADR  小范围
 ADRL 中等范围
 LDR  大范围地址读取
 NOP  空操作
数据定义伪指令
 DCB  字节  str DCB "hello",0,"world",0
 DCW  半字
 DCD  字   num DCD 10,20,30
 DCQ  双字
 DCFS  Single Float
 DCFD  Double Float


报告伪指令
 ASSERT(flag)

汇编控制伪指令
 IF ELSE

杂项伪指令
 EQU  NUM EQU 12
 ENTRY
 END


ARM程序设计

数据处理:1.立即数 2.寄存器 3.寄存器间接 4.寄存器移位

基本结构:
1、顺序

2、条件
条件判定:cmp影响nzcv
无符号数的判定:   有符号数的判定:
EQ: ==    EQ: ==
NE: !=    NE: !=
HI: >     GT: >
LO: <     LT: <
HS: >=    GE: >=
LS: <=    LE: <=

1.简单单分支if
2.二分支if() else
3.多分支switch()
   {
  case
  }


3、循环
a.计数控制:(1)0->n 
    MOV Rn, #N
   ...
        loop
         ...
  SUBS Rn, Rn, #1
  BGT loop

  (2) n->0
     MOV Rn, #0
  ...
       loop
         ...
  ADD Rn, Rn, #1
  CMP Rn, #N
  BNE loop
b.条件控制


单重循环
多重循环

4.子程序调用
  BL pro    ---  MOV PC,LR


C和汇编混合编程

C《=汇编
过程点用标准:ATPCS(ARM-Thumb Produce Call Standard)
  2007  AAPCS(ARM Architecture Produce Call Standard)
armcc,armcpp支持ARM指令集
tcc,tcpp支持Thumb指令集

1.参数:R0-R3 (a1-a4),超过四个参数用数据栈传递参数(复杂,慢,尽量少用)。
 32位用R0返回。64位用R0和R1返回
2.通用变量寄存器:R4-R8(v1-v5)
3.数据栈为FD类型。8字节对齐
__asm
{
  loop:指令
     ……   //注释
  b loop
}
注意:1.操作数可以是寄存器(最好用变量名取代),常量,C表达式。
 (unsigned) char ,short,int(寄存器受限)
 2.立即数#可以省略
 3.标号用C风格(loop:),不需要顶个写。
 4. 注释用C风格。
 5.不能给PC赋值,只能B,BL实现跳转,只B能用C风格标号。
 6.LDM,STM只允许物理寄存器。
 7.不支持LDR Rn,=expression.只能用MOV Rn ,expression.不支持ADR,ADRL,DCD等伪指令。

汇编访问C全局变量:
 IMPORT globvar
 LDR R1,=globvar
 LDR R0,[R1]
 ……

C调用汇编(函数)

C中:extern 函数声明
汇编中:EXPORT +标号
       MOV PC,LR   声明该段为外部实用。
 入口在main,汇编中没有ENTRY,两文件不能重名。


 export ***
 AREA ***, CODE, READONLY
  ***:
 指令
 ldmfd sp, {v1};取第五个参数,只是到堆栈上取值,不要修改堆栈指针    
 ……
 mov pc,lr
 END

汇编中调用C函数。
汇编中:IMPORT ***  声明实用外部函数。
 mov r0,#3 …… 调用前设置参数。
 stmfd sp!, {r8};传递第五个参数
 bl ***  用bl跳转到c函数。
C中:
入口在ENTRY,C中没有main。

GNU ARM:

ARMASM:ARM公司自成汇编体系。codewarrior为arm标准。
GNU ARM ASM :GNU工具的arm版本。用于交叉编译成在arm中执行。