发新帖我要提问
123
返回列表
打印
[微控制器/MCU]

单片机开发500问!不断更新中.....

[复制链接]
楼主: Massif123
手机看帖
扫描二维码
随时随地手机跟帖
41
Massif123|  楼主 | 2010-2-22 12:37 | 只看该作者 回帖奖励 |倒序浏览
41、初学者一开始就必须掌握ARM体系结构与汇编指令?
答:未必!很多ARM初学者,一开始就抱着有关ARM体系结构的书籍开始苦读,更有甚者,在很多具体内容上钻牛角尖,把大量时间花在了ARM汇编指 令上,几个月下来,进展不大,虽然也能知道一些ARM的相关概念,但离真正的具体应用相差甚远,很多初学者会感觉到,学完ARM体系结构后,对ARM的应 用还是无从下手,一片茫然,有的甚至就因为这个原因,被挡在了ARM嵌入式开发领域的大门外,从此放弃了ARM嵌入式开发的学习。
当然,并不是主张用户不看ARM体系结构的相关书籍,关键在于怎么看、看到什么程度。根据经验,ARM初学者对于ARM体系结构的相 关知识只需做到“了解”这一程度就可以了,对于ARM的汇编指令完全可以不用**,只要能看懂就可以(目前大部分基于ARM的产品开发都采用C语言,汇编 语言的使用机会大大减少,只有在操作系统移植以及某些特殊应用中才会用到部分汇编指令)。随着初学者对ARM更深入地学习,有关ARM体系结构与汇编指令 的知识以后可能会反复出现,遇到时再有针对性的重点看,相信会取得比较好的效果

42、如何选择ARM的软件集成开发环境?
答:目前,流行的ARM软件集成开发环境有ADS1.2、Keil uV3和IAR等。对于51单片机应用开发工程师来说,Keil开发环境应该应用得比较熟练,若采用Keil uV3进行ARM软件开发,应该可以快速上手。但是,并不推荐ARM初学者选择Keil uV3进行ARM软件开发,主要是基于以下2个原因:
(1)Keil uV3是第三方ARM软件集成开发环境,目前支持的ARM芯片种类还不多,所带的编译器也并不完善;
(2)由于Keil uV3为了方便用户的开发,提供了现成的ARM启动文件,换句话说,它屏蔽了ARM开发中的一个重要内容——启动代码的编写,而这一点对初学者来说应该是非常重要的内容。
IAR目前国内应用的人还不多,相关资料也不是很多,也不推荐初学者使用。
ADS1.2集成开发环境是ARM公司推出的ARM核微控制器集成开发工具。它支持ARM10之前的所有ARM系列微控制器,支持软件调试及JTAG硬件仿真调试,支持汇编、C、C++源程序;具有编译效率高、系统库功能强等特点;可以在Windows 98、Windows 2000、 Windows XP以及RedHat Linux上运行。
基于以上原因,推荐ARM初学者使用ADS1。2集成开发环境进行ARM开发。关于ADS1。2集成开发环境的使用,初学者可以参看ADS1。2集成开发环境自带的用户手册。

43、学ARM必搞嵌入式操作系统?
答:很多ARM初学者有一个错误的概念——学ARM必搞嵌入式操作系统。认为在ARM上跑嵌入式操作系统就代表技术先进、产品档次高的观点绝对是谬论。持这种观点的人一定是没有做过具体的产品开发。一个嵌入式产品是否需要跑嵌入式操作系统,是由很多因素决定的,例如,产品的功能需求、开发成本、开发周期等都是需要综合考虑的。
对于ARM初学者来说,前期并不建议使用嵌入式操作系统。当用户手中的开发板相关部分都熟练掌握后,即对MCU的内部功能器件可以做到熟练应用的程度后,可以考虑学习一个具体的嵌入式操作系统。
目前,流行的嵌入式操作系统非常多,例如,uC/OS-II、WinCe、Linux、VxWorks等。对于初学者,可以考虑源码公开的uC /OS-II嵌入式操作系统。uC/OS-II已经有很多产品成功使用的案例且得到了美国航空管理局的认证,北京航空航天大学出版社也出版了配套的专著。国内熟悉这个嵌入式操作系统的开发人员特别多,十分容易通过网站上的讨论社区得到帮助,更关键的是,初学者可以很容易地通过阅读源码达到彻底掌握嵌入式操作系统的目的。在熟练掌握了uC/OS-II后,用户已经从ARM初学者进入到了ARM应用开发工程师的行列。下一步可根据自己的知识背景、兴趣爱好和开发领域,再选择一个嵌入式操作系统(例如WinCE、Linux或VxWorks等)进行学习,彻底掌握ARM嵌入式系统开发。

