当前位置:首页 >> 信息与通信 >>

嵌入式微处理器系


嵌入式微处理器系
第三章 ARM程序开发技术

北京大学软件与微电子学院 2006.2

程序开发技术-异常处理(1)
1. 基本概念
什么是异常?
由于内部或外部的原因导致处理器不能按照正的流程(下 一条指令或程序分支)执行。

如何处理异常?
处理异常中断

>返回发生中断的下一条指令(机器指令或汇编指令) 例: mov r0, #5 <- 发生异常 sub r0, #10 adds r1, r0, #10

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(2)
1. 基本概念(续)
ARM中断向量表的特点?
指定异常中断及其中断处理程序之间的对应关系 ARM向量表的大小32个字节,每个异常中断占据4个字节 每个字存放跳转指令或向PC赋值的数据访问指令 通常存放在存储器地址的低端

中断优先级有什么作用?
保证同时发生时按一定顺序处理 用数值表示,值愈大,优先级愈低

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(3)
1. 基本概念(续)
ARM有哪些类型的异常?
Reset Undefined Instruction SWI Prefech Abort Data Abort IRQ FIQ

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(4)
1. 基本概念(续)
ARM异常中断向量表
量地址 0x0 0x4 0x08 0x0c 0x10 0x14 0x18 0x1c 异常中断类型 Reset
Undefined Instruction

异常中断模式 特权(SVC) 未定义指令中止模式 特权模式 中止模式 中止模式 未使用 IRQ模式 FIQ模式

优先级 1 6 6 5 2 未使用 4 3
2006.2

SWI Prefetch Abort Data Abort Reserved IRQ FIQ

北京大学软件与微电子学院

程序开发技术-异常处理(5)
2. 异常模式的进入和退出
进入异常处理的过程
备份CPSR寄存器中的内容到SPSR_MODE 改变CPSR中的值
改变处理器模式,使用相应的寄存器组 关掉中断使能

保存返回地址于lr_mode 跳转到异常中断服务程序

退出异常处理的过程
将lr_mode的内容复制到PC中 (指令执行) 将spsr_mode中的内容复制到当前的cpsr中

在异常中断处理程序中
数据保存 数据恢复
北京大学软件与微电子学院 问:复位异常处理程序需要上述退出处理过程吗?
2006.2

程序开发技术-异常处理(6)
2. 异常模式的进入和退出(续)
不同中断模式的返回程序
SWI和未定义的指令异常 不使用堆栈 MOV pc, lr (注意:这里为lr_mode) 使用堆栈 STMFD sp!, {reglist, lr} ; …… LDMFD sp!, {reglist, pc}^

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(7)
2. 异常模式的进入和退出(续)
不同中断模式的返回程序
IRQ和FIQ 不使用堆栈 SUBS pc,lr, #4 使用堆栈 〈-为什么要减4? SUB lr, lr, #4 STMFD sp!, {reglist, lr} ; …… LDMFD sp!, {reglist, pc}^

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(8)
2. 异常模式的进入和退出(续)
不同中断模式的返回程序(续)
指令预取异常

不使用堆栈 SUBS PC, lr, #4 使用堆栈 SUBS lr, lr, #4 STMFD sp!, {reglist, lr} ; …… LDMFD sp!, {reglist, pc}^

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(9)
2. 异常模式的进入和退出(续)
不同中断模式的返回程序(续) 数据访问中断异常 不使用堆栈 SUBS PC, lr, #8 使用堆栈 SUBS lr, lr, #8 STMFD sp!, {reglist, lr} ; …… LDMFD sp!, {reglist, pc}^

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(10)
3. 异常处理程序的安装
中断处理程序句柄 (Handler)
位置 中断向量表 方式 使用跳转指令 (±32MB) B Reset_Addr B IRQ_Addr 使用LDR指令 (地址存放在4KB范围以内) LDR pc, Reset_Addr LDR pc, IRQ_Addr …… Reset_Addr DCD Start_Boot IRQ_Addr DCD IRQ_Handler
北京大学软件与微电子学院 LDR 这段代码还可以如何写?
2006.2

程序开发技术-异常处理(11)
3. 异常处理程序的安装
安装中断处理程序 初始化时安装 初始地址0x00处是ROM Vector_Init_Block LDR PC, Reset_Addr LDR PC, Undefined_Addr LDR PC, SWI_Addr LDR PC, Prefetch_Addr LDR PC, Abort_Addr NOP ;Reserved vector LDR PC, IRQ_Addr LDR PC, FIQ_Addr 为什么将FIQ_Addr 放在最后? 北京大学软件与微电子学院
2006.2

程序开发技术-异常处理(12)
3. 异常处理程序的安装
安装中断处理程序
初始化时安装 初始地址0x00处是ROM(续) Reset_Addr DCD Start_Boot Undefined_Addr DCD Undefined_Handler SWI_Addr DCD SWI_Handler Prefetch_Addr DCD Prefetch_Handler Abort_Addr DCD Abort_Handler DCD 0 ;Reserved vector IRQ_Addr DCD IRQ_Handler FIQ_Addr DCD FIQ_Handler

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(13)
3. 异常处理程序的安装(续)
安装中断处理程序
初始化时安装(续) 初始地址0x00处是RAM 将数据从ROM中Copy到RAM中 MOV ADR LDMIA STMIA LDMIA STMIA r8, #0 r9, Vector_Init_Block r9!,{r0-r7} ;Copy the vectors r8!,{r0-r7} r9!,{r0-r7} ;Copy the DCD'ed addresses r8!,{r0-r7}

