基于ARM体系的嵌入式系统BSP的程序设计
0000)|
MMU_SECDESC|MMU_CACHEABLE|MMU_BUFFERABLE;
//将这段空间的地址映射关系设置为VA(虚拟地址)=PA(物理地址)+0x1000000
pagetable[0]=(0x42f00000)|MMU_SECDESC|MMU_CACHEABLE|MMU_BUFFERABLE;
//将SDRAM的虚拟地址0x42f00000映射到0处
1.5初始化各模式下的堆栈指针
因为ARM处理器有7种执行状态,每一种状态的堆栈指针寄存器(SP)都是独立的(System和User三项式使用相同SP寄存器)。因此,对程序中需要用到的每一种模式都要给SP寄存器定义一个堆栈地址。方法是改变状态寄存器(CPSR)内的状态位,使处理器切换到不同的状态,然后给SP赋值。这里列出的代码定义了三种模式的SP指针,其中,I_Bit表示IRQ的中断禁止位;F_Bit表示FIQ的中断禁止位:
@;SetupSVCstacktobe4Kontopofzero-initdata
LDRr1,=installStack
ADDsp,r1,#2048
@;SetupIRQandFIQstacks
MOVr0,#(Mode_IRQ32|I_Bit)
MSRcpsr,r0
MOVr0,r0
ADDsp,r1,#2048*2
MOVr0,#(Mode_FIQ32|I_Bit|F_Bit)
MSRcpsr,r0
MOVr0,r0
ADDsp,r1,#2048*3
一般堆栈的大小要根据需要而定,但是要尽可能给堆栈分配快速和高带宽的存储器。堆栈性能的提高对系统性能的影响是非常明显的。
1.6初始化有特殊要求的端口、设备
有些关键的I/O部件必须在使能IRQ和FIQ之前进行初始化。因为如果在使能IRQ和FIQ之前没有进行初始化,可以产生假的异常中断信号。程序中初始化了HMS30C7202的串口1用来调试程序与其它设备通信。串口1是一个通用全双工异步接收/发送器(UART),它支持16C550的大部分功能。UART有接收缓冲/发送保持寄存器、波特率除数锁存器、中断允许寄存器等9个寄存器。对串口1的初始化主要是对各寄存器的设置,其实现代码如下所示:
_outb(ser_base+0x30,1);
_outw(0x8002301c,0xffff9f9f);GPIOPORTAEnable
Register
_outw(0x800230A4,0x6060);GPIOPORTAMultiFunctionelect-Register
serial_outb(SERIAL_LCR,0x80);
serial_outb(SERIAL_LCR,0x80);
serial_outb(SERIAL_DLL,baud_data[cur_baud]);
seri 《基于ARM体系的嵌入式系统BSP的程序设计(第3页)》
本文链接地址:http://www.oyaya.net/fanwen/view/143387.html
MMU_SECDESC|MMU_CACHEABLE|MMU_BUFFERABLE;
//将这段空间的地址映射关系设置为VA(虚拟地址)=PA(物理地址)+0x1000000
pagetable[0]=(0x42f00000)|MMU_SECDESC|MMU_CACHEABLE|MMU_BUFFERABLE;
//将SDRAM的虚拟地址0x42f00000映射到0处
1.5初始化各模式下的堆栈指针
因为ARM处理器有7种执行状态,每一种状态的堆栈指针寄存器(SP)都是独立的(System和User三项式使用相同SP寄存器)。因此,对程序中需要用到的每一种模式都要给SP寄存器定义一个堆栈地址。方法是改变状态寄存器(CPSR)内的状态位,使处理器切换到不同的状态,然后给SP赋值。这里列出的代码定义了三种模式的SP指针,其中,I_Bit表示IRQ的中断禁止位;F_Bit表示FIQ的中断禁止位:
@;SetupSVCstacktobe4Kontopofzero-initdata
LDRr1,=installStack
ADDsp,r1,#2048
@;SetupIRQandFIQstacks
MOVr0,#(Mode_IRQ32|I_Bit)
MSRcpsr,r0
MOVr0,r0
ADDsp,r1,#2048*2
MOVr0,#(Mode_FIQ32|I_Bit|F_Bit)
MSRcpsr,r0
MOVr0,r0
ADDsp,r1,#2048*3
一般堆栈的大小要根据需要而定,但是要尽可能给堆栈分配快速和高带宽的存储器。堆栈性能的提高对系统性能的影响是非常明显的。
1.6初始化有特殊要求的端口、设备
有些关键的I/O部件必须在使能IRQ和FIQ之前进行初始化。因为如果在使能IRQ和FIQ之前没有进行初始化,可以产生假的异常中断信号。程序中初始化了HMS30C7202的串口1用来调试程序与其它设备通信。串口1是一个通用全双工异步接收/发送器(UART),它支持16C550的大部分功能。UART有接收缓冲/发送保持寄存器、波特率除数锁存器、中断允许寄存器等9个寄存器。对串口1的初始化主要是对各寄存器的设置,其实现代码如下所示:
_outb(ser_base+0x30,1);
_outw(0x8002301c,0xffff9f9f);GPIOPORTAEnable
Register
_outw(0x800230A4,0x6060);GPIOPORTAMultiFunctionelect-Register
serial_outb(SERIAL_LCR,0x80);
serial_outb(SERIAL_LCR,0x80);
serial_outb(SERIAL_DLL,baud_data[cur_baud]);
seri 《基于ARM体系的嵌入式系统BSP的程序设计(第3页)》