存档

2006年12月 的存档

S3C2410串口的使用

2006年12月27日

2006-12-27,19:01:04
S3C2410共有3个串口,每个串口有16字节的FIFO寄存器,可选红外模式,可编程波特率,一或两位停止位,5-8位数据位可编,和奇偶校验。

我们先做一个最简单的程序,波特率定为115200,不使用FIFO,一位停止位,8位数据位,无奇偶校验。
程序作用是不停向串口0发送字符’a',即ASCII码61

程序清单如下:

#include “2410addr.h”
void Delay(void);
int Main()
{
int i,j;
rGPHCON=0×2faaa;;
rGPHUP=0xfff;
rULCON0=0×3;
rUCON0=0×5;
rUFCON0=0×0;
rUMCON0=0×0;
rUBRDIV0=( (int)(PCLK/16./115200) -1 );

while(1)
{rUTXH0=’a';
Delay();};

}
void Delay(void)
{
int i;
for(i=100000;i!=0;i–);
}

Jacob 技术

S3C2410 定时计数器的使用

2006年12月26日

调试定时计数器成功,根据手册上的方法

1) Write the initial value into TCNTBn and TCMPBn.
2) Set the manual update bit of the corresponding timer. It is recommended that you configure the inverter on/off bit.
(whether use inverter or not).
3) Set start bit of the corresponding timer to start the timer (and clear the manual update bit).

代码如下:

#include “2410addr.h”
void Delay(void);
int Main()
{
rGPBCON=0×2aa;
rTCFG0=0xff;
rTCFG1=0×0;
rTCNTB0=0xa0;
rTCMPB0=0×6e;
rTCON|=0×0a;
rTCON|=0×1;
rTCON&=0xfffffffd;

}

Jacob 技术

AVR单片机的主要特性(简要精华版)

2006年12月25日

  AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set CPU) 精简指令集高速8位单片机。AVR的单片机可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。

