您的位置:首页 > 其它

Keil MDK中的Code, RO-data , RW-data, ZI-data分别代表什么意思?

2016-06-22 08:49 701 查看
一 基础知识

字节  8位

半字  16位

字    32位

 

二 解惑

Code, RO-data,RW-data,ZI-data

RO就是readonly,

RW就是read/write,

ZI就是zero

Code 代表执行的代码,程序中所有的函数都位于此处。
RO-data 代表只读数据,程序中所定义的全局常量数据和字符串都位于此处。
RW-data 代表已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此处。
ZI-data 代表未初始化的读写数据,程序中定义了但没有初始化的全局变量和静态变量位于此处

Program Size: Code="18248"RO-data=320 RW-data=260 ZI-data=3952

Code, RO-data,RW-data ............flash

RW-data, ZIdata...................RAM

三 详细分析

初始化时RW-data从flash拷贝到RAM

生成的map文件位于list文件夹下
(KEIL)

    TotalRO  Size (Code + ROData)                18568(  18.13kB)

    Total RW  Size (RW Data + ZI Data)              4212(   4.11kB)

    Total ROM Size (Code + RO Data + RWData)      18828 (  18.39kB)

ARM指令的长度刚好是1个字(分配为占用4个字节),Thumb指令的长度刚好是半字(占用2个字节)

R0-R15 (R15-PC,R14-LR,R13-SP) 32位

每个异常模式还带有一个程序状态保存寄存器(SPSR),它用于保存在异常事件发生之前的CPSR

LDMIA R1!,{R2-R7, R12};将R1单兀中的数据读出到R2-R7,R12,  R1自动加1

STMIA RO!,{R3-R6,R10}  ;将R3-R6,R10中的数据保存到RO指向的地址,RO自动加1

 

在数据传送之前,将偏移量加到Rn中,其结果作为传送数据的存储地址.若使用后缀“!”,则结果写回到Rn中,且Rn值不允许为R15.指令举例如下:

LDR   Rd, [Rn, #Ox4]!

LDMFD  SP!,{R0-R3,PC}^ ;中断返回

“^”符号表示这是一条特殊形式的指令。这条指令在从存储器中装载PC的同时(PC是最后恢复的),CPSR也得到恢复

Cortex-M3处理器能够以小端格式或大端格式访问存储器中的数据字,而访问代码时始

终使用小端格式。

 

大端格式(Big-endian)
小端格式(Little-endian)

数据0x12345678存储格式

      大端格式
低地址<----0x12|0x34|0x56|0x78---->高地址

      小端格式
低地址<----0x78|0x56|0x34|0x12---->高地址

注:

小端格式是ARM处理器默认的存储器格式。

在小端格式中,一个字中最低地址的字节为该字的最低有效字节,最高地址的字节为最高有效字节。存储器系统地址0的字节与数据线7-0相连。

在大端格式中,一个字中最低地址的字节为该字的最高有效字节,而最高地址的字节为

最低有效字节。存储器系统地址0的字节与数据线31-24相连。

ARM微处理器支持7种运行模式,分别为:
CPSR M[4:0]

1.用户模式(usr):ARM处理器正常的程序执行状态。       10000

2.快速中断模式(fiq):用于高速数据传输或通道处理。    10001

3.外部中断模式(irq):用于通用的中断处理。            10010

4.管理模式(svc):操作系统使用的保护模式。            10011

5.数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。10111

6.系统模式(sys):运行具有特权的操作系统任务。        11111

7.定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。
11011

 

ARM正常工作一般工作在用户模式和系统模式,复位的时候进入管理模式。

对于ARM指令集来说,PC指向当前指令的下两条指令的地址,

注意pc,在调试的时候显示的是当前指令地址,而用mov lr,pc的时候lr保存的是此指令向后数两条指令的地址

假设反汇编代码:  0x000001:  mov lr pc   

(此时查看PC寄存器的值是0x000001,但实际PC值是0x000003,
lr里面保存的就是0x000003)

 

fields 指定传送的区域(psr  CPSR或SPSR)

c 控制域屏蔽字节(psr[7..0])

x 扩展域屏蔽字节(psr[15..8])

s 状态域屏蔽字节(psr[23..16])

f 标志域屏蔽字节(psr[31..24])

例如:MSR cpsr_c,#0xD3 ;  CPSR[7...0] = 0xD3
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  STM32 调试