打印

arm入门真难啊,进来帮忙扫盲啊

[复制链接]
5958|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mtraveler|  楼主 | 2011-6-25 13:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ARM, se, TI, RAM, IO
本帖最后由 mtraveler 于 2011-6-25 13:26 编辑

请问,bootloader,firmware和启动代码 什么关系?还有file:///C:/Documents%20and%20Settings/xh/Application%20Data/Tencent/Users/410827132/QQ/WinTemp/RichOle/)]]90}R58QWB3(3L8V6%)GR.jpg
“Error programing the Hex file. RAM locations 0x40000120 to 0x400001ff are used by the bootloader. Please ensure your RAM based firmware does not use these locations.”LPC2368下载时这个错误该怎么改呢?请大家帮帮忙解答一下啊。在此先谢过了。

相关帖子

沙发
mtraveler|  楼主 | 2011-6-25 13:51 | 只看该作者
没人回答自己来:

启动代码和Bootloader

最近查了很多关于基于ARM嵌入式系统上电复位后启动过程的资料。搞得晕晕乎乎,不知如何理解。现在终于有一点头绪,总结如下:

我主要遇到了这样一个问题,启动代码和Bootloader的区别以及它们在ARM上运行操作系统和不运行操作系统(只有用户程序)的关系。

启动代码和Bootloader的关系类似于“男人”和“人类”的关系。可以说男人是人类的一种,但不能说人类只有男人。也就是说可以说启动代码是Bootloader,但不能说Bootloader是启动代码。当然这也不是绝对的,只在某些情况下可以这么说。

启动代码是指CPU复位后到main函数之前需要执行的汇编代码。需要这段代码是为了给C语言程序准备好堆栈空间,中断入口和外部数据等。而且这段汇编代码可以直接对硬件进行操作,效率很高。

Bootloader就是在操作系统内核运行之前的一小段程序,通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为调用操作系统内核、运行用户应用程序准备好正确的环境。嵌入式系统建立一个通用、标准的Bootloader是非常困难的。Bootloader也依赖于具体的嵌入式板级设备的配置,这也就是说,对于两块不同的嵌入式主板而言,即使它们是基于同一 CPU 而构建,要想让运行在一块板子上的 Bootloader 程序也能运行在另一块板子上,通常都需要修改 Bootloader 的源程序。

启动流程:系统加电复位后,几乎所有的 CPU都从由复位地址上取指令。以微处理器为核心的嵌入式系统通常都有某种类型的固态存储设备(比如EEPROM、FLASH等)被映射到这个预先设置好的地址上。通过集成开发环境可以将Bootloader定位在复位地址开始的存储空间内,因此Bootloader是系统加电后、操作系统内核或用户应用程序运行之前,首先必须运行的一段程序代码。系统的启动通常有两种方式,一种是可以直接从Flash启动,另一种是可以将压缩的内存映像文件从Flash(为节省Flash资源、提高速度)中复制、解压到RAM,再从RAM启动。当电源打开时,一般的系统会去执行ROM(应用较多的是Flash)里面的启动代码。系统启动代码完成基本软硬件环境初始化后,对于有操作系统的情况下,启动操作系统、启动内存管理、任务调度、加载驱动程序等,最后执行应用程序或等待用户命令;对于没有操作系统的系统直接执行应用程序或等待用户命令。

启动代码内容流程:

  1. 启动代码的第一步是设置中断和异常向量。
    2. 完成系统启动所必须的最小配置,某些处理器芯片包含一个或几个全局寄存器,这些寄存器必须在系统启动的最初进行配置。
    3. 设置看门狗,用户设计的部分外围电路如果必须在系统启动时初始化,就可以放在这一步。
    4. 配置系统所使用的存储器,包括Flash,SRAM和DRAM等,并为他们分配地址空间。如果系统使用了DRAM或其它外设,就需要设置相关的寄存器,以确定其刷新频率,数据总线宽度等信息,初始化存储器系统。有些芯片可通过寄存器编程初始化存储器系统,而对于较复杂系统通常集成有MMU来管理内存空间。
    5. 为处理器的每个工作模式设置栈指针,ARM处理器有多种工作模式,每种工作模式都需要设置单独的栈空间。
    6. 变量初始化,这里的变量指的是在软件中定义的已经赋好初值的全局变量,启动过程中需要将这部分变量从只读区域,也就是Flash拷贝到读写区域中,因为这部分变量的值在软件运行时有可能重新赋值。还有一种变量不需要处理,就是已经赋好初值的静态全局变量,这部分变量在软件运行过程中不会改变,因此可以直接固化在只读的Flash或EEPROM中。
    7. 数据区准备,对于软件中所有未赋初值的全局变量,启动过程中需要将这部分变量所在区域全部清零。
    8. 最后一步是调用高级语言入口函数,比如main函数等。