AVR的主要特性

  高可靠性、功能强、高速度、低功耗和低价位 , 一直是衡量单片机性能的重要指标,也是单片机占领市场、赖以生存的必要条件。

  早期单片机主要由于工艺及设计水平不高、功耗高和抗干扰性能差等原因,所以采取稳妥方案:即采用较高的分频系数对时钟分频,使得指令周期长,执行速度慢。以后的 CMOS单片机虽然采用提高时钟频率和缩小分频系数等措施,但这种状态并未被彻底改观(51以及51兼容)。此间虽有某些精简指令集单片机(RISC)问世,但依然沿袭对时钟分频的作法。

  AVR单片机的推出,彻底打破这种旧设计格局,废除了机器周期,抛弃复杂指令计算机 (CISC)追求指令完备的做法;采用精简指令集,以字作为指令长度单位,将内容丰富的操作数与操作码安排在一字之中(指令集中占大多数的单周期指令都是如此),取指周期短,又可预取指令,实现流水作业,故可高速执行指令。当然这种速度上的升跃,是以高可靠性为其后盾的。

   AVR单片机硬件结构采取8位机与16位机的折中策略,即采用局部寄存器存堆(32个寄存器文件)和单体高速输入/输出的方案(即输入捕获寄存器、输出比较匹配寄存器及相应控制逻辑)。提高了指令执行速度(1Mips/MHz),克服了瓶颈现象,增强了功能;同时又减少了对外设管理的开销,相对简化了硬件结构,降低了成本。故AVR单片机在软/硬件开销、速度、性能和成本诸多方面取得了优化平衡,是高性价比的单片机。

   AVR单片机内嵌高质量的Flash程序存储器,擦写方便,支持ISP和IAP,便于产品的调试、开发、生产、更新。内嵌长寿命的EEProm可长期保存关键数据,避免断电丢失。片内大容量的RAM不仅能满足一般场合的使用,同时也更有效的支持使用高级语言开发系统程序,并可像MCS-51单片机那样扩展外部 RAM。

  AVR单片机的I/O线全部带可设置的上拉电阻、可单独设定为输入/输出、可设定(初始)高阻输入、驱动能力强(可省去功率驱动器件)等特性,使的得I/O口资源灵活、功能强大、可充分利用。

  AVR单片机片内具备多种独立的时钟分频器,分别供URAT、I2C、SPI使用。其中与8/16位定时器配合的具有多达10 位的预分频器,可通过软件设定分频系数提供多种档次的定时时间。AVR单片机独有的“以定时器/计数器(单)双向计数形成三角波,再与输出比较匹配寄存器配合,生成占空比可变、频率可变、相位可变方波的设计方法(即脉宽调制输出PWM)”更是令人耳目一新。

  增强性的高速同/异步串口,具有硬件产生校验码、硬件检测和校验侦错、两级接收缓冲、波特率自动调整定位(接收时)、屏蔽数据帧等功能,提高了通信的可靠性,方便程序编写,更便于组成分布式网络和实现多机通信系统的复杂应用,串口功能大大超过MCS-51/96单片机的串口,加之AVR单片机高速,中断服务时间短,故可实现高波特率通讯。

  面向字节的高速硬件串行接口TWI、SPI。TWI与I2C接口兼容,具备ACK信号硬件发送与识别、地址识别、总线仲裁等功能,能实现主/从机的收/发全部4种组合的多机通信。SPI支持主/从机等4种组合的多机通信。

  AVR单片机有自动上电复位电路、独立的看门狗电路、低电压检测电路BOD,多个复位源(自动上下电复位、外部复位、看门狗复位、BOD复位),可设置的启动后延时运行程序,增强了嵌入式系统的可靠性。

  AVR单片机具有多种省电休眠模式,且可宽电压运行(5-2.7V),抗干扰能力强,可降低一般8位机中的软件抗干扰设计工作量和硬件的使用量。

  AVR单片机技术体现了单片机集多种器件(包括FLASH程序存储器、看门狗、EEPROM、同/异步串行口、TWI、SPI、A/D模数转换器、定时器/计数器等)和多种功能(增强可靠性的复位系统、降低功耗抗干扰的休眠模式、品种多门类全的中断系统、具输入捕获和比较匹配输出等多样化功能的定时器 /计数器、具替换功能的I/O端口…… )于一身,充分体现了单片机技术的从“片自为战”向“片上系统SoC”过渡的发展方向。

  综上所述,AVR单片机博采众长,又具独特技术,不愧为8位机中的佼佼者。

Jacob 技术

Insert ARM asm Code into C Code

2006年12月20日

_asm
{
LDR R5,[R6] ;
ORR r0, r0, #0xC0 ;
}

Jacob 技术

ARM9调试问题解决

2006年12月18日

折腾了很多天AXD调试总是不对,调试的时候运行的都是板上的程序,而不是CodeWarrior写的程序,这年头2410的资料真是少。原来只要在 Edit–DebugRel Settings ARM Linker里设置RO = 0, RW = 0×30000000就可以了。自己试出来的,后面转贴一下原理。

Jacob 技术

[转贴]S3C2410软件调试总结

2006年12月18日

这部分介绍下ADS下如何生成可以运行的ROM镜像文件,我们知道当程序下载到flash中运行的时候,对于RW、ZI数据就存在着两个环境,一个 load环境,一个是exec环境,有时候由于速度的需要RO数据也要重新加载,那么对RO数据也是有两个环境。编译器产生ROM镜像文件时候,这三块数据的存放依次为RO、RW、ZI,并且地址空间时连续的。但是到了运行的时候,RW数据必须被拷贝到SDRAM(SRAM)中以支持读写,这就是我们所谓的运行环境。那么就要有一段代码去完成这个任务,在本章中我们介绍如何生成这段代码。

玩过2410的朋友都知道2410初始化代码中有一段搬运RW和ZI初始化的代码,没错,它确实能够在一定程度上完成上面所说的任务,只要我们在生成二进制可执行代码的时候在编译器链接项的地方填写正确的RO&RW地址,(比如RO = 0, RW = 0×30000000), 那么将程序下到 NOR flash的零地址并从nor flash启动,启动代码会将RW&ZI数据弄到0×30000000,程序就能跑起来了。