44、ARM上的嵌入式系统初始化过程是怎样的?
答: 初始化过程尽管各种嵌入式应用系统的结构及功能差别很大,但其系统初始化部分完成的操作有很大一部分是相似的。
1)设置入口指针
启动程序首先必须定义指针,而且整个应用程序只有一个入口指针。一般地,程序在编译链接时将异常中断向量表链接在 0 地址处,并且作为整个程序入口点。入口点代码如下:
ENTRY ( _start ) ;开始
2)设置异常中断
ARM 要求中断向量表必须放置在从 0 开始、连续 8×4 字节的空间内。
3)初始化存储系统
初始化存储系统的编程对象是系统的存储器控制器,一个系统可能存在多种存储器类型的接口,不同的存储系统的设计不尽相同。Flash和SRAM同属于静态存储器类型,可以合用一个存储器端口;而DRAM因为有动态刷新和地址线复用等特性,通常配有专用的存储器端口。其中,SDRAM必须在初始化阶段进行设置,因为大部分的程序代码和数据都要在SDRAM中运行。
4)存储器地址分布重映射(remap)和MMU
系统一上电,程序将自动从0地址处开始执行。因此,必须保证在0地址处存在正确的代码,即要求0地址开始入是非易失性的ROM或Flash等。但是因为 ROM或Flash的访问速度相对较慢,每次中断响应发生后,都要从读取ROM或Flash上面的向量表开始,影响了中断响应速度。一般程序执行后将 SDRAM映射为地址0,并把系统程序加载到SDRAM中运行,其具体步骤可以采用以下的方案:
(1)上电后,从0地址的ROM开始往下执行;
(2)根据映射前的地址,对SDRAM进行必要的代码和数据拷贝;
(3)拷贝完成后,进行重映射操作;
(4)因为RAM在重映射前准备好了内容,使得PC指针能继续在RAM里取得正确的指令。
在这种地址映射的变化过程中,程序员需要仔细考虑的是:程序的执行流程不能被这种变化所打断,注意保证程序流程在重映射前后的承接关系。
在ARM系统中,MMU通过页式虚拟存储管理,将虚拟空间和物理空间分别分成一个个固定大小的页,并建立两者之间的映射关系,从而实现虚拟地址到物理地址的转换。MMU还可完成存储器访问权限的控制和虚拟存储器空间缓冲特性的设置。
5)初始化有特殊要求的端口、设备
6)切换处理器模式,开中断
7)最后转换到应用程序运行所需的最终模式,一般是User模式。不要过早切换到User模式进行User模式的堆栈设备。因为进入User模式后就不能再操作CPRS回到别的模式了,可能会对接下去的程序执行造成影响。这时才使能异常中断,通过清除CPRS寄存器中的中断禁止位实现。如果过早地开中断,在系统初始化之前就触发了有效中断,会导致系统的死机。
8)呼叫主应用程序
当所有的系统初始化工作完成后,就需要把程序流程转入主应用程序。