使用特权

评论回复
板凳
mtraveler|  楼主 | 2011-6-25 16:04 | 只看该作者
回来回答第二个问题:
产生错误的原因是keil的设置不对,project--option---target---修改 只读存储器,读写存储器地址和空间大小

使用特权

评论回复
地板
mtraveler|  楼主 | 2011-6-25 16:11 | 只看该作者
补充回答:
KEIL可以直接下载程序到flash,这当然要有jlink或ulink的支持
在options for target界面,选定irom的起始地址后(irom的地址就是程序运行域的地址,相当于ads中的RO_BASE,iram则相当于RW_BASE)
如果地址不在flash范围内,而在ram内,flash download并不会加载到ram中去。

这里要注意了,通过实际测试发现,irom确实是运行域地址,但是如果程序没有搬运代码的功能将代码搬运到irom所指的地址的话,那么烧写程序时就要
将程序烧写到irom所指的位置空间来,如果按默认烧写到0x100000处的话而irom设置的并不是0x100000,那程序是不能运行的,因为此时代码所处的位置
在0x100000处,而连接器将这些位置相关代码链接在irom处,很显然不能正常运行。

如果有搬运代码的话就可以将程序烧写到0x100000处,然后通过搬运代码将其搬运到0x104000处,但是搬运代码必须是位置无关代码,不能受到irom设置
影响,否则连搬运代码本身都不能运行。

这里又有一个问题,如果irom不是flash起始地址0x100000,而是其他地址,比如0x104000,并且将程序烧写到0x104000,那程序能运行吗?
答案是否定的,程序不能运行,因为arm上电复位后pc指针都指向0x0处,如果我们设置GPNWM2为1的话,flash将会映射到0x0处,此时映射后我们的代码
所处的位置应该在0x004000处,而0x0处没有烧写代码,所以不能运行。

解决办法就是在flash起始地址烧写一个跳转指令,使其跳转到0x104000的位置来就ok了。

还有一个邪门的方法,就是烧写代码之前全盘擦除flash,使其全部空间为0xffffffff,这样arm执行这样的指令时,貌似可以,具体什么涵义还不知道。
虽然指令没有什么涵义,但是只要能执行指令,而且不产生异常,那么pc就会一直加,当加到0x104000时,便可执行我们的程序了

使用特权

评论回复
5
mcuer1983| | 2011-6-26 12:19 | 只看该作者
不错

使用特权

评论回复
6
linux达人| | 2011-6-26 20:38 | 只看该作者
欣赏了一下,有点收获

使用特权

评论回复
7
lauai| | 2011-7-27 12:54 | 只看该作者
楼主牛呀,初学者崇拜呀,

使用特权

评论回复
8
ding88| | 2011-8-10 15:45 | 只看该作者
说的很好啊,顶

使用特权

评论回复
9
opyy125689| | 2011-10-26 19:18 | 只看该作者
学习中

使用特权

评论回复
10
fliger| | 2011-10-27 08:16 | 只看该作者
学习下,估计也用不上了

使用特权

评论回复
11
mage心寒| | 2011-10-27 09:42 | 只看该作者
顶下。。同位新手的路过。。各种迷茫。。

使用特权

评论回复
12
杨锦小杨| | 2011-10-27 19:43 | 只看该作者
顶下

使用特权

评论回复
13
vince043| | 2012-2-18 14:23 | 只看该作者
我也遇到这样的问题

使用特权

评论回复
14
mylive| | 2012-2-19 00:12 | 只看该作者
真的不容易学这个。

使用特权

评论回复
15
gelin520gelin| | 2012-2-23 11:22 | 只看该作者
顶,很实用。多谢楼主

使用特权

评论回复
16
Jack01| | 2012-2-23 13:21 | 只看该作者
学习下

使用特权

评论回复
17
hnrenyongqiang| | 2012-2-24 17:37 | 只看该作者
MARK

使用特权

评论回复
18
supreme42| | 2012-3-14 15:42 | 只看该作者
mark,多谢

使用特权

评论回复
19
spirits_hyx| | 2012-3-16 23:45 | 只看该作者
讲解的很好,新手学习的好材料

使用特权

评论回复
20
610095871| | 2012-3-17 20:34 | 只看该作者
mark

使用特权

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

本版积分规则

23

主题

68

帖子

0

粉丝