但是各位有没有想过,怎么把RO代码弄到SDRAM中(有时候这是必须的,比方后面我将提到用nor flash的bootloader烧写nor flash)?如果直接设RO=0×30000000,那么这段代码下载到0地址肯定跑不起来,除非是ROPI,这个要求就高了。这里我们有必要从介绍 ADS中规定的C语言入口开始,ADS中从初始化汇编代码跳到main函数有两种方式,main和__main:

1,在__main入口的模式下,汇编代码的指令为 b __main, 编译器在跳转到main之前还要作一系列的工作,这其中就包括对运行环境的初始化,在中提到: copies nonroot(RO&RW) execution regions from load addr to exec addr, and Zeros ZI region. 借助编译器,我们就可以定义更为复杂的运行环境,这里要用到scatter文件(.scf),比如我们要的目标运行环境是:将启动代码以外的所有代码都拷贝到SDRAM的初始地址中运行,比且把RW段设在0×30800000,那么对应的scf文件如下:

FLASH 0×0 0×200000
{
EXEC1 0×0 0×200000
{
2410init.o(Init, +First)
__main.o(+RO) copy code
* (Region$$Table) RO/RW addresses to copy
* (ZISection$$Table) ZI addresses to zero
}
EXEC2 0×30000000 0×00800000
{
*(+RO)
}
SDRAM 0×30800000 0×00800000
{
*(+RW,+ZI)
}
}
;Sections named Region$$Table and ZISection$$Table which contain the addresses of the code/data to be copied.

当然,在这种模式下,有些入口函数必须自己重定义,比如__user_initial_stackheap,具体参见ADS文档。

2, main入口模式即简单的跳转,这里起始不用“main”这个名字也无所谓。那么编译器不会作任何的初始化,所有运行环境的建立都要* 我们自己,这就是大家看到的那段搬运代码存在的理由。但是它实现一些简单的运行环境是可取的,如果用scf定义的复杂环境,虽然我相信是可以做到的,但是可能会比较麻烦。我还没深究。

另外,这里提一下semihost,因为我们在看ADS的东西的时候经常出现这个词,我也一直受其困扰。这里我简单说一下自己的见解,semihost 仅仅是一种调试手段,它的机理就是利用MULTI_IDE等工具捕捉目标环境运行过程中产生的值为0×123456的SWI中断,然后向上位机的ADS 软件发送对应的调试信息。对于我们最后的应用代码来说,都是nonsemihost类型的。如果我们在调试中使用semihost,那么只要在最后重定义 ADS中的一些使用到的库函数(比如fputc),代码就可以从semihost向nonsemihost的类型转变。不过到目前为止,我还没体会到 semihost的威力。

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

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

配置memory接口
memory接口是确保数据访问正确的基本保障,此处主要配置SFR寄存器中0×48000000开始的memory接口寄存器组, 确保每个bank的位宽、访问类型(waitable)以及时序参数正确。如果没有特别的要求,一般来说时序参数使用默认值即可。

初始化堆栈
ARM有6种运行模式,必须为每一种模式提供独立的堆栈空间,在堆栈设置之前是不能进行C函数的调用的。ARM的堆栈模式 是从高地址递减的,我的所有代码统一将堆栈的首地址设在0×33ff8000处,往低依次为FIQ、IRQ、Abort、Undef、SVC,其中
SVC和User模式不予区分。堆栈大小一般可在头文件或者当前文件中修改。

运行空间的初始化
这段代码主要完成两个功能,一是将RW数据搬运到RW空间(我们生成ROM镜像时,RW数据是跟在RO数据之后的),二是 初始化ZI数据段。当然,这段代码存在的前提是代码的运行环境只是标准的两段式:一段RO空间和一段RW空间;并且在C程序
入口时没有调用编译器的链接库(__main)。后者已经提供相应的功能,并且支持更加复杂的运行环境定义(使用SCF文件),
(关于这一点,我在介绍ADS中C代码的启动模式时已经详细介绍)。

__rt_lib_init
在ADS1.2的环境中,如果在C入口没有调用编译器的链接库(__main),那么在C程序一开始要调用该函数以初始化运行时的函数库,以保证对ADS提供的某些库函数能够正常调用。从这个函数开始,我们已经在C语言环境下了。