45、ARM中断向量一般有哪些设置方法?
答: 有两种:在32位ARM系统中,一般都是在中断向量表中放置一条分支指令或PC寄存器加载指令,实现程序跳转到中断服务例程的功能。例如:
IRQEntry B HandleIRQ ;跳转范围较小
B HandleFIQ
或IRQEntry LDR PC,=HandleIRQ ;跳转的范围是任意32位地址空间
LDR PC,=HandleFIQ
LDR伪指令等效生成1条存储读取指令和1条32位常数定义指令。32位常数存储在LDR指令附近的存储单元中,相对偏移小于4KB。该32位数据就是要跳转到的中断服务程序入口地址。之所以使用LDR伪指令,是因为ARM的RISC指令为单字指令,不能装载32位的立即数(常数),无法直接把一个32位常数数据或地址数据装载到寄存器中。下面一般程序与上述伪指令功能等效,但中断向量表描述得更为清晰。其中VectorTable为相对LDR指令的偏移量:
IRQEntry LDR PC,VectorTable+0
;与LDR PC,=HandleIRQ等效
LDR PC,VectorTable+4
;与LDR PC,=HandleFIQ等效
……
VectorTable DCD HandleTRQ
DCD HandleFIQ
……
HandleIRQ
……
HandleFIQ
一般ARM嵌入式系统的程序都是固化在从00000000H开始的低端ROM空间中,中断向量表VectorTable也是固化在ROM中,所以上述两种方法都无法在程序运行时动态随机修改中断向量表。不论对于初学ARM处理器的程序员还是有经验的程序员,设置中断向量都相当繁琐,必须修改ARM的 C程序的启动代码。一段晦涩的汇编代码很不方便,比较容易出错。

使用特权

评论回复
42
想实习去| | 2010-2-22 14:11 | 只看该作者
期待下文。期望在虎年自己的技术水平有大幅度的提高!

使用特权

评论回复
43
Massif123|  楼主 | 2010-2-22 14:17 | 只看该作者
只要不断学习水平一定会提高!

使用特权

评论回复
44
Massif123|  楼主 | 2010-2-24 14:10 | 只看该作者
46、ARM开发中的调试方法有哪些?
答: 用户选用ARM处理器开发嵌入式系统时,选择合适的开发工具可以加快开发进度,节省开发成本。因此一套含有编辑软件、编译软件、汇编软件、链接软件、 调 试软件、工程管理及函数库的集成开发环境(IDE)一般来说是必不可少的,至于嵌入式实时操作系统、评估板等其他开发工具则可以根据应用软件规模和开 发计 划选用。使用集成开发环境开发基于ARM的应用软件,包括编辑、编译、汇编、链接等工作全部在PC机上即可完成,调试工作则需要配合其他的模块或产品方可完成,目前常见的调试方法有以下几种:
1)集模拟器
     部分集成开发环境提供了指令集模拟器,可方便用户在PC机上完成一部分简单的调试工作,但是由于指令集模拟器与真实的硬件环境相差很大,因此即使 用户使用 指令集模拟器调试通过的程序也有可能无法在真实的硬件环境下运行,用户最终必须在硬件平台上完成整个应用的开发。
2) 驻留监控软件
    驻留监控软件(Resident Monitors)是一段运行在目标板上的程序,集成开发环境中的调试软件通过以太网口、并行端口、串行端口等 通讯端口与驻留监控软件进行交互,由调试软件发布命令通知驻留监控软件控制程序的执行、读写存储器、读写寄存器、设置断点等。驻留监控软件是一种比较低廉有效的调试方式,不需要任何其他的硬件调试和仿真设备。ARM公司的Angel就是该类软件,大部分嵌入式实时操作系统也是采用该类软件进行调试,不同的是在嵌入式实时操作系统中,驻留监控软件是作为操作系统的一个任务存在的。驻留监控软件的不便之处在于它对硬件设备的要求比较高,一般在硬件稳定之后才能进行应用软件的开发,同时它占用目标板上的一部分资源,而且不能对程序的全速运行进行完全仿真,所以对一些要求严格的情况不是很适合。
3)JAG仿真器
JTAG仿真器也称为JTAG调试器,是通过ARM芯片的JTAG边界扫描口进行调试的设备。JTAG仿真器比较便宜,连接比较方便,通过现有的 JTAG边界扫描口与 ARM CPU 核通信,属于完全非插入式(即不使用片上资源)调试,它无需目标存储器, 不占用目标系统的任何端口,而这些是驻 留监控软件所必需的。另外,由于JTAG调试的目标程序是在目标板上执行,仿真更接近于目标硬件,因此,许多接口问 题,如高频操作限制、AC和DC参数 不匹配,电线长度的限制等被最小化了。使用集成开发环境配合JTAG仿真器进行开发是目前采用最多的一种调试方式。
4) 在线仿真器
在线仿真器使用仿真头完全取代目标板上的CPU,可以完全仿真ARM芯片的行为,提供更加深入的调试功能。但这类仿真器为了能够全速仿真时钟速度 高于 100MHz的处理器,通常必须采用极其复杂的设计和工艺,因而其价格比较昂贵。在线仿真器通常用在ARM的硬件开发中,在软件的开发中较少使用, 其价格 高昂也是在线仿真器难以普及的因素。