为什么reglist中使用8个寄存器?为什么要copy两次? 0x00处是RAM,上电时如何启动? 北京大学软件与微电子学院
2006.2

程序开发技术-异常处理(14)
3. 异常处理程序的安装(续)
安装中断处理程序
程序运行过程中安装 (修改) 向量表中使用跳转指 如何在运行时将指令 “B IRQ_Addr ”装载到向量 表中? 能装载源程序吗? 只能装载机器码!

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(15)
3. 异常处理程序的安装(续)
安装中断处理程序 B,BL

Cond – (all) 0b1110 relative addr = PC_of_ISR- PC_of_BL When B , PC=PC_of_BL + 8

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(16)
3. 异常处理程序的安装(续)
安装中断处理程序 程序运行过程中安装 (修改) 向量表中使用跳转指令
步骤: (1)读取中断处理程序的地址addr1 (2)将addr1减去该中断对应的中断向量的地址 vector1 (3)addr=Addr1-vector1-8 (允许指令预取) (4)addr LSR #2 (5)if(addr and 0xff000000 ==0);是否越界 (6)addr or 0xea00 0000 (7)结果写回中断向量表

如何解释4,5,6步?
北京大学软件与微电子学院
2006.2

程序开发技术-异常处理(17)
3. 异常处理程序的安装(续)
安装中断处理程序(续)
程序运行过程中安装(修改)(续) 向量表中使用跳转指令(续) 例: unsigned Install_Handler (unsigned *handlerloc, unsigned *vector) { unsigned vec, oldvec; vec = (handlerloc - (unsigned)vector - 0x8)〉〉2; if ((vec & 0xFF000000) != 0) { exit (1);} vec = 0xEa000000 | vec; oldvec = *vector; *vector = vec; return (oldvec); } unsigned *irqvec = (unsigned *)0x18; Install_Handler ((unsigned)IRQHandler, irqvec); 北京大学软件与微电子学院 2006.2 为什么没有说明中断向量表的基地址?

程序开发技术-异常处理(18)
3. 异常处理程序的安装(续)
安装中断处理程序(续)
程序运行过程中安装(修改)(续) 向量表中使用数据读写指令 (Load PC) 步骤: (1)读取中断处理程序的地址表中addr1 (2)将addr1减去该中断对应的中断向量的地址 vector1 (3)addr=Addr1-vector1-8 (允许指令预取) (4)addr or 0xe59f f000 (5)结果写回中断向量表 问:相对地址最大是多少?

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(19)
3. 异常处理程序的安装(续)
安装中断处理程序(续)
程序运行过程中安装(修改)(续) 向量表中使用数据读写指令
程序:

unsigned Install_Handler (unsigned location, unsigned *vector) { unsigned vec, oldvec; vec = ((unsigned)location - (unsigned)vector - 0x8) | 0xe59ff000 oldvec = *vector; *vector = vec; return (oldvec); }
北京大学软件与微电子学院
2006.2

程序开发技术-异常处理(20)
3. 异常处理程序的安装(续)
安装中断处理程序(续)
程序运行过程中安装(修改)(续)
C语言中使用方式 程序:

unsigned *irqvec = (unsigned *)0x18; static unsigned pIRQ_Handler = (unsigned)IRQ_handler Install_Handler (&pIRQ_Handler, irqvec);

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(21)
4. SWI异常中断处理程序 处理过程 (用户模式调用系统模式下的程序)
第一步:从内存中读取SWI指令,获取其中的24位立即数 第二步:根据获取的立即数,进入相应的SWI功能处理程序