MMU初始化
2410的MMU支持1级&2级地址映射,在我们目前大部分应用中均采用1级section模式的地址映射,一个section的大小为1M,也就是说从逻辑地址到物理地址的转变是这样的一个过程:
一个32位的地址,高12位决定了该地址在页表中的index,这个index的内容决定了该逻辑section对应的物理section; 低20位决定了该地址在section中的偏移(index)。
因此从0×0~0xffffffff的地址空间总共可以分成0×1000(4K)个section,页表中每项的大小为32个bit,因此页表的大小为0×4000(16K)。在我的代码中所有程序的页表统一存放在地址0×33ff8000。
每个页表项的内容如下:

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)的空间,可访问; 另一个是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的合理配置。 同时将PLL配置为运行环境时钟,一般都达到最高202M。

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

中断初始化
2410的内存空间没有remap的机制,应该中断入口时钟位于零地址。因此中断服务机制可以描述如下:
首先,不管使用那种启动方式,必须确保一下代码段位于内存的0×0地址:
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指针(如HandleFIQ是存放着FIQ服务程序入口地址的地址),自然程序就跳到相应的入口地址。
可见,中断向量表存放的是各个中断服务程序的入口地址,它是用来被加载的,而并不是可执行代码。为了统一,所有示例程序都将中断向量表放在0×33ffff00开始的地址,并根据入口地址依次排列。
需要注意的是如果各种模式的服务程序用C语言定义,那么类型必须用__irq定义,以保证能够正确返回。

初始化串口
串口统一选用UART0,模式采用115200、1bit STOP、No Parity。

最后跳转到我们自己的应用程序!

附:我得程序所使用的地址空间结构以及MMU中C、B的设置:

Blank Area: RW_FAULT 0×5b000000 ~ 0xffffffff

Sram & SFR: NCNB 0×40000000 ~ 0×4affffff

Blank Area: RW_FAULT 0×34000000 ~ 0×3fffffff

Int_Vec, Stack, MTT: CNB 0×33f00000 ~ 0×33ffffff

SDRAM Download: NCNB 0×31000000 ~ 0×33efffff

SDRAM Exec RW: CB 0×30800000 ~ 0×30ffffff

SDRAM Exec R CNB 0×30000000 ~ 0×307fffff

Bank5, FPGA: NCNB 0×28000000 ~ 0×2fffffff

Bank4, FPGA: NCNB 0×20000000 ~ 0×27ffffff

Bank3, Bottom NIC: NCNB 0×18000000 ~ 0×1fffffff

Bank2, Bottom Flash: CNB 0×10000000 ~ 0×17ffffff

Bank1, Bottom Sram: CNB 0×08000000 ~ 0×0fffffff

Bank0, Flash or Sram: CNB 0×00000000 ~ 0×07ffffff

Nor Flash Bootloader
这是我着手写的第一个程序,我的想法是让这个程序同时支持通过串口对Nand 和 Nor FLASH的烧写,如果不进行任何烧写,那么就跳到Nor Flash的第二个section启动应用程序,这样一来,即使脱离JTGA,我也可以使用串口进行盲调。

由于有现成的初始化文件和flash烧写的示例程序,开发起来还比较快。当然也遇到了一些问题,一开始连flash的device ID都读不出来,后来发现我指针没有定义成volatile类型,flash的操作时序被编译器优化了;再者,在对Nor Flash进行操作时,bank0在MMU中的类型一定要设为NCNB,这样比较保险。

遇到最大的问题就是下面的了,一开始我用jtag 把程序下载到0×30000000的地方运行,对Nor Flash的烧写完全正常,但是当把程序下载到Nor Flash中启动运行后,再对Nor Flash的section 2进行烧写时,就出现了问题。所幸没多久我就意识到了问题,将程序放在Nor Flash中运行,同时有对同一片flash进行操作,那么操作时序势必会被CPU的指令读取时序所破坏,因此程序必须搬运到SDRAM中运行。