47、怎么对扩展的RAM做全地址的检测?
答:#define EXTRAM 0x80000000    //定义指向RAM起始地址的指针
#define EXTRAMSPACE 0x40000    //这里是你自己定义的要检测的RAM的大小

int i;

//通过各单元填写0x55和0xAA,可检测各个位是否都可置0和置1
//通过交替改写,可检测是否有地址重叠
for(i = 0; i   < EXTRAMSPACE; i++)    //所有单元填0x55
{
    *((volatile unsigned char *)(EXTRAM + i)) = 0x55;
}

for(i = 0; i   < EXTRAMSPACE; i++)
{
    if(*((volatile unsigned char *)(EXTRAM + i)) == 0x55)
    {
        *((volatile unsigned char *)(EXTRAM + i)) = 0xAA;
    }
    else
    {
        //错误处理
    }
}

for(i = 0; i   < EXTRAMSPACE; i++)    //回读所有单元
{
    if(*((volatile unsigned char *)(EXTRAM + i)) == 0xAA)
    {
        *((volatile unsigned char *)(EXTRAM + i)) = 0x00;
    }
    else
    {
        //错误处理
    }
}

48、请问硬件中断请求和软件中断 是都可以定义为FIQ或IRQ中断,还是只有硬件中断请求可以。 如果只有硬件中断请求可以定义为FIQ或IRQ,那么软件中断又是如何工作的? 还有就是向量中断控制器中的中断使能寄存器,IRQ状态寄存器等的每一位是不是已经对好了相应的中断输入(比如串口,定时器,IIC等)?
   答:都可以定义为irq或者FIQ的。软件中断用指令来完成,有一个中断号 ,不同的中断号对应不同的服务程序。中断使能寄存器可以开关对应的中断,状态寄存器也可以读取对应的中断。
软中断是通讯进程之间用来模拟硬中断的 一种信号通讯方式。中断源发中断请求或软中断信号后,CPU或接收进程在适当的时机自动进行中断处理或完成软中断信号对应的功能。软中断是软件实现的中断,也就是程序运行时其他程序对它的中断;而硬中断是硬件实现的中断,是程序运行时设备对它的中断。
软中断与硬中断的区别:
a)软中断发生的时间是由程序控制的,而硬中断发生的时间是随机的;
b)软中断是由程序调用发生的,而硬中断是由外设引发的;
c)硬件中断处理程序要确保它能快速地完成它的任务,这样程序执行时才不会等待较长时间。

49、C语言和汇编语言在开发单片机时各有哪些优缺点?
答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。
C语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用的一种计算机语言。缺点是占用资源较多,执行效率没有汇编高。
对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供C编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什幺动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。所以在单片机开发中,我们还是建议采用汇编语言比较好。

]50、当开发一个较复杂而又开发时间短的项目时,用C还是用汇编开发好?
答:对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但不同的MCU厂家其C语言编译系统是有所差别的,特别是在一些特殊功能模块的操作上。如果对这些特性不了解,那调试起来就有的烦了,到头来可能还不如用汇编来的快。

使用特权

