浅谈S3c2410软件调试方法(三)

时间:2011-08-26

  S3C2410处理器是Samsung公司基于ARM公司的ARM920T处理器核,采用0.18um制造工艺的32位微控制器。该处理器拥有:独立的16KB指令Cache和16KB数据Cache,MMU,支持TFT的LCD控制器,NAND闪存控制器,3路UART,4路DMA,4路带PWM的Timer ,I/O口,RTC,8路10位ADC,Touch Screen接口,IIC-BUS 接口,IIS-BUS 接口,2个USB主机,1个USB设备,SD主机和MMC接口,2路SPI.S3C2410处理器可运行在203MHz.

  2410启动代码分析

  这一章主要对目前广泛流行的2410启动代码进行分析:S3C2410的初始化代码主要涉及到对系统主要模块的配置、运行环境的建立、系统时钟、MMU等模块的配置,下面按执行顺序依次都各个部分进行分析:

  程序入口:

  在程序一开始,首先进行的一些操作主要保证初始化程序能够顺利的运行, 因此主要包括关闭WDT、中断,配置锁相环等。

  配置memory接口

  memory接口是确保数据访问正确的基本保障,此处主要配置SFR寄存器中0x48000000开始的memory接口寄存器组, 确保每个bank的位宽、访问类型(waitable)以及时序参数正确。内存是由一群芯片所组成,是计算机的记忆单元,内存的数据存取时间影响计算机的处理速度,内存的容量大小及单位价格则决定计算机的系统成本,同时内存决定了计算机可同时执行程序的大小与多寡,还有处理数据的大小。所以内存是就构成了计算机工作的主要空间,来储存立即使用的数据。所以在计算机的发展过程中,大部分时期皆由内存的制造技术与单位成本所主宰,足见内存在计算机系统中的重要性。如果没有特别的要求,一般来说时序参数使用默认值即可。

  初始化堆栈

  ARM有6种运行模式,必须为每一种模式提供独立的堆栈空间,在堆栈设置之前是不能进行C函数的调用的。ARM的堆栈模式 是从高地址递减的,我的所有代码统一将堆栈的首地址设在0x33ff8000处,往低依次为FIQ、IRQ、Abort、Undef、SVC,其中SVC和User模式不予区分。

  运行空间的初始化

  这段代码主要完成两个功能,一是将RW数据搬运到RW空间,二是 初始化ZI数据段。这段代码存在的前提是代码的运行环境只是标准的两段式:一段RO空间和一段RW空间;并且在C程序

  入口时没有调用编译器的链接库。后者已经提供相应的功能,并且支持更加复杂的运行环境定义(使用SCF文件),在ADS1.2的环境中,如果在C入口没有调用编译器的链接库(__main),那么在C程序一开始要调用该函数以初始化运行时的函数库,以保证对ADS提供的某些库函数能够正常调用。

  MMU初始化

  2410的MMU支持1级&2级地址映射,在我们目前大部分应用中均采用1级section模式的地址映射,一个section的大小为1M,也就是说从逻辑地址到物理地址的转变是这样的一个过程:

  任何时候,计算机上都存在一个程序能够产生的地址集合,我们称之为地址范围。这个范围的大小由CPU的位数决定,例如一个32位的CPU,它的地址范围是0~0xFFFFFFFF (4G),而对于一个64位的CPU,它的地址范围为0~0xFFFFFFFFFFFFFFFF (64T)。这个范围就是我们的程序能够产生的地址范围,我们把这个地址范围称为虚拟地址空间,该空间中的某一个地址我们称之为虚拟地址。与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址,大多数时候我们的系统所具备的物理地址空间只是虚拟地址空间的一个子集。

  一个32位的地址,高12位决定了该地址在页表中的index,这个index的内容决定了该逻辑section对应的物理section; 低20位决定了该地址在section中的偏移(index)。

  因此从0x0~0xffffffff的地址空间总共可以分成0x1000(4K)个section,页表中每项的大小为32个bit,因此页表的大小为0x4000(16K)。在我的代码中所有程序的页表统一存放在地址0x33ff8000.

  每个页表项的内容如下:

  bit: 31 20 19 12 11 10 9 8 5 4 3 2 1 0

  content: Section对应的物理地址 NULL AP 0 Domain 1 C B 1 0

  两位(10)是section分页的标识。

  AP:Access Permission,区分只读、读写、SVC&其它模式。

  Domain:每个section都属于某个Domain,一个有16个Domain,每个Domain的属性由CP15的R3寄存器控制。 在我得所有程序中,都只包含两个Domain,一个是SFR地址以下的空间,可访问; 另一个是SFR以上的空间,不可访问。

  C、B:这两位决定了该section的cache&write buffer属性,这与该段的用途(RO or RW)有密切关系。不同的用途要做不同的设置。

  C B 具体含义

  0 0 无cache,无写缓冲,任何对memory的读写都反映到ASB总线上。

  对 memory 的操作过程中CPU需要等待。

  0 1 无cache,有写缓冲,读操作直接反映到ASB总线上。写操作CPU将数据写

  入 到写缓冲后继续运行,由写缓冲进行ASB操作。

  1 0 有cache,写通模式,读操作首先考虑cache hit;写操作时直接将数据写入

  写缓冲,如果同时出现cache hit,那么也更新cache.

  1 1 有cache,写回模式,读操作首先考虑cache hit;写操作也首先考虑cache,

  如果hit,则只修改cache,并将cache对应半行的dirty比特置位;如果miss,

  则写入写缓冲,触发ASB总线操作。

  在我的程序中内存空间的分配统一采用了文末的MEMORY图。虽然MMU只是使用了逻辑地址到物理地址的linear transfer,但是由于MMU能够引入cache&write buffer,因此系统性能有很大的提高!

  配置时钟比、重新设置PLL

  2410内部有三个时钟:FCLK、HCLK、PCLK,分别供CPU、AHB总线和APB总线使用,为了降低功耗,一般都选择周期比为1:2:4的合理配置。

  IO初始化

  将IO口配置为对应的功能选项,同时一般会点亮相应的LED灯。

  中断初始化

  2410的内存空间没有remap的机制,应该中断入口时钟位于零地址。因此中断服务机制可以描述如下:

  首先,不管使用那种启动方式,必须确保一下代码段位于内存的0x0地址:

  b ResetHandler

  b HandlerUndef ;handler for Undefined mode

  b HandlerSWI ;handler for SWI interrupt

  b HandlerPabort ;handler for PAbort

  b HandlerDabort ;handler for DAbort

  b . ;reserved

  b HandlerIRQ ;handler for IRQ interrupt

  b HandlerFIQ ;handler for FIQ interrupt

  除ResetHandler外,其余各项都是由如下的宏定义的一段代码:

  HandlerFIQ HANDLER HandleFIQ

  MACRO

  $HandlerLabel HANDLER $HandleLabel

  $HandlerLabel

  sub sp,sp,#4 ;decrement sp(to store jump address)

  stmfd sp!,{r0} ;PUSH the work register to stack

  ldr r0,=$HandleLabel ;load the address of HandleXXX to r0

  ldr r0,[r0] ;load the contents

  str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack

  ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)

  MEND

  这段代码的含义是通过堆栈将中断向量表中的内容赋给PC指针,自然程序就跳到相应的入口地址。

  可见,中断向量表存放的是各个中断服务程序的入口地址,它是用来被加载的,而并不是可执行代码。为了统一,所有示例程序都将中断向量表放在0x33ffff00开始的地址,并根据入口地址依次排列。



  
上一篇:浅谈新型COM Express嵌入式模块计算机
下一篇:详谈视频转码技术及其转码技术的实现

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料