但是启动地址有必须是零地址,所以我采用了前文提到的scatter文件的方法,将非必要的代码全部搬到sdram中运行,scf文件格式就是前文中的那个。当然采用了__main的入口,调用了ADS的链接库,让它帮忙建立程序的运行环境。

至此,Nor Flash Bootloader可以顺畅无忧的实现其功能了。

Jacob 技术

什么是开关稳压电源?有什么特点?

2006年12月18日

根据调整管的工作状态,我们常把稳压电源分成两类:线性稳压电源和开关稳压电源。

线性稳压电源,是指调整管工作在线性状态下的稳压电源。而在开关电源中则不一样,开关管(在开关电源中,我们一般把调整管叫做开关管)是工作在开、关两种状态下的:开——电阻很小;关——电阻很大。

开关电源是一种比较新型的电源。它具有效率高,重量轻,可升、降压,输出功率大等优点。但是由于电路工作在开关状态,所以噪声比较大。通过下图,我们来简单的说说降压型开关电源的工作原理。如图所示,电路由开关K(实际电路中为三极管或者场效应管),续流二极管D,储能电感L,滤波电容 C等构成。当开关闭合时,电源通过开关K、电感L给负载供电,并将部分电能储存在电感L以及电容C中。由于电感L的自感,在开关接通后,电流增大得比较缓慢,即输出不能立刻达到电源电压值。一定时间后,开关断开,由于电感L的自感作用(可以比较形象的认为电感中的电流有惯性作用),将保持电路中的电流不变,即从左往右继续流。这电流流过负载,从地线返回,流到续流二极管D的正极,经过二极管D,返回电感L的左端,从而形成了一个回路。通过控制开关闭合跟断开的时间(即PWM——脉冲宽度调制),就可以控制输出电压。如果通过检测输出电压来控制开、关的时间,以保持输出电压不变,这就实现了稳压的目的。

在开关闭合期间,电感存储能量;在开关断开期间,电感释放能量,所以电感L叫做储能电感。二极管D在开关断开期间,负责给电感L提供电流通路,所以二极管D叫做续流二极管。

在实际的开关电源中,开关K由三极管或场效应管代替。当开关断开时,电流很小;当开关闭合时,电压很小,所以发热功率U×I就会很小。这就是开关电源效率高的原因。

常见的用于开关电源的芯片有:TL494,LM2575,LM2673,34063,51414等等。

Jacob 技术

NAND Flash Addressing Mode

2006年12月16日