评论回复
45
Massif123|  楼主 | 2010-2-25 11:00 | 只看该作者
51.请介绍一下MCU的测试方法。
答: MCU从生产出来到封装出货的每个不同的阶段会有不同的测试方法,其中主要会有两种:中测和成测。
所谓中测即是WAFER的测试,它会包含产品的功能验证及AC、DC的测试。项目相当繁多,如:
接续性测试:检测每一根I/OPIN内接的保护用二极管是否功能无误。
功能测试:以产品设计者所提供测试资料(TEST PATTERN)灌入IC,检查其结果是否与当时SIMULATION时状态一样。
STANDBY电流测试:测量IC处于HALT模式时即每一个接点(PAD)在1态0态或Z态保持不变时的漏电流是否符合最低之规格。
耗电测试:整颗IC的静态耗电与动态耗电。
输入电压测试:测量每个输入接脚的输入电压反应特性。
输出电压测试:测量每个输出接脚的输出电压位准。
相关频率特性(AC)测试,也是通过外灌一定频率,从I/O口来看输出是否与之匹配。
为了保证IC生产的长期且稳定品质,还会做产品的可靠性测试,这些测试包括ESD测试,LATCH UP测试,温度循环测试,高温贮存测试,湿度贮存测试等。
成测则是产品封装好后的测试,即PACKAGE测试。即是所有通过中测的产品封装后的测试,方法主要是机台自动测试,但测试项目仍与WAFER TEST相同。PACKAGE TEST的目的是在确定IC在封装过程中是否有任何损坏。

52.能否利用单片来检测手机电池的充放电时间及充放电时的电压电流变化,并利用一个I/O端口使检测结果在电脑上显示出来?
答:目前市场上的各类智能充电器,大部分都采用MCU进行充电电流和电压的控制。至于要在电脑上显示,好象并不实用,可能只有在一些专门的电池检测仪器中才会用到;对于一般的手机用户来说,谁会在充电时还需要用一台电脑来做显示呢?要实现单片机与电脑的连接,最简单的方式就是采用串口通讯,但需要加一颗RS- 232芯片。

53.嵌入式处理器可分为哪几类?
答:就以嵌入式系统观念为例,一般嵌入式处理器可以分为三类:嵌入式微处理器、嵌入式微控制器、嵌入式DSP(Digital Signal Processor)。
嵌入式微处理器就是和通用计算机的微处理器对应的CPU。在应用中,一般是将微处理器装配在专门设计的电路板上,在母板上只保留和嵌入式相关的功能即可,这样可以满足嵌入式系统体积小和功耗低的要求。目前的嵌入式处理器主要包括:PowerPC、Motorola 68000、ARM系列等等。
嵌入式微控制器又称为单片机,它将CPU、存储器(少量的RAM、ROM或两者都有)和其它接口I/O封装在同一片集成电路里。常见的有HOLTEK MCU系列、Microchip MCU系列及8051等。
嵌入式DSP专门用来处理对离散时间信号进行极快的处理计算,提高编译效率和执行速度。在数字滤波、FFT(Fast Fourier Transform)、频谱分析、图像处理的分析等领域,DSP正在大量进入嵌入式市场。

54.MCU在射频控制时,MCU的时钟(晶振)、数据线会辐射基频或基频的倍频,被低噪放LNA放大后进入混频,出现带内的Spur,无法滤除。除了用layout、选择低辐射MCU的方法可以减少一些以外,还有什么别的方法?
答:在设计高频电路用电路板有许多注意事项,尤其是GHz等级的高频电路,更需要注意各电子组件pad与印刷pattern的长度对电路特性所造成的影响。最近几年高频电路与数字电路共享相同电路板,构成所谓的混载电路系统似乎有增加的趋势,类似如此的设计经常会造成数字电路动作时,高频电路却发生动作不稳定等现象,其中原因之一是数字电路产生的噪讯,影响高频电路正常动作所致。为了避免上述问题除了设法分割两电路block之外,设计电路板之前充分检讨设计构想,才是根本应有的手法,基本上设计高频电路用电路板必需掌握下列三大原则:
高质量;
不可取巧;
不可仓促抢时间。
以下是设计高频电路板的一些建议:
(1)印刷pattern的长度会影响电路特性。尤其是传输速度为GHz高速数位电路的传输线路,通常会使用strip line,同时藉由调整配线长度补正传输延迟时间,其实这也意味着电子组件的设置位置对电路特性具有绝对性的影响。
(2)Ground作大better。铜箔面整体设置ground层,而连接via的better ground则是高频电路板与高速数位电路板共同的特征,此外高频电路板最忌讳使用幅宽细窄的印刷pattern描绘ground。
(3)电子组件的ground端子,以最短的长度与电路板的ground连接。具体方法是在电子组件的ground端子pad附近设置via,使电子组件能以最短的长度与电路板的ground连接。
(4)信号线作短配线设计。不可任意加大配线长度,尽量缩短配线长度。
(5)减少电路之间的结合。尤其是filter与amplifier输出入之间作电路分割非常重要,它相当于audio电路的cross talk对策。
(6)MCU回路Layout考量:震荡电路仅可能接近IC震荡脚位;震荡电路与VDD & VSS保持足够的距离;震荡频率大于1MHz时不需加 osc1 & osc2 电容;电源与地间要最短位置并尽量拉等宽与等距的线,于节点位置加上104/103/102等陶瓷电容。

