|
4. ARM7 编程要点及示例
VxWorks image 装入ARM的过程:
ARM7 有两种运行模式, Boot 模式和 Normal 模式, Boot模式主要是把程序装入(down load 或load )Flash ROM中用的, Normal模式是一般运行程序用的.
ARM7 Boot 模式时, Flash 的地址是0x70000000片选型号是CS0 (Normal模式下,Flash地址为0x00000000)
ARM7内部有128byte的BootROM和2K的SRAM,当需要Download VxWorks image时,ARM启动采用Boot方式启动运行存在128byte BootROM中的程序初始化ARM内部的COM口,从COM口接受数据到2K的SRAM,这2K程序是用来真正Load VxWorks的,2K程序Load完毕后系统自动跳转到这2K程序执行,它的作用是再次初始化内部的COM口,通过COM口接受VxWorks到DRAM,然后由DRAM写入FLASH。
写入完毕后,切换到Normal模式重新启动系统,系统自动跳到FLASH 0X00000000开始运行VXWORKS。
用PC机上的COM1与ARM内部的UART1(COM)通信来Download VxWorks。
主要管脚定义
32条数据线: D0-------D31
28条地址线: A0-------A27 little endian 定义, 相对应数据排列 0 1 2 3 4 5 6--------27
6条片选信号脚: CS0-------CS5, 其实作用相当于地址线 A28------A31
4个8位的PORT口: PORT A, PORT B , PORT D主要用于外围芯片信号的控制. PORT E有双作用.
例如 PORT A 控制键盘的行信号, PORT B 用于RS232, PORT D 用于控制MODEM, FPGA..
外部中断信号EINT, EXTFIQ。
编程时要根据主板原理图和硬件手册进行。
a.看硬件图纸, 该芯片和CPU的那些管脚连结。 特别是 PORT 口和片选线。
b.查CPU手册, 得到PORT 口和该片选的硬件地址。
c.编程: 用PORT口直接对芯片操作,如开,关,RESET等, 用片选地址和芯片内地址结合对该外围芯片操作。
Exception vectors, 中断向量表及中断分配
这个向量表必须要放置在系统地址0x00000000 (一般是逻辑地址, 即经过MMU映射后的地址)处。
一般是在这些地址上放跳转指令 BL, 跳到相应的地址空间执行相应的程序。
如系统执行从0x00000000 Reset开始, Reset 跳转到某一地址开始运行操作系统。
程序示例,中断向量表 (ARM asm):
__VectorStart ; Start of ARM processor vectors
LDR pc,ResetV ; 00 - Reset
LDR pc,UndefV ; 04 - Undefined instructions
LDR pc,SWIV ; 08 - SWI instructions
LDR pc,PAbortV ; 0C - Instruction fetch aborts
LDR pc,DAbortV ; 10 - Data access aborts
LDR pc,UnusedV ; 14 - Reserved (was address exception)
LDR pc,IRQV ; 18 - IRQ interrupts
LDR pc,FIQV ; 1C - FIQ interrupts'
中断号分配 (FIQ, IRQ)
中断号也是寄存器INTMR和INTSR的位,所以在ARM中中断的编程要点是看硬件图纸, 该外设和CPU的那一个管脚连结。
查CPU手册, 得到中断号及INTMR,INTSR的地址。
编程
注: 如果不是写底层driver, 只是在系统上层编程(如VxWorks, Linux) 知道中断号即可。
程序示例(VxWorks):
//登记中断号 5, 和相应的中断例程 ComISR.
intConnect ( ( VOIDFUNCPTR * ) 5, ComISR, 0 ) ;
//使能这中断
intEnable ( ( VOIDFUNCPTR * ) 5 );
……
ARM Interrupts: ARM processors implement fast and normal level of interrupt,signalled externally, synchronise interrupts before an exception is raised. A fast interrupt requst (FIQ) will desable subsequent normal and fast interrupt by setting the I and F bit in CPSR,and a normal interrup request(IRQ) will disable subsequent normal interrupt by setting I bit in CPSR.
计时器中断编程过程
ARM7一般内部有两个16位计时器(Timer counter)和一个32位实时时钟(RTC),计时器中断属于IRQ中断,这里以计时器1为例叙述一下中断的编程过程
设置interrup mask INTMR1寄存器 0x80000240 第8位TC1OI计时器1为使能. 在0x800000300 计时器 1 的数据寄存器TC1D写入指定数据,这样数据开始从这个给定的数开始递减计数,计数递减至 0 后,会产生一个溢出underflow IRQ中断请求,中断状态寄存器INTSR1 0x80000240 第8位TC1OI置位.系统会跳到中断向量表地址 0x00000018 处,执行相应的中断程序,中断程序通过判断中断的类型(判断中断状态寄存器的位),来执行相应的中断服务程序ISR. 中断状态寄存器标志位复位,计时器开始重新开始计时.
存储空间管理单元(MMU)
物理地址映射
重点在于片选地址CS的选取,另外MMU映射需要参考这个物理地址
ARM7 物理地址映射表
MMU 虚拟(逻辑)地址和物理地址的映射实例
Vxworks支持的ARM架构的处理器,一般是RAM的起始位置为0x0,而实际上ARM的物理地址0x0是ROM的起始地址,RAM在高位地址.这就需要系统在Boot过程中,执行MMU程序,重新映射RAM和ROM的地址.即RAM起始地址为0x0.
MMU主要有ARM7中协处理器coprocessor 15控制,coporocessor主要控制:
片内的MMU
指令和数据缓存(IDC)
Write Buffer(WB)
MMU有两层页表(two-level page table)用来进行虚拟地址向物理地址转换,CP15定义16个寄存器,只有MRC和MCR指令才能对它们操作.
在VxWorks系统中,MMU表分成两部分:boot up table和final table.在文件ramAtHigh.h中定义.该表在文件romInit.s中初始化,语句为:
BL _ramAtHigh_1(2)
MMU映射实例
虚拟(逻辑)地址(VxWorks系统)
硬件物理地址
相同的颜色映射对应的地址 |
|