程序
第一部(软中断服务程序) AREA TopLevelSwi, CODE, READONLY EXPORT SWI_Handler SWI_Handler STMFD sp!,{r0-r12,lr} LDR r0,[lr,#-4] BIC r0,r0,#0xff000000 ; ; Use value in r0 to determine which SWI ;routine to execute. ; LDMFD sp!, {r0-r12,pc}^ END

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(22)
4. SWI异常中断处理程序 (续) 程序(续)
第二步(任务单元) CMP r0,#MaxSWI ; Range check? 汇编 LDRLE pc, [pc,r0,LSL #2] 什么条件下执行? B SWIOutOfRange SWIJumpTable DCD SWInum0 DCD SWInum1 ; DCD for each of other SWI routines SWInum0 ; SWI number 0 code B EndofSWI SWInum1 ; SWI number 1 code B EndofSWI ; Rest of SWI handling code ; EndofSWI ; Return execution to top level

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(23)
4. SWI异常中断处理程序 (续) 程序(续)
第二步(任务单元) C 程序 void C_SWI_handler (unsigned number) { switch (number) {case 0 : /* SWI number 0 code */ break; case 1 : /* SWI number 1 code */ break; …… default : /* Unknown SWI - report error */ } 问:第一级中r0的值如何传入c程序中? } 汇编调用 BL C_SWI_handler

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(24)
4. SWI异常中断处理程序 (续)
练习
编写一个64位带进位的加法子程序(c或asm),并能够通过软中 断的方式调用。 要求: 输入是两个64位数 r0, r1 分别为加数1的低字和高字 r2, r3 分别为加数2的低字和高字 输出为64位数 r0, r1位结果的低字和高字 SWI 号是 0x01

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(25)
4. SWI异常中断处理程序 (续)
SWI异常中断调用
在特权模式(系统模式)下的调用 与用户模式的区别 执行SWI会改变spsr_svc和lr_svc中的内容,在进入SWI 中断处理程序前需要保护lr_svc和spsr_svc中的内容。 程序 STMFD sp!,{r0-r3,r12,lr} ; Store registers. MOV r1, sp ; Set pointer to parameters. MRS r0, spsr ; Get spsr. STMFD sp!, {r0} ; SWI calls from ARM state.

为什么要保存 lr和sp?
2006.2

北京大学软件与微电子学院

程序开发技术-异常处理(26)
4. SWI异常中断处理程序 (续)
从应用程序中调用SWI
汇编

MOV LDR SWI

r0, #0x18 r1, =0x20026 0x123456

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(27)
4. SWI异常中断处理程序 (续)
从应用程序中调用SWI
C语言中声明和使用软中断

声明 __swi(0) void my_swi(int);
…… 调用

my_swi(65);

软中断号如何确定?参数如何传递?

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(28)
4. SWI异常中断处理程序 (续)
从应用程序中调用SWI
C(续)
例:1 (swi.h)

__swi(0) int multiply_two(int, int); 〈- 寄存器传递返回结果

函数体在哪儿? 在中断服务程序中!!

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(29)
4. SWI异常中断处理程序 (续)
从应用程序中调用SWI
C(续)
例:1 (swi.h)

struct four_results { int a; int b; int c; int d; }; __swi(1) __value_in_regs struct four_results many_operations(int, int, int, int); 〈-结构传递返回结果 北京大学软件与微电子学院 2006.2

程序开发技术-异常处理(30)
4. SWI异常中断处理程序 (续)
从应用程序中调用SWI
C-多种形式
例: main.c

#include "swi.h" unsigned *swi_vec = (unsigned *)0x08; extern void SWI_Handler(void); //服务程序见前 int main( void ) { Install_Handler( (unsigned) SWI_Handler, swi_vec ); //安装中断服务程序 add_two( result1, result2 ));//_swi (0) res_3 = many_operations( 12, 4, 3, 1 ); //_swi(1) return 0; } 北京大学软件与微电子学院 2006.2

程序开发技术-异常处理(31)
4. SWI异常中断处理程序 (续)
从应用程序中调用SWI(续) C: c_swi_handler.c void C_SWI_Handler( int swi_num, int *regs )

{
switch( swi_num ) { case 0: regs[0] = regs[0] +regs[1]; break; case 1://见下页 break; } }

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(32)
4. SWI异常中断处理程序 (续)
从应用程序中调用SWI(续) C (续)

case

1:
int w, x, y, z; w = regs[0]; x = regs[1]; y = regs[2]; z = regs[3]; regs[0] = w + x + y + z; regs[1] = w - x - y - z; regs[2] = w * x * y * z; regs[3] =(w + x) * (y - z); break;

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(33)
4. SWI异常中断处理程序 (续)
从应用程序中调用SWI
练习 调试example/swi程序,并把运行结果记录下来 编写C程序,能够用SWI调用64位加法(上一条作业)。

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(34)
5. FIQ和IRQ中断处理程序
可重入(reentrant)不可重入中断 可重入:IRQ/FIQ处理程序中允许新的异常中断 不可重入: IRQ/FIQ处理程序中不允许新的异常中断 不可重入的IRQ/FIQ异常处理中断处理程序 方式:C语言中使用关键词_irq来说明,其作用实现下列 操作 进入时保存寄存器 返回时恢复PC和CPSR

问:如何恢复?

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(35)
5. FIQ和IRQ中断处理程序
例 __irq void IRQHandler (void) { volatile unsigned int *base = (unsigned int *) 0x80000000; if (*base == 1) { C_int_handler(); } *(base+1) = 0; }
问:用汇编如何实现?

// which interrupt was it? // process the interrupt // clear the interrupt 为什么要清除端口? 北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(36)
5. FIQ和IRQ中断处理程序(续)
可重入中断处理程序


AREA INTERRUPT, CODE, READONLY IMPORT C_irq_handler IRQ SUB lr, lr, #4 ; construct the return address STMFD sp!, {lr} ; and push the adjusted lr_IRQ MRS r14, SPSR ; copy spsr_IRQ to r14 STMFD sp!, {r12, r14} ; save work regs and ;spsr_IRQ ; Add instructions to clear the interrupt here then re-; ;enable interrupts. MSR CPSR_c, #0x1F ; switch to SYS mode, FIQ and

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(37)
5. FIQ和IRQ中断处理程序(续)
可重入中断处理程序 例 ;IRQ enabled. USR mode registers are now current. STMFD sp!, {r0-r3, lr} ; save lr_USR and non;called saved registers BL C_irq_handler ; branch to C IRQ handler. LDMFD sp!, {r0-r3, lr} ; restore registers MSR CPSR_c, #0x92 ; switch to IRQ mode ;and disable IRQs. FIQ is still enabled. LDMFD sp!, {r12, r14} ; restore work regs and ;spsr_IRQ MSR SPSR_cf, r14 LDMFD sp!, {pc}^ ; return from IRQ. END

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(38)
5. FIQ和IRQ中断处理程序(续)
应用 双通道DMA传输
LDR r13, [r8, #IOStat] ; Load status register to find which ; port caused the interrupt. TST r13, #IOPort1Active LDREQ r13, [r8, #IOPort1] ; Load port 1 data. LDRNE r13, [r8, #IOPort2] ; Load port 2 data. STREQ r13, [r9], #4 ; Store to buffer 1. STRNE r13, [r10], #4 ; Store to buffer 2. CMP r9, r11 ; Reached the end? CMPLE r10, r12 ; On either channel? SUBNES pc, lr, #4 ; Return ; Insert transfer complete code here.

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(39)
5. FIQ和IRQ中断处理程序(续)
练习
对于低速A/D, 处理器常常采用中断服务程序的方式读取转换结果。 现有一20位A/D 与ARM处理器相联,其数据输出端口映到内存地址 为0x800000。共有16个模拟通道通过多路选择开关和A/D输入断 相联。处理器通过向0x810000端口输出0-15的数值选择相应的通 道。 为了保证通道之间数据的一致性,要求每次读取A/D转换的数据时16 个通道依次进行。 请编写程序(C或汇编)读取每个通道60次,并将结果保存在按通道 分配的内存中(内存中各个通道的数据连续在一起)。

北京大学软件与微电子学院

2006.2

程序开发技术-异常处理(45)
6. Reset的过程 初始化堆栈和寄存器 初始化内存管理系统 初始化I/O设备 开中断 设置处理器模式和状态 初始化程序用变量

北京大学软件与微电子学院

2006.2

程序开发技术
ARM异常处理 嵌入式应用设计 内存管理技术 系统初始化 小结

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(1)
1. 生成ROM文件
IDE 指定入口地址 增加 *.scf 文件 改变 fromelf 设置 Make (生成 *.axf 和 *.bin) 演示过程 (embed)

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(2)
1. 生成ROM文件(续)
CMD 汇编
armasm -g vectors.s armasm -g stack.s armasm -g heap.s armasm -g init.s

编译
armcc -c -g -O1 main.c -DEMBEDDED armcc -c -g -O1 retarget.c armcc -c -g -O1 serial.c -I..\include

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(3)
1. 生成ROM文件(续)
CMD(续) 连接
armlink vectors.o init.o main.o retarget.o serial.o stack.o heap.o -scatter scat_b.scf -o embed.axf -entry 0x0 -info totals -info unused

转换
fromelf embed.axf -bin -o embed.bin

Armulator装载
cmd getfile embed.bin 0x0 AXD File-> load Memory From File 北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(4)
2. 如何生成可运行的ROM文件
内存空间分配 ELF格式映像文件的结构

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(5)
2. 如何生成可运行的ROM文件
内存空间分配(续) 各部分的地址映射

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(6)
2. 如何生成可运行的ROM文件
内存空间分配(续) 使用命令行armlink 中的选项 _ro_base:指定包含RO装载和运行时域的地址 _rw_base:指定包含RW段执行时域的地址 _split:将包含RO和RW属性输出段的加载时段分割 成两个运行时域 _ropi: RO属性的加载时域与运行时域位置无关 _rwpi: RW和ZI属性的加载时域与运行时域位置无 关

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(7)
2. 如何生成可运行的ROM文件
内存空间分配(续) 使用Scatter文件定义地址映射 内容 加载时域的起始地址和最大尺寸 各个加载时域的属性 运行时域从加载时域的分割关系 运行时域的起始地址和尺寸 运行时域存储访问特性 运行时域的属性 运行时域中包含的输入段

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(8)
2. 如何生成可运行的ROM文件(续)
内存空间分配(续) 使用Scatter文件定义地址映射 图示

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(9)
2. 如何生成可运行的ROM文件(续) 内存空间分配(续) 使用Scatter文件定义地址映射(续) 例 ROM_LOAD 0x0 { ROM_EXEC 0x0 { vectors.o (Vect, +First) * (+RO) } RAM 0x28000000 { * (+RW,+ZI) } HEAP +0 UNINIT { heap.o (+ZI) } STACKS 0x28080000 UNINIT { stack.o (+ZI) } UART0 0x16000000 UNINIT { uart.o (+ZI) } }

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(10)
2. 如何生成可运行的ROM文件(续)
内存空间分配(续) Ram 在0x00的情况
管理方法 上电时ROM在0x00 正常运行时RAM在0x00 控制过程 Power on to fetch the RESET vector at 0x0 Execute the RESET vector: LDR PC, =0x0F000004 Write to the REMAP register and set REMAP = 1 (改变译码,使得RAM映射到0x00) Complete the rest of the initialization code 硬件译码器如何实现空间重新映射? 北京大学软件与微电子学院 2006.2

程序开发技术-嵌入式应用设计(11)
2. 如何生成可运行的ROM文件(续)
内存空间分配(续) 计算所需内存最小资源 ROM:Code size + RO data + RW data RAM:RW Data + ZI data.

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(12)
2. 如何生成可运行的ROM文件(续)
练习

LPC2106是一款基于ARM7TDMI-S的微控制器,片内有 128K Flash 和64K RAM。其中,Flash起始地址是 0x00000000,RAM的起始地址为0x40000000。假定没 有片外存储器,程序在flash中运行,请为使用该处理器的 工程编写Scatter文件,自己确定各个域(段)的大小。

北京大学软件与微电子学院

2006.2

程序开发技术
ARM异常处理 嵌入式应用设计 内存管理技术 系统初始化 小结

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(1)
1. CP15 寄存器
编号 0 1 2 3 4 5 6 7 8 9 10 13 15 基本作用 ID编码(RO) 配置 存储保护和控制 存储保护和控制 存储保护和控制 存储保护和控制 存储保护和控制 Cache和Buffer 存储保护和控制 Cache和Buffer 存储保护和控制 进程标识符 不同设计使用 在MMU中的作用
ID编码和Cache类 型

在PU中的作用

控制位 转换表基址 域访问控制位 保留 内存失效状态 内存失效地址 Cache和Buffer TLB控制 Cache锁定 TLB控制 进程表识符 不同设计使用 Cache控制 Buffer控制 保留 访问权限控制 保护区域控制 Cache 操作 保留 Cache锁定 保留 不同设计使用

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(2)
2. Memory protection units (PU) 属性
Size 4K 到 4G Base Address PU的起始地址,必须是Size的整数倍 Access Permission 访问权限控制

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(3)
1. CP15(续) 寄存器操作
指令 MCR{<cond>} p15, 0,<Rd>, <CRn>, <CRm> {,<opcode_2>} MRC{<cond>} p15, 0,<Rd>, <CRn>, <CRm> {,<opcode_2>} MCR2 p15, 0,<Rd>, <CRn>, <CRm> {,<opcode_2>} MRC2 p15, 0,<Rd>, <CRn>, <CRm> {,<opcode_2>} 例 MCR p15, 0, R4, c1, c0, 0 MRC p15, 0, R0, c0, c0, 0 注意:c1, c0中的c是小写
北京大学软件与微电子学院
2006.2

程序开发技术-内存管理(4)
2. Memory protection units (PU) (续) 设置
设定保护区域的地址和大小,并打开(使能)(c6 of CP15) 设定每个区域Cachable 和Bufferable的标志(c2 and c3 ) 设定每个区域的权限(c5) 打开Cache和PU (c1)

设定保护区域的地址和大小
寄存器说明(c6) 基地址[31:12] bits [11:6] 必须置零 区域大小 [5:1] bit [0] 使能位 0:关闭 1:打开

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(5)
2. Memory protection units (PU) (续) 设定保护区域的地址和大小(续)
寄存器说明(续) 区域大小 [5:1] 0b01011: 4KB; 0b01100: 8KB; 0b01101: 16KB; 0b01110: 32KB 0b01111: 64KB; 0b10000: 128KB; 0b10001: 256KB; 0b10010: 512KB 0b10011: 1MB; 0b10100: 2MB; 0b10101: 4MB; 0b10110:8MB

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(6)
2. Memory protection units (PU) (续) 设定保护区域的地址和大小(续)
寄存器说明(续) 区域大小 [5:1] (续) 0b10111: 16MB; 0b11000: 32MB; 0b11001: 64MB 0b11010: 128MB; 0b11011: 256MB; 0b11100: 512MB 0b11101: 1GB; 0b11110: 2GB; 0b11111:4GB

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(7)
2. Memory protection units (PU) (续) 设定保护区域的地址和大小(续)


LDR r0,=0xFFFF801D ;(32K) MCR p15,0,r0,c6,c1,0 ; data region 1 MCR p15,0,r0,c6,c1,1 ; instruction region 1 LDR r0,=0xB0000039 ;(512MB) MCR p15,0,r0,c6,c2,0 ; data region 2 LDR r0,=0x4000001F MCR p15,0,r0,c6,c3,0 ;(64K) ; data region 3

MOV r0,#0x1D ;(32K) MCR p15,0,r0,c6,c4,0 ; data region 4 MCR p15,0,r0,c6,c4,1; instruction region 4 北京大学软件与微电子学院 2006.2

程序开发技术-内存管理(8)
2. Memory protection units (PU) (续) 设定区域Cachable 和Bufferable的标志

寄存器的使用 c2: Cache Bits [7:0] Cache 标志. Opcode 2 选择指令或数据 0:数据 1:指令 c3: Buffer Bits [7:0] Bufferable 标志.

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(9)
2. Memory protection units (PU) (续)

设定区域Cachable 和Bufferable的标志. 例
MOV r0,#2_00011010 ; set data regions 1, 3 and 4 as ;cacheable, all others noncacheable MCR p15,0,r0,c2,c0,0

MOV r0,#2_00001000 ; set data region 3 as write ;bufferable, all others nonbufferable MCR p15,0,r0,c3,c0,0

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(10)
2. Memory protection units (PU) (续) 设定每个区域的权限
寄存器 C5 [15:14]:区域7控制位 [13:12]:区域6控制位 [11:10]:区域5控制位 …… [1:0]:区域0控制位 控制位定义 00:No access 01:允许特传权模式访问(SYSTEN) 10: 用户模式只读,特权模式完全 11: 完全

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(11)
2. Memory protection units (PU) (续) 设定每个区域的权限 (续)
例 MOV r0,#2_1111111100 MCR p15,0,r0,c5,c0,0 MOV r0,#2_1000001000 ; set instruction region 1 ;and 4 as: MCR p15,0,r0,c5,c0,1 ; Privileged Mode, full access; ;User Mode, read only ; set data region 1, 2, 3 ;and 4 as full access

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(12)
2. Memory protection units (PU) (续) 使能 PU
寄存器 C1 (ARM940T) Bit[31:14]:保留 Bit[13]:支持高端异常中断向量标的系统 (V) 0:0x00000000-0x0000001c 1: 0xffff0000-0xffff001c Bit[12]: 指令Cache使能位 (I) 0:禁止 1:打开 Bit[11:8]:保留 Bit[7]:Big-end bit (E) 0: little-endian 1: Big-endian

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(13)
2. Memory protection units (PU) (续) 使能 PU (续)
寄存器 (续) C1 (ARM940T)(续) Bit[6:3]:保留 Bit[2]:数据Cache使能 Data cache enable flag (D) Bit[1]:保留 Bit[0]:PU或MMU使能 0:禁止 1:打开

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(14)
2. Memory protection units (PU) (续) 使能 PU (续)
例 MRC p15,0,r0,c1,c0,0 ; read core configuration register ORR r0,r0,#0xC0000000 ; set asynchronous clocks and ;not fastbus mode ORR r0,r0,#0x1000 ; enable instruction cache ORR r0,r0,#0x5 ; enable data cache and PU MCR p15,0,r0,c1,c0,0 ; write modified value to core ;configuration register

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(15)
3. Memory Management Units (MMU) MMU作用
实现虚拟地址和物理地址之间的转换 控制内存的访问权限

虚拟地址和物理地址之间的转换

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(16)
3. Memory Management Units (MMU) 设置MMU
步骤 在内存种建立转换表(Translation Table) 地址转换 Cache 和Bufferable标志 域的编号 访问权限 在c2寄存器中保存转换表地址 打开Cache和MMU使能(c1)

问:转换表(Translation Table)和TLB (Translation Lookaside Buffers)有什么不同?
北京大学软件与微电子学院
2006.2

程序开发技术-内存管理(17)
3. Memory Management Units (MMU) 设置MMU(续)
建立TTB
例 :4096条索引,000XXXXX-FFFXXXXX

LDR LDR MOV ORR ORR ORR

r0,=TTB ; Set start of translation table base ;on 16KB boundary) r1, =0xFFF ; Set loop counter for 4096 r2, #2_110000000000; Set access ;permissions for full access (bits 11:10) r2,r2,#2_000111100000 ; Set domain ;number to 15 (bits 8:5) r2,r2,#2_000000010000 ; Set bit 4 to 1 r2,r2,#2_000000000010 ; Set as 1MB section ;(bits 1:0) All unused bits are 0

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(18)
3. Memory Management Units (MMU) 设置MMU(续)
建立TTB
例:4096条索引,000XXXXX-FFFXXXXX

loop ORR r3,r2,r1,LSL#20 ; Build pattern into ;empty register STR r3,[r0,r1,LSL#2] ; Use loop counter to ;create individual table base addresses SUBS r1,r1,#1 ; Decrement loop counter BPL loop ; Loop until r1 goes negative

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(18)
3. Memory Management Units (MMU) 设置MMU(续)
建立TTB
例:4096条索引,000XXXXX-FFFXXXXX

loop ORR r3,r2,r1,LSL#20 ; Build pattern into ;empty register STR r3,[r0,r1,LSL#2] ; Use loop counter to ;create individual table base addresses SUBS r1,r1,#1 ; Decrement loop counter BPL loop ; Loop until r1 goes negative

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(19)
3. Memory Management Units (MMU) 设置MMU(续)
设定TTB的位置
寄存器 C2 例

LDR r0,=TTB : Set start of translation table ;base on 16KB boundary MCR p15,0,r0,c2,c2,0 ; Write value to CP15 c2

北京大学软件与微电子学院

2006.2

程序开发技术-内存管理(20)
3. Memory Management Units (MMU) 设置MMU(续)
使能MMU
寄存器 C1 例

MRC p15,0,r0,c1,c0,0 ; Read control register ORR r0,r0,#0xC00000000 ; Set asynchronous ;clocking mode bits ORR r0,r0,#0x1000 ; Set enable instruction ;cache bit ORR r0,r0,#0x5 ; Set enable data cache ;and MMU bits MCR p15,0,r0,c1,c0,0 ; Write to control ;register
北京大学软件与微电子学院
2006.2

程序开发技术
ARM异常处理 嵌入式应用设计 内存管理技术 系统初始化 小结

北京大学软件与微电子学院

2006.2

程序开发技术-系统初始化(1)
中断向量表 初始化存储器系统 初始化堆栈 初始化有特殊要求的端口、设备 初始化应用程序执行环境 改变处理器模式 呼叫主应用程序

北京大学软件与微电子学院

2006.2

程序开发技术-系统初始化(2)
中断向量表 AREA Boot, CODE, READONLY ENTRY B Reset_Handler ; Reset_Handler is a label B Undef_Handler B SWI_Handler B PreAbort_Handler B DataAbort_Handler B . ; for reserved interrupt, stop here B IRQ_Handler B FIQ_Handler

北京大学软件与微电子学院

2006.2

程序开发技术-系统初始化(3)
初始化存储器系统
存储器类型和时序配置
通常Flash 和SRAM 同属于静态存储器类型, 可以合用同一个存储器端口; DRAM 因为动态刷新和地址线复用等特性,通 常配有专用的存储器端口。

北京大学软件与微电子学院

2006.2

程序开发技术-系统初始化(4)
初始化存储器系统(续)
存储器地址分布(memory map)
地址重映射

北京大学软件与微电子学院

2006.2

程序开发技术-系统初始化(5)
初始化存储器系统(续)
初始化堆栈
MRS R0, CPSR ; CPSR -> R0 BIC R0, R0, #MODEMASK ORR R1, R0, #IRQMODE ; 把设置模式位设置成需要的模 ;式 MSR CPSR_cxsf, R1 ; 转到IRQ 模式 LDR SP, =UndefStack ; 设置 SP_irq

ORR R1,R0,#FIQMODE MSR CPSR_cxsf, R1 ; FIQMode LDR SP, =FIQStack ORR R1, R0, #SVCMODE MSR CPSR_cxsf, R1 ; SVCMode LDR SP, =SVCStack

北京大学软件与微电子学院

2006.2

程序开发技术-系统初始化(6)
初始化存储器系统(续)
初始化Cache
IF :DEF: CACHE IMPORT Clock_Speed IMPORT Cache_Init BL Clock_Speed BL Cache_Init ENDIF

北京大学软件与微电子学院

2006.2

程序开发技术-系统初始化(7)
初始化有特殊要求的端口、设备
void init_serial_A(void) { UART0_LCRL = LCRL_Baud_38400; UART0_LCRM = LCRM_Baud_38400; UART0_LCRH = LCRH_Word_Length_8 | LCRH_Fifo_Enabled; UART0_CR = CR_UART_Enable; }

北京大学软件与微电子学院

2006.2

程序开发技术-系统初始化(8)
初始化应用程序执行环境
程序ROM->RAM (需要时) 初始化变量
例:

LDR r0, =|Image$$RO$$Limit| ; Get pointer to ;ROM data LDR r1, =|Image$$RW$$Base| ; RAM copy address LDR r3, =|Image$$ZI$$Base| ; Zero init base => ;top of initialised data CMP r0, r1 ; Check that they are different BEQ %F1

北京大学软件与微电子学院

2006.2

程序开发技术-系统初始化(9)
初始化应用程序执行环境
0 例: CMP r1, r3 ; Copy init data LDRCC r2, [r0], #4 ; ([r0] -> r2) and (r0+4) STRCC r2, [r1], #4 ; (r2 -> [r1]) and (r1+4) BCC %B0 LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment MOV r2, #0 CMP r3, r1 STRCC r2, [r3], #4 ; (0 -> [r3]) and (r3+4) BCC %B2
北京大学软件与微电子学院

1

2

2006.2

程序开发技术-系统初始化(10)
改变处理器模式
过程

北京大学软件与微电子学院

2006.2

程序开发技术-系统初始化(11)
呼叫主应用程序
方式
直接
IMPORT main ; get the label main if main() is ;defined in other files B man ; jump to main() 分步 IMPORT __main B __main

北京大学软件与微电子学院

2006.2

程序开发技术-系统初始化(12)
呼叫主应用程序
有系统调用参与的程序执行流程

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(13)
示例 (sample\embed\) main int main(void) { init_serial_A(); printf("C Library Example\n"); demo_printf(); demo_sprintf(); demo_float_print(); demo_malloc(); return 0;}
北京大学软件与微电子学院
2006.2

程序开发技术-嵌入式应用设计(14) 示例 (sample\embed\)(续)
异常中断向量
ENTRY LDR PC, Reset_Addr LDR PC, Undefined_Addr LDR PC, SWI_Addr LDR PC, Prefetch_Addr LDR PC, Abort_Addr NOP LDR PC, IRQ_Addr LDR PC, FIQ_Addr IMPORT Reset_Handler
北京大学软件与微电子学院
2006.2

程序开发技术-嵌入式应用设计(17) 示例 (sample\embed\)(续)
异常中断向量(续)
IMPORT Reset_Handler Reset_Addr DCD Reset_Handler Undefined_Addr DCD Undefined_Handler SWI_Addr DCD SWI_Handler Prefetch_Addr DCD Prefetch_Handler Abort_Addr DCD Abort_Handler IRQ_Addr DCD IRQ_Handler FIQ_Addr DCD FIQ_Handler END
北京大学软件与微电子学院
2006.2

程序开发技术-嵌入式应用设计(18)
示例 (sample\embed\)(续)
初始化程序 AREA
ENTRY ;Remap

Init, CODE, READONLY

IF :DEF: ROM_RAM_REMAP LDR pc, =Instruct_2 Instruct_2 LDR r1, =CM_ctl_reg LDR r0, [r1] ORR r0, r0, #Remap_bit STR r0, [r1] ENDIF

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(19)
示例 (sample\embed\)(续)
初始化程序 (续) EXPORT Reset_Handler Reset_Handler ; --- Initialize stack pointer registers IMPORT top_of_stacks LDR r0, =top_of_stacks MSR SUB MSR SUB CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit sp, r0, #Offset_IRQ_Stack CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit sp, r0, #Offset_SVC_Stack

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(20)
示例 (sample\embed\)(续)
初始化程序 (续) ; --- Initialize memory system IF :DEF: CACHE IMPORT Clock_Speed IMPORT Cache_Init BL Clock_Speed BL Cache_Init ENDIF ; --- Initialize critical IO devices ; ... IMPORT __main ; --- Now enter the C code B __main END

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(22)
示例 (sample\embed\)(续)
重新实现IO功能 (续)
int fputc(int ch, FILE *f) { …… } int ferror(FILE *f) { …… } void _sys_exit(int return_code) { …… } void _ttywrch(int ch) { …… 北京大学软件与微电子学院 }

2006.2

程序开发技术-嵌入式应用设计(23)
示例 (sample\embed\)(续)
重新实现IO功能 (续) __value_in_regs struct __initial_stackheap __user_initial_stackheap( unsigned R0, unsigned SP, unsigned R2, unsigned SL) { struct __initial_stackheap config; config.heap_base = (unsigned int)&bottom_of_heap; config.stack_base = SP; return config; }

北京大学软件与微电子学院

2006.2

程序开发技术-嵌入式应用设计(24)
示例 (sample\embed\)(续)
串口驱动程序

void init_serial_A(void) { UART0_LCRL = LCRL_Baud_38400; UART0_LCRM = LCRM_Baud_38400; UART0_LCRH = LCRH_Word_Length_8 | LCRH_Fifo_Enabled; UART0_CR = CR_UART_Enable; } void sendchar( char *ch ) { while (UART0_FR & FR_TX_Fifo_Full) if (*ch == '\n') *ch = '\r'; UART0_DR = *ch; } 北京大学软件与微电子学院

2006.2

程序开发技术
ARM异常处理 嵌入式应用设计 内存管理技术 系统初始化 小结

北京大学软件与微电子学院

2006.2

程序开发技术-小结
异常处理
异常中断向量特点 中断处理程序的编写和安装

嵌入式应用设计

如何生成rom文件 Scatter文件及其编写方法 Bootloader程序的组成部分 Cp15及其相关寄存器 PU设置 MMU的设置

内存管理

系统初始化
北京大学软件与微电子学院
2006.2

程序开发技术
4. 练习 1. 编写一个系统内存管理程序,要求采用PU方法。 该系统的内存映射结构
0x0900 0000-0xFFFF FFFF 0x0500 0000-0x08FF FFFF 0x0300 0000-0x04FF FFFF 0x0200 0000-0x02FF FFFF 0x0100 0000-0x01FF FFFF 0x0000 0000-0x00FF FFFF 保留 SDRAM 保留 外围接口 I/O FLASH (ROM)

2. 说明ARM的Bootloader 程序至少包括那些部分, 从网上寻找并注释一ARM Bootloader 程序。
北京大学软件与微电子学院
2006.2


相关文章:
嵌入式微处理器系统读书报告
嵌入式微处理器系统读书报告_计算机软件及应用_IT/计算机_专业资料。《嵌入式微处理器系统》 专题读书报告 姓名:全妤 1、引言 随着医疗电子、智能家居、物流管理和...
关于嵌入式系统
嵌入式处理器一般可分为嵌入式微处理 器(EMPU)、嵌入式微控制器(EMCU)、嵌入...驱动程序的好坏直接影响着系 统的性能。 3、操作系统层 、 嵌入式操作系统是...
嵌入式微处理器
论文题目 嵌入式微处理器 姓 名: 任涛 刘彦文 教授 指导老师: 专业: 电子...嵌入式计算机系统是整个嵌入式系统的核心,由硬件层、中间层、系 统软件层和应用...
2011年_嵌入式试卷A卷及答案
ARM 微处理器支持 7 种运行模式,分别为: 用户模式(USR) :ARM 处理器正常...嵌入式实时操作系 统 5、若 R1=2000H,(2000H)=0x86,(2008H)=0x39,则...
18《嵌入式微处理器系统》实验教学大纲
18《嵌入式微处理器系统》实验教学大纲_电脑基础知识_IT/计算机_专业资料。嵌入式教学大纲 《嵌入式微处理器系统》实验教学大纲课程编号: 课程名称:嵌入式微处理器...
嵌入式思考题2013-比较全
嵌入式处理器分类:嵌入式微控制器、嵌入式微处理器、嵌入式 DSP 处理 器、...一个最小的 Windows CE 系统至少由内核和文件系 统模块组成。 5)基于μ C ...
期末考核2016嵌入式系统
以 32 位 RISC 嵌入式处理器加嵌入式操作系统为标志的嵌入式系统为其发展的第三个阶段。 答:对 2. 嵌入式系统的硬件一般包括嵌入式微处理器、外围电路和嵌入...
嵌入式第一章课后习题
硬件层:以嵌入式微处理器为核心,存储器用以存储数据和执行代码,相关的设备接 ...⑵ 操作系统相关性:不同的操作系统具有各自的软件层次结构,因此,不同的操作系 ...
微处理器的嵌入式系统研究论文
嵌入式微处理器系 101页 免费 嵌入式微处理器第五章 41页 免费喜欢此文档的还喜欢 微处理器系统结构与嵌入式... 66页 免费 微处理器系统结构与嵌入式... ...
嵌入式系统设计师考试笔记之嵌入式微处理器笔记
嵌入式系统设计师考试笔记之嵌入式微处理器一、引言 嵌入式微处理器是嵌入式系统的核心器件, 深入理解嵌入式微处理器的工作原理, 组成结构、 体系结构以及软件编程...
更多相关标签:
微处理器与嵌入式系统 | 嵌入式微处理器 | 嵌入式微处理器的分类 | 嵌入式微处理器结构 | 嵌入式微处理器的优点 | 微处理器体系结构 | 64位微处理器系统编程 | 微处理器最小系统设计 |