55.在高速设计中,如何解决信号的完整性问题?
答:信号完整性基本上是阻抗匹配的问题。而影响阻抗匹配的因素有信号源的架构和输出阻抗(output impedance),走线的特性阻抗,负载端的特性,走线的拓朴(topology)架构等。解决的方式是靠端接(termination)与调整走线的拓朴。

56.在demo板上采样电压时,不稳定,采样结果有波动,如何消除?
答:一般来说,仿真器都是工作在一个稳压的环境(通常为5V)。如果用仿真器的A/D时,要注意其A/D参考电压是由仿真器内部给出,还是需要外部提供。A/D转换需要一个连续的时钟周期,所以在仿真时不能用单步调试的方法,否则会造成A/D采样值不准。至于A/D采样不稳定,可以在A/D输入口加一电容,起到滤波作用;在软件处理时采用中值滤波的方法。

使用特权

评论回复
46
Massif123|  楼主 | 2010-2-26 12:11 | 只看该作者
57、恩智浦LPC系列与s3c2410的启动的差异在哪?
答:s3c2410 与LPC系列的启动的差异在s3c2410中,加电启动后,从0地址开始执行程序,(这个是ARM核的特性),那么可以将内部ROM,FLASH中的内容映射到0地址,因此一般来说bootloader是要在这个地址上跑的。然而LPC系列板子有一定区别,他们自己在板子加电启动后首先运行自己的bootblock,这个 bootblock是位于片内flash尾部的程序,他被映射到0地址,这是一个厂商提供的程序,他可以根据需要在执行完成后再从新映射0地址到其他位置去,即进行重映射,那么如果我们重映射0地址到flash开头,就可以像s3c2410那样跑我们的bootloader了。关键原因是LPC采用了内存映射和重映射的机制,不同的映射可以将各自不同的中断向量(还有些文字池,共64字节)映射到0地址。详细的内容可以参考如下文档,转载自: http://shellstudio.spaces.live.c ... 40E1B00B6!163.entry 6月2日
LPC2200系列ARM的Bootloader设计 Bootloader对于ARM系统来说是很有用的,它可以使应用程序的设计和固化变得简单明了。如果你的应用程序被编译在RAM空间运行,也需要 Bootloader把它从诸如SD卡等存储介质加载到RAM并启动它。所以,除了不提供有关BIOS调用接口之外,Bootloader就相当于PC的BIAS。设计LPC2200系列ARM的Bootloader程序有其特殊性,这是因为该系列ARM有64字节的异常向量可以灵活映射,不同于S3C44B0X等 ARM。 首先讲解LPC2200系列ARM的异常向量映射是什么意思吧。一般情况下,没有MMU的ARM内核所使用的任何数据地址或指令地址都是实际的物理地址,也就是内核所能访问的4GB空间就是实际的物理空间。但是,如果有MMU的情况下,地址就要区分逻辑地址和物理地址了。此时,ARM内核使用的任何数据地址或指令地址都是逻辑地址,对它来说,4GB的逻辑空间就是它能访问的全部。但是实际上,内核所使用的逻辑地址被送往“存储器控制器”或“映射到内存的I/O模块”之前,会被MMU单元“偷梁换柱”,形成实际的物理地址再继续送到“存储器控制器”或“映射到内存的I/O模块”。有了MMU,实际很有限的RAM就可以虚拟出完整的4GB空间,而且操作系统中每个进程也都各自拥有4GB空间,互不干扰!这是因为,通过合理的管理MMU,每个进程都有它自己的MMU页表等必备资源,操作系统作进程切换时会同时设置该进程的 MMU配置。这样,相当于每个进程都独立拥有自己的MMU管理单元一样。 LPC2200系列ARM没有强悍的MMU,但是它有简单的映射管理单元,这已经很不错了!我暂且叫该单元为LPC-MMU吧。对于LPC2200系列 ARM处理器,LPC-MMU是极其简化的MMU。1、LPC-MMU只能映射64字节;2、LPC-MMU所映射的起始物理地址固定为4组,即 0x00000000,0x7FFFE000,0x40000000,0x80000000;3、LPC-MMU所映射的逻辑地址只有 0x00000000~0x0000003F;当芯片复位后,ARM内核的PC寄存器被复位成0,该值就是内核去指令所需的逻辑地址。复位后,LPC- MMU首先把逻辑地址0x00000000映射到物理地址0x7FFFE000,从而启动芯片内部固化的BootBlock代码。BootBlock代码再检查有关引脚的高低电平来决定将逻辑地址映射到物理地址0x00000000还是物理地址0x80000000。从这里可以看出,当逻辑地址0x00000000映射到物理地址0x00000000,相当于没有LPC-MMU单元!这就是说,如果你设计的 Bootloader是从LPC2200系列ARM的内部FLASH启动的,那么就没有什么特殊性,和其他ARM一样就是了!如果你的Bootloader是从外部FLASH启动的(也就是物理地址0x80000000开始的空间),那么就需要我这里所说的内容了。很简单,你只要把异常向量代码和常量池(共64字节)写成如下形式即可!不过这样的话该Bootloader只能在0x80000000的地址启动了。此外,Bootloader需要把自己的RO段、RW段拷贝到RAM,并设置ZI段。而这些代码都不在其编译时设置的空间运行,所以都需要使用相对当前PC 寻址的指令来实现,有一定的技巧性。最后,Bootloader还需要把自己的PC以及返回地址LR都转移到正确的运行时地址去,Bootloader从此走上阳关大道。
;//**************************************************************************
;//64字节的映射空间开始 
ResetEntry ;//32字节异常向量
LDR PC, Reset_Addr ;//复位异常入口(进入SVR32模式)
LDR PC, Undefined_Addr ;//未定义指令异常入口(进入UNDF32模式)
LDR PC, SWI_Addr ;//软件中断异常入口(进入SVR32模式)
LDR PC, Prefetch_Addr ;//预取中止异常入口(进入ABT32模式)
LDR PC, DataAbort_Addr ;//数据中止异常入口(进入ABT32模式)
DCD 0xb9205f80 ;//保留的矢量,对于LPC系列ARM的内部FLASH有特殊作用
LDR PC, [PC, #-0xff0] ;//中断异常入口(进入IRQ32模式)
LDR PC, FIQ_Addr ;//快中断异常入口(进入FIQ32模式) ;
//32字节常量池
Reset_Addr DCD 0x80000040 ;//注意这里原来是Reset_Handler Undefined_Addr DCD Undefined_Handler SWI_Addr DCD SWI_Handler Prefetch_Addr DCD Prefetch_Handler DataAbort_Addr DCD DataAbort_Handler Reserve_Addr DCD 0 IRQ_Addr DCD IRQ_Handler FIQ_Addr DCD FIQ_Handler ;//64字节的映射空间结束 ;
//***************************************************************************
;//以下开始是系统复位处理程序 Reset_Handler ... ... ;
//*************************************************************************** ;//启动代码结束 END

58、ARM指令与Thumb指令的区别
答:在ARM体系结构中,ARM指令集中的指令是32位的指令,其执行效率很高。对于存储系统数据总线为16位的应用系统,ARM体系提供了Thumb指令集。Thumb指令集是对ARM指令集的一个子集重新编码得到的,指令长度为16位。通常在处理器执行ARM程序时,称处理器处于ARM状态;当处理器执行Thumb程序时,称处理器处于Thumb状态。Thumb指令集并没有改变ARM体系地层的程序设计模型,只是在该模型上加上了一些限制条件。 Thumb指令集中的数据处理指令的操作数仍然为32位,指令寻址地址也是32位的。
59、什么是ATPCS?
答:为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则。ATPCS就是ARM程序和Thumb程序中子程序调用的基本规则。这些规则包括寄存器使用规则,数据栈的使用规则,参数的传递规则等。

60、ARM程序和Thumb程序混合使用的场合?答:通常,Thumb程序比ARM程序更加紧凑,而且对于内存为8位或16位的系统,使用Thumb程序效率更高。但是,在下面一些场合下,程序必须运行在ARM状态,这时就需要混合使用ARM和Thumb程序。
强调速度的场合,应该使用ARM程序;
有些功能只能由ARM程序完成。如:使用或者禁止异常中断;
当处理器进入异常中断处理程序时,程序状态切换到ARM状态,即在异常中断处理程序入口的一些指令是ARM指令,然后根据需要程序可以切换到Thumb状态,在异常中断程序返回前,程序再切换到ARM状态。
ARM处理器总是从ARM状态开始执行。因而,如果要在调试器中运行Thumb程序,必须为该Thumb程序添加一个ARM程序头,然后再切换到Thumb状态,执行Thumb程序。

61、ARM处理器运行模式有哪些?
答:ARM微处理器支持7种运行模式,分别为:
        用户模式(usr):ARM处理器正常的程序执行状态;
        快速中断模式(fiq):用于高速数据传输或通道管理;
        外部中断模式(irq):用于通用的中断处理;
        管理模式(svc):操作系统使用的保护模式;
        数据访问终止模式(abt):当数据或指令预取终止时进入该模式,用于虚拟存储及存储保护;
        系统模式(sys):运行具有特权的操作系统任务;
        未定义指令中止模式(und):当未定义指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。

使用特权

评论回复
47
Mindor| | 2010-2-26 21:52 | 只看该作者
500问呢~才出了一点点哈~期待。。。

使用特权

评论回复
48
Massif123|  楼主 | 2010-3-1 09:36 | 只看该作者
62、在异常处理向量表的设置中,为什么不直接将异常向量的入口地址写入PC 中呢,为什么
非要用什么DCD 这些伪指令,到底有什么用啊

A:为了保证任何时候其累加和为零,不然改一次程序就要计算一次.

63 、单步调试i2cINT.C 在ISendStr 中启动总线后,程序怎么又跑到vectors.o 中,进行初始化了呢A:由于VIC 的限制,程序不能在0x18 停下来,否则执行非向量中断.如果没有设置,则非
向量中断为0,将从0 地址执行.
建议:有中断时不要单步执行程序,可以手动暂时关中断或设置断点代替单步.
(编者注:下载最新的驱动可以解决这个问题)

64、如何修改 ADS 的启动代码,从__main 到main,按道理应该有一个文件,修改这个小文件, 就可以修改 启动代码.
A:__main 是ADS 运行库,最好不要修改,要是不使用库就不要用main()函数,起个别的名
字.直接跳转过去就行了.
详见:《ARM 体系结构与编程》P328.

65、我在JTAG 仿真时出现的对话框,提示:
Warnning! interrupt vectors data is not correct!
Program you downloaded can not run freely!


A:参见《ARM 微控制器基础与实战》附录一第一个问题的第二部分,选择源代码的启动代
码文件夹下的vectors.s,并参照《ARM 微控制器基础与实战》图7.11 设置.

66、初始化代码中分配堆栈的问题MSR CPSR_c, #0xd3 ;进入特定的处理器模式
LDR SP, StackSvc ;给当前处理器模式的堆栈指针赋值,这只是一个值而已,
;他在接下去的DCD 语句赋值
SvcStackSpace SPACE SVC_STACK_LEGTH * 4
这个语句开辟一个SVC_STACK_LEGTH * 4 大小的内存,SvcStackSpace 是这块内存的标
号,我想应该就是内存的首地址,这样应该好理解了.
StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
这个语句就是把这个首地址加上堆栈大小值.

A:计算出堆栈指针来,我想这个堆栈是向下生长的,所以SP 赋值的是堆栈地址最高的那个.

使用特权

评论回复
49
zipl1985| | 2010-3-4 09:48 | 只看该作者
不错的,很强

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则