NAND Flash的寻址方式和NAND Flash的memory组织方式紧密相关。NAND Flash的数据是以
bit的方式保存在memory cell,一般来说,一个cell中只能存储一个bit。这些cell以8个
或者16个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device的
位宽。
这些Line会再组成Page,通常是528Byte/page或者264Word/page。然后,每32个page形成
一个Block,Sizeof(block)=16kByte
Block是NAND Flash中最大的操作单元,擦除就是按照block为单位完成的,而
编程/读取是按照page为单位完成的。
所以,按照这样的组织方式可以形成所谓的三类地址:
-Block Address
-Page Address
-Column Address
首先,必须清楚一点,对于NAND Flash来讲,地址和命令只能在I/O[7:0]上传递,数据宽度
可以是8位或者16位,但是,对于x16的NAND Device,I/O[15:8]只用于传递数据。清楚了这
一点,我们就可以开始分析NAND Flash的寻址方式了。
->以528Byte/page 总容量512Mbit+512kbyte的NAND器件为例:
因为1 block=16kbyte,512Mbit=64Mbyte,Numberof(block)=1024
1block=32page, 1page=528byte=512byte(Main Area)+16byte(Spare Area)
用户数据保存在main area中。
512byte需要9bit来表示,对于528byte系列的NAND,这512byte被分成1st half和2nd half,
各自的访问由所谓的pointer operation命令来选择,也就是选择了bit8的高低。因此A8就是
halfpage pointer(这是我给出的一个名字),A[7:0]就是所谓的column address。
32个page需要5bit来表示,占用A[13:9],即该page在块内的相对地址
Block的地址是由A14以上的bit来表示,例如512Mb的NAND,共4096block,因此,需要12个bit
来表示,即A[25:14],如果是1Gbit的528byte/page的NAND Flash,则block address用
A[26:24]表示。而page address就是blcok address|page address in block
NAND Flash的地址表示为:
Block Address|Page Address in block|halfpage pointer|Column Address
地址传送顺序是Column Address,Page Address,Block Address。
由于地址只能在I/O[7:0]上传递,因此,必须采用移位的方式进行。
例如,对于512Mbit x8的NAND flash,地址范围是0~0×3FF_FFFF,只要是这个范围内的数值
表示的地址都是有效的。
以NAND_ADDR为例:
第1步是传递column address,就是NAND_ADDR[7:0],不需移位即可传递到I/O[7:0]上
而halfpage pointer即bit8是由操作指令决定的,即指令决定在哪个halfpage上进行读写,
而真正的bit8的值是don’t care的。
第2步就是将NAND_ADDR右移9位,将NAND_ADDR[16:9]传到I/O[7:0]上
第3步将NAND_ADDR[24:17]放到I/O上
第4步需要将NAND_ADDR[25]放到I/O上
因此,整个地址传递过程需要4步才能完成,即4-step addressing。
如果NAND Flash的容量是256Mbit以下,那么,block adress最高位只到bit24,因此寻址
只需要3步。
下面,就x16的NAND flash器件稍微进行一下说明。
由于一个page的main area的容量为256word,仍相当于512byte。但是,这个时候没有所谓
的1st halfpage和2nd halfpage之分了,所以,bit8就变得没有意义了,也就是这个时候
bit8完全不用管,地址传递仍然和x8器件相同。除了,这一点之外,x16的NAND使用方法和
x8的使用方法完全相同。

Jacob 技术

关于ARM处理器Remap的理解 Comprehension About ARM Remap

2006年12月16日

0.什么是Remap
我的理解是:在ROM从0×0用几句指令引导系统之后,把RAM映射到0×0就是Remap。
1.Remap的作用
当ARM处理器上电或者Reset之后,处理器从0×0取指。因此,必须保证系统上电时,0×0处有指令可以执行。所以,上电的时候,0×0地址处必定是ROM或者Flash(NOR)。
但是,为了加快启动的速度,也方便可以更改异常向量表,加快中断响应速度,往往把异常向量表映射到更快、更宽(32bit/16bit)的RAM中。但是异常向量表的开始地址是由ARM架构决定的,必须位于0×0处,因此,必须把RAM映射到0×0。
2.Remap的配置
Remap的实现和ARM处理器的实现相关。
1)如果处理器有专门的寄存器可以完成Remap。那么Remap是通过Remap寄存器的相应bit置1完成的。如Atmel AT91xx
2)如果处理器没有专门的寄存器,但是memory的bank控制寄存器可以用来配置bank的起始地址,那么只要把RAM的起始地址编程为0×0,也可以完成remap。如samsung s3c4510
3)如果上面两种机制都没有,那么Remap就不要做了。因为处理器实现决定了SDRAM对应的bank地址是不能改变的。如Samsung S3c2410.
3.Remap配置前后要做的工作
Remap前后,不同之处就是RAM的位置变了。为了达到Remap的目的,就是加快启动的速度和异常处理速度,一定要初始化异常堆栈和建立异常向量表的。
4.如果象2410那样不能Remap的话怎么办?
2410不是不能Remap吗?为了加快启动速度,可以这样做
1)使用它的NAND boot模式。为什么NAND boot会比较快,那是因为2410里面有块小石头——“SteppingStone”,一块4KB SRAM,它是映射在0×0的。启动程序会自动被copy到这个石头里面。自然异常向量的入口放到这个地方,一样可以达到比NOR boot快的启动、异常响应速度。
2)如果你对NOR Boot情有独衷,那么你只好把你的异常向量的入口copy到SDRAM里面,实现所谓的High Vector

Jacob 技术

Linux系统查看文件夹占用空间大小

2006年12月15日

du / –max-depth=1 |sort -n

du /movie –max-depth=1 |sort -n

Jacob 建站