uboot 调试 ram中运行ram和rom的区别

bootloader区,最全面的bootloader区文章 - 电子工程世界网
bootloader区
在电子工程世界为您找到如下关于“bootloader区”的新闻
bootloader区资料下载
8.4.2存储管理的实模式与保护模式
8.4.3分区存储管理
8.4.4地址映射
8.4.5页式存储管理
8.4.6虚拟页式存储管理
8.5输入/输出(I/O)设备管理
8.5.1 I/O编址
8.5.2 I/O控制方式
8.5.3 I/O软件
思考题与习题
第九章 ARM汇编语言程序设计基础
9.1 ADS IDE介绍...
2-23。 在中断向量表中,处于低地址的中断向量所对应的中断拥有高优先级,所以,系统复位 RESET 拥有最高优先 级。 A.中断设计注意点:1.具备 Bootloader 功能的 AVR,其中断向量区可以在 Flash 程序存储器空间最低位置和 Bootloader 区的头部 来回迁移,这主要用于配合 Bootloader 程序的应用。如果不使用 Bootloader 功能,一般不要中断向量区...
LPC2200 bootloader , 包括两个应用程序区,可从主区启动或从备区启动应用程序...
—Debug进行后期的系统整合调试。 本论文的主要研究工作具体涉及以下三个的方面:首先研究了ARM相关构架以及uC/OS—Ⅱ操作系统的特点,并在此基础上移植uC/OS—Ⅱ操作系统到ARK1600平台,分析ARK1600硬件体系结构的基础上详细分析了BootLoader的相关概念,并重点阐述了NAND BootLoader程序设计与实现过程;其次在文件系统方面,本论文成功移植uC/FS嵌入式文件系统...
在开发操作系统时,经常需要用软盘镜像来在仿真器下运行,以查看是否运行正常,现有的一些软盘镜像制作工具不支持用户自己选择准确的把文件写在镜像的哪一扇区,这对操作系统内核的加载和BootLoader的编写带来很大的不便,于是本人自己开发了一个虚拟软盘管理工具,支持手动定位,内核文件写的具体扇区,另外里面还包含Trim文件工具,用来清除文件头尾的填充字符0,以及其他的工具,都是在操作系统内核开发中非...
2-JFFS2(Journalling Flash Filesystem) ...1 概述....2. JFFS 的设计原理:.1063.3 嵌入式用户界面. GUI 开发工具综述..1. Xfree86 4.X(带帧缓冲区支持的 X11R6.4)...2. Microwindows...3....
bootloader区相关帖子
MCS51 快 8~15 倍,特有XRAM 数据快速复制指令,双 DPTR 指针。
ROM:16KB 容量的可多次编程的非易失存储器 ROM,可以全部用于程序存储空间;或者可以分为 14KB 程序存储区和 2KB 引导代码 BootLoader/ISP 程序区。
DataFlash:128 字节可多次擦写的非易失数据存储器,支持以字节为单位改写数据。
RAM:256 字节内部 iRAM...
直播回顾视频:点此观看
以下为参与恩智浦KW41大赛颁奖礼(Thread/BLE双模技术讲座)直播中,网友的问题和恩智浦官方反馈回来的答复。特别感谢弋方(恩智浦半导体大中华区无线MCU市场经理)和郑海东(恩智浦半导体安全与连接事业部嵌入式处理器高级系统工程师)在直播中和直播后对网友提问的解答。
(1)直播中关于KW41芯片的那些【基础问题】
网友提问恩智浦官方解答KW41最大发射功率...
2、对于固件存放位置,我们应该怎么控制和设计。
[color=Red]一般OTA升级包括三部分,boot引导区,代码运行区,代码升级区[/color]
3、了解到新旧固件需要放置在不同的位置,那么就需要二次引导Bootloader,这个二次引导Bootloader怎么设计。自己没有搞过系统,只是稍微了解过Bootloader。
目前升级的话,主要有两种方法:
1:第一种,每次硬件...
最近我做的STM32F103VCT6单片机系统第二版打样回来后,发现不能进行ISP下载了,跟第一版相比,isp部分电路走线完全没改过。但是使用SW下载模式是可以的,程序下好后,ISP串口也能正常进行通讯。在ISP模式下,用串口助手发送bootloader握手字节0x7F,回收到0x7F和0x79两个字节,正常板应该只会收到0x79一个字节的,这个0x7F是为什么出现的,有没有人遇到同样情况...
。(4)uboot还得提供一个命令行界面供人来操作。 2.为什么是uboot2.1、uboot从哪里来的?(1)uboot是SourceForge上的开源项目(2)uboot项目的作者:一个德国人最早发起的项目(3)uboot就是由一个人发起,然后由整个网络上所有感兴趣的人共同维护发展而来的一个bootloader。2.2、uboot的发展历程(1)自己使用的小开源项目。(2)被更多人认可...
(Eboot)烧写至NandFlash,重新构建引导区 。
变砖的U-Route X6 采用什么方案可以重新烧录 比较麻烦,只能通过官方提供烧录器烧录了,或者把NANDFlash拆下,用官方烧录器进行烧录。:victory: 先接串口看看bootloader还在不在吧,
在的话可以挽救,没了的话只能上烧录器了...
又通过滤波和电压跟随,高阻输出到MCU的VREF引脚。
BOOT的选择决定MCU上电经TI封装的ROM区引导后用户代码加载的模式,板上通过使用拨码开关选择BOOT引脚的拉高和拉低,完成上电
板上预留了2组QEP接口,接口通过电平转换芯片后实现5V的接入,从下图的定义可以看出,除电源输出外,主要包括A相、B相和I相,用于光电编码器的接入,实现电机等运动设备的速度闭环控制。
,其中1/3是企业开发者、1/3是Maker或新创公司、1/3则是学术机构。 潘绍齐表示,由于mbed计划始于英国剑桥,因此有53%的开发者多位于欧洲,虽如此,但观察近年也发现亚太区的开发者数量开始增加,比例已来到1/3,尤以日、韩、中国及台湾为主。 看好亚太地区市场,ARM也表示接下来会积极往亚太区推广,以提供更多开发者完整的资源。
  随着投入物联网装置开发的人越来越多,ARM也在mbed...
、1/3是Maker或新创公司、1/3则是学术机构。潘绍齐表示,由于mbed计划始于英国剑桥,因此有53%的开发者多位于欧洲,虽如此,但观察近年也发现亚太区的开发者数量开始增加,比例已来到1/3,尤以日、韩、中国及台湾为主。看好亚太地区市场,ARM也表示接下来会积极往亚太区推广,以提供更多开发者完整的资源。
随着投入物联网装置开发的人越来越多,ARM也在mbedOS的开发上投入更多心力,潘绍齐表示,ARM也预计...
/FR6xxeFuse:JTAG签名在FRAM的FF80~FF83h范围内,写入 h到JTAG签名中,JTAG/BSL接口被无密码的锁住。如果想要解除JTAG/SBW保护,bootloader可以使用5555或AAAA以外的值去清除JTAG签名。或者执行BSL整体擦除指令。
如果是h到JTAG签名区中,那么JTAG会被直接锁死,只能通过BSL命令去解锁。如果写入...
bootloader区视频
你可能感兴趣的标签
热门资源推荐您所在位置: &
&nbsp&&nbsp
嵌入式系统解析.doc 27页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:50 &&
你可能关注的文档:
··········
··········
@嵌入式系统
1嵌入式系统的定义
凡是带有微处理器的专用系统都可以称为嵌入式系统。如单片机系统和带OS的ARM系统。各类单片机系统,在完成较为单一的专业功能时具有简洁高效的特点。但是由于他们没有操作系统,所以管理硬件和软件的能力有限,在实现复杂的多任务功能时往往困难重重,甚至无法实现。
嵌入式系统的更准确的定义:以应用为中心,以计算机技术为基础,且软硬件可裁减,适应应用系统对功能、可靠性、成本、体积、功耗的严格要求的专用计算机系统。这种专用计算机系统是由嵌入式微处理器构成的独立操作系统,完成特定功能,用于特定场合。
2嵌入式系统的特点
总体上嵌入式系统可以划分成硬件和软件两部分,硬件一般由高性能的微处理器和外围的接口电路组成,软件一般由实时操作系统和其上运行的应用软件构成。尽管嵌入式系统与PC类似,但在软硬件方面还有不同。
嵌入式系统与PC机在软件开发平台上对比:
(1)引导代码
嵌入式系统通过Bootloader引导,针对不同电路进行移植;PC机主板的BIOS引
导,无须改动。
(2)操作系统
嵌入式系统包括Linux、WinCE、VxWorksWindows、
嵌入式系统的编译环境为交叉编译;PC机操作系统的编译环境为本机编译。
(5)协议栈
开发嵌入式系统需要移植协议栈;PC机的协议栈由操作系统或第三方提供。
嵌入式系统与PC机在硬件开发平台上对比:
嵌入式系统的CPU包括ARM,MIPS,Score+等;PC机的CPU包括Intel、AMD等。
嵌入式系统内存主要用SDRAM芯片;PC机操作系统大多用SDRAM或DDR内存条。
(3)存储设备
嵌入式系统的存储设备主要为FLASH闪存芯片,容量主要为几十至几百MB;PC机的存储设备有硬盘及光盘等,其容量达几十至几百GB。
(4)输入与输出设备
嵌入式系统输入与输出设备主要是键盘、触摸屏、LCD等;PC机输入与输出设备比较丰富,有键盘、鼠标、麦克风、显示器等。
(5)其它设备
嵌入式系统主要包括音频芯片、USB芯片、网卡芯片等;PC机主要是主板集成或外接插卡。
通过以上的对比,嵌入式系统特点归纳如下:
(1)系统内核小
嵌入式系统一般是应用于小型电子装置的,系统资源相对有限,所以内核较之传统的操作系统要小得多
(2)专用性强
嵌入式系统的个性化很强,其中的软件系统和硬件的结合非常紧密,一般要针对硬件进行系统的移植
(3)系统精简
嵌入式系统一般不要求其功能设计及实现上过于复杂,这样一方面利于控制系统成本,同时也利于系统安全
(4)实时性操作系统
这是嵌入式软件的基本要求,而且软件要求固化存储,以提高速度,软件代码要求高质量和高可靠性、实时性
(5)专用的开发工具和开发环境
通过专用的开发工具,同时在特定的开发环境下,我们才可是嵌入式系统能完成特定的功能,并用于特定的场合。
3嵌入式系统的结构
嵌入式系统组成结构主要分为硬件和软件两部分。硬件核心部分是微处理器,还包括其它一些外围设备如FLASH、USB、LCD、键盘、串口等。软件部分由操作系统和应用程序构成。操作系统如Linux,应用程序如音乐播放器、图形软件等。这些软硬件的关系如下图所示
嵌入式处理器是嵌入式系统的核心部件,与通用处理器的最大差异在于其大多工作在为特定用户群设计的系统中。嵌入式处理器通常把通用计算机中许多由板块完成的任务集成在芯片内部,从而有利于嵌入式系统趋于小型化,并具有高效率、高可靠性等特征。目前,市面上有1000多种嵌入式处理器芯片,包括ARM系列、MIPS系列、PowerPC系列等等。
外围设备是指在一个嵌入式系统当中,嵌入式处理器以外的完成存储、通信、调试、显示等辅助功能的其它部件,根据外围设备的功能可分为以下3类:
存储器:SRAM、DRAM、NAND FLASH、 NOR FLASH等。
接口:并口、RS232串口、SPI串行接口、USB通用串行总线、以太网接口等。
人机接口:LCD、触摸屏、键盘等。
操作系统是嵌入式软件的最重要组成部分,操作系统将CPU时间、中断、I/O、定时器等资源都包装起来,留给用户一个标准的API,并根据各个任务的优先级,合理地在不同任务之间分配CPU时间,用户的其它应用程序都建立在操作系统之上。操作系统主要功能: 处理器管理、存储器管理、设备管理、文件管理、 用户接口管理。
@嵌入式系统硬件设计与实现
根据上一章的模块分析,本章对嵌入式系统的各硬件电路加以实现。并构建基于ARM9(SamsungS3C2440)为微处理器的核心模块和传感器输出信号调理模块,实现了嵌入式系统软硬件运行的基本环境、硬件基础、网络传输及调试的基本接口。这
正在加载中,请稍后...您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
基于ATMEL AT91RM9200的嵌入式Linux移植笔记.doc 22页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:400 &&
你可能关注的文档:
··········
··········
基于ATMEL AT91RM9200的嵌入式Linux移植笔记
??? 初学嵌入式Linux,感觉需要学习的东西太多了。把学习过程中的收获和问题记录在这里,算是一份经验吧。
? 前面利用开发板带的现成的东西step by step让Linux 2.4.19在开发板上跑起来了,对于开发的流程也有了一定的认识。现在想对每一步进行详细深入的探讨,好好学习一下,把笔记记录下来,省得忘记了。有些内容是从看过的书中摘要过来的,大部分是自己实践后的心得。我想记得详细点,也好为后面总结打好基础。
先谈一下对于嵌入式开发流程和嵌入式开发环境拓扑结构的认识。
刚开始比较盲目,看得书也不多,现在才算是大体上有了些了解。从开发产品的角度简单的描述如下:
一、嵌入式开发流程简介 假设我们现在进行一项嵌入式开产品的开发,比如说智能电力系统终端,那么我想首先应该对完整的开发流程有一个大致的了解,才不致于在以后的工作中被动。下面对嵌入式linux开发简单的介绍一下。 1、系统的需求分析? 2、硬件平台的选择和设计 3、软件开发 (3-1)建立开发环境。 (3-2)引导装载程序。 (3-3)内核裁减与编译。 (3-4)建立文件系统。 (3-5)应用程序开发。?
因为我想要做的是软件开发,所以对前两步就不作深入探索了。只想要对软件开发的每一步熟悉起来,让我定制的系统跑得稳定,开发的程序能很好的完成其功能。这是个很艰巨的任务,万里长征刚刚走了第一步:)
二、嵌入式开发环境拓扑结构简介 嵌入式开发环境一般由:宿主机(Linux Server)、工作站、嵌入式目标系统(target board)和将它们连在一起的网络环境。 1、linux server:嵌入式linux内核编译、应用程序编译的公共平台,有单独的一台pc机充当,安装标准的linux操作系统,比如redhat,debian等等。 2、工作站:为普通局域网计算机,以支持小组项目开发。工作站一般安装windows,需要linux服务器时,可以从工作站远程登陆到linux server。 3、target board:这是需要开发的最终产品,可以根据需要与工作站连接(通常通过串口或者usb接口),或连至局域网。 4、工作站需要安装ftp客户端(cuteftp、flashfxp等)和telnet客户端程序(secureCRT等),linux服务器应该开通ftp和telnet服务,还有ssh。 综述过程:开发人员在一台工作站进行操作,通过远程登陆的方式操作linux server,并且使用ftp在linux server和工作站进行文件传输,同时target board需要与网络连接,其串口与工作站的RS232接口连接。使用工作站上的超级终端作为嵌入式目标系统输入/输出端。
对于开发流程有了一定的了解后就有了目标,这样才能够不是太郁闷。
我的开发环境:Windows XP SP2+VMWARE+RedHat 9.0
首先规划一下,我先建立了一个用户armlinux,我的全部工作都是在这个用户根目录下完成。
/home/armlinux
$mkdir bootloader debug images software source kernel rootfiles sysapps tmp tools program
bootloader? images? program??? software? sysapps? tools debug?????? kernel? rootfiles? source??? tmp
然后建立环境变量,直接在.bash_profile中改就可以了。
# .bash_profile
# Get the aliases and functions if [ -f ~/.bashrc ]; then ??????? . ~/.bashrc fi
# User specific environment and startup programs export TARGET=arm-linux export PRJROOT=/home/armlinux export PREFIX=${PRJROOT}/tools export TARGET_PREFIX=${PREFIX}/${TARGET} export PATH=$PATH:$HOME/bin:$PREFIX/bin:/sbin:/usr/sbin:/usr/local/sbin
unset USERNAME
这样在下一次进入此用户时,环境变量就生效了。如果想立刻生效,那么可以用下面的命令:$source .bash_profile。这种方法可以使
正在加载中,请稍后...32MB,最全面的32MB文章 - 电子工程世界网
在电子工程世界为您找到如下关于“32MB”的新闻
32MB资料下载
操作系统(中英文)。 &器件型号& 编程(秒)& 校验(秒)& P+V (s)& Type &28F320W18& 9& 4.5& 13.5& 32Mb FLASH &28F640W30& 18& 9& 27& 64Mb FLASH &nbsp...
操作系统(中英文)。
32Mb FLASH
64Mb FLASH
AM29DL640E
64Mb FLASH
MB84VD21182DA
。  第二個基本概念是記憶體的位址,我們的機器中一般安裝有32MB、64MB或128MB記憶體,這些記憶體的每一個位元組都被賦予了一個位址,以便CPU訪問記憶體。32MB的位址範圍用十六進位數表示就是0~1FFFFFFH,其中0~FFFFFH的低端1MB記憶體非常特殊,因為最初的8086處理器能夠訪問的記憶體最大只有1MB,這1MB的低端640KB被稱為基本記憶體,而A0000H~BFFFFH...
易失性即掉电仍旧能保存信息的特性),可以对称为块的存储器单元“块”进行擦写和再编程。闪存内部不存在存储控制器,我们可以简单地认为某容量(比如32MB)内部分成一个个小方块似的存储空间,每个空间内都能存储一定量大小的信息。任何Flash闪存的写入操作只能在空或已擦除的单元内进行,所以,在进行写入操作之前必须先执行擦除操作。有多种技术能实现半导体存储,其中主要有NAND(与非)和NOR(异或)两种。两...
MMC support QVGA Support Support Embeded 32Mb PSRAM, External SPI Flash √ √ √ √ √ √ × Vibrator Driver, 8x8 qwerty key BGA 11.5mm*11.5mm 205 0.65mmMxx6252ARM7 104MHz GPRS Class 12 FR/EFR/HR/AMR speech...
k9i 原理图54321设设设设D DK9i采采Atmel采采采ARM9核核核AT91RM9200,PQFP208封封。主主180M,总总60M。 选选Uboot选选采选采FLASH选选E28F320J3A110,16bit总总,单核32Mb容容,可可可可E28F640/128。 选选选核选采SDRAM,选选HY57Vbit总总,容容...
K4S561632C-TC75 (32MB)接口电路图:...
SDRAM &K4S561632C-TC75 (32MB)介绍在信息处理中,特别是实时视频图像处理中,通常都要对实现视频图像进行处理,而这首先必须设计大容量的存储器,同步动态随机存储器SDRAM虽然有价格低廉、容量大等优点,但因SDRAM的控制结构复杂,常用的方法是设计SDRAM通用控制器,这使得很多人不得不放弃使用SDRAM而使用价格昂贵的SRAM。为此,笔者在研究有关文献的基础上...
处理器,可使用 MMU 来进行地址重映射。 实验平台使用 32MB 的 Intel NOR 型 FLASH 存储器,64MB 的 SDRAM。PDF created with pdfFactory Pro trial version aq调试过程: 工程中,设置 ro-base = 0xa0000000,即下载到 SDRAM 中进行调试。预定的地址空间 映射关系...
/ 640x2.7V 16Mb / 32Mb / 64Mb (x16) MPF+ memoriesData SheetFEATURES: Organized as 1M x16: SST39VFM x16: SST39VFM x16: SST39VF Single Voltage Read and Write Operations ……...
32MB相关帖子
工具包现已发布。面向22FDX eMRAM客户样片的多项目晶圆(MPWs)正在如期进行中,并将在2018年第一季度交付,且计划于2018年底进行风险量产。格芯及其设计合作伙伴已推出eMRAM定制设计服务,包括从2Mb到32Mb容量的eMRAM,并提供设计便捷的嵌入式闪存(eFlash)和静态随机存储器(SRAM)接口选项。
格芯安徽宣布推出基于行业大时代领先的22FDX FD-SOI 平台的嵌入式...
了,这里重复一下,格式如下:虚拟地址 物理地址 大小比如:OEMAddressTable:dd 0xxx2000000dd 0 0 0上面这个表定义了一个flash的物理地址到虚拟地址的映射,物理地址是0x,虚拟地址是0x,大小是32MB。OEMAddressTable最后必须以0结尾,表示OEMAddressTable结束...
ROHS 环保无铅:Green 无铅环保
Depth 纵向容量 x Width 横向宽度:32Mb x16
Voltage 供电电压:1.8V
Package 封装形式:VFBGA 60-ball
CLock Rate 时钟频率:200 MHz
DATA RATE 数据主频:LPDDR400
CyCLe Time 存取时间:5ns
Operating...
: 1, 8192 bytes)
Memory: 32MB = 32MB total
Memory: 25928KB available (2132K code, 214K data, 104K init)
Mount-cache hash table entries: 512
net_namespace: 64 bytes
NET: Registered protocol family 16...
;&&; original location of 32MB of NOR flash
& && &&&;DCD& &&&0xx2& &&&; 192 MB bank 6&amp...
M的NK烧写问题
通常情况,wince系统默认的image大小是32M,一般这个大小是够了。但如果添加的组件比较多,生成的NK.bin就会超过32M,这时就需要做一些修改了。
1、将项目的配置属性 &Run-time image can be larger than 32MB (IMGRAM64=1)&打上勾。
2、修改WINCE500\\PLATFORM\\SMDK2450...
N 兼容32MB
NoRFlash 设计
40mm x 60mm,4 层板
有 JZ4755,2x32MB
SDRAM; 可达8GB
底板 70mm x 109mm,4 层板
(可2 层板)
70mm x 109mm,4 层板
(可2 层板)
底板相同,有电
阻等电路区别
Wi-Fi 内置SPI,外置 SDIO 采用外置SDIO...
是最简单的跳转指令。一旦遇到一个 B 指令,ARM
处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前PC 值的一个偏移量,
而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。
它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB 的地址空间)。
现在看来这个和ADS是一致...
; & 0xx,&&32& &&&; original location of 32MB of NOR flash
& && &&&DCD& &&&0xx...
;& &B 指令是最简单的跳转指令。一旦遇到一个 B 指令,ARM
处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前PC 值的一个偏移量,
而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。
它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB 的地址空间...
你可能感兴趣的标签
热门资源推荐初学嵌入式Linux,感觉需要学习的东西太多了。把学习过程中的收获和问题记录在这里,算是一份经验吧。
& 前面利用开发板带的现成的东西step by step让Linux 2.4.19在开发板上跑起来了,对于开发的流程也有了一定的认识。现在想对每一步进行详细深入的探讨,好好学习一下,把笔记记录下来,省得忘记了。有些内容是从看过的书中摘要过来的,大部分是自己实践后的心得。我想记得详细点,也好为后面总结打好基础。
先谈一下对于嵌入式开发流程和嵌入式开发环境拓扑结构的认识。
刚开始比较盲目,看得书也不多,现在才算是大体上有了些了解。从开发产品的角度简单的描述如下:
一、嵌入式开发流程简介&
假设我们现在进行一项嵌入式开产品的开发,比如说智能电力系统终端,那么我想首先应该对完整的开发流程有一个大致的了解,才不致于在以后的工作中被动。下面对嵌入式linux开发简单的介绍一下。&
1、系统的需求分析&
2、硬件平台的选择和设计&
3、软件开发&
(3-1)建立开发环境。&
(3-2)引导装载程序。&
(3-3)内核裁减与编译。&
(3-4)建立文件系统。&
(3-5)应用程序开发。&
因为我想要做的是软件开发,所以对前两步就不作深入探索了。只想要对软件开发的每一步熟悉起来,让我定制的系统跑得稳定,开发的程序能很好的完成其功能。这是个很艰巨的任务,万里长征刚刚走了第一步:)
二、嵌入式开发环境拓扑结构简介&
嵌入式开发环境一般由:宿主机(Linux Server)、工作站、嵌入式目标系统(target board)和将它们连在一起的网络环境。&
1、linux server:嵌入式linux内核编译、应用程序编译的公共平台,有单独的一台pc机充当,安装标准的linux操作系统,比如redhat,debian等等。&
2、工作站:为普通局域网计算机,以支持小组项目开发。工作站一般安装windows,需要linux服务器时,可以从工作站远程登陆到linux server。&
3、target board:这是需要开发的最终产品,可以根据需要与工作站连接(通常通过串口或者usb接口),或连至局域网。&
4、工作站需要安装ftp客户端(cuteftp、flashfxp等)和telnet客户端程序(secureCRT等),linux服务器应该开通ftp和telnet服务,还有ssh。&
综述过程:开发人员在一台工作站进行操作,通过远程登陆的方式操作linux server,并且使用ftp在linux server和工作站进行文件传输,同时target board需要与网络连接,其串口与工作站的RS232接口连接。使用工作站上的超级终端作为嵌入式目标系统输入/输出端。
对于开发流程有了一定的了解后就有了目标,这样才能够不是太郁闷。
我的开发环境:Windows XP SP2+VMWARE+RedHat 9.0
首先规划一下,我先建立了一个用户armlinux,我的全部工作都是在这个用户根目录下完成。
/home/armlinux
$mkdir bootloader debug images software source kernel rootfiles sysapps tmp tools program
bootloader& images& program&&& software& sysapps& tools
debug&&&&&& kernel& rootfiles& source&&& tmp
然后建立环境变量,直接在.bash_profile中改就可以了。
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
&&&&&&& . ~/.bashrc
# User specific environment and startup programs
export TARGET=arm-linux
export PRJROOT=/home/armlinux
export PREFIX=${PRJROOT}/tools
export TARGET_PREFIX=${PREFIX}/${TARGET}
export PATH=$PATH:$HOME/bin:$PREFIX/bin:/sbin:/usr/sbin:/usr/local/sbin
unset USERNAME
这样在下一次进入此用户时,环境变量就生效了。如果想立刻生效,那么可以用下面的命令:$source .bash_profile。这种方法可以使这些环境变量在进入用户armlinux后就会成效,比较方便。
三、建立交叉编译环境
这一步工作我已经很顺利的完成了。刚开始时,手动建立交叉编译工具链,很困难,出现了很多问题,幸亏网上有不少的资料可以参考。关于手动建立交叉编译工具链的过程我已经做了总结,放到blog上了。现在可以获得已经编译好的工具链,这样比较方便些,毕竟几个小时的手动建立过程太繁琐,太容易出错了。
3.1 获取交叉编译工具链
在linux server上以ftp方式登陆:
这是系统提示输入用户名和密码,不要随便输,那样可能会连接失败。该ftp站点是允许匿名访问的,所以你可以用下面的用户名:anonymous登陆,密码无,直接回车就可以了。
进入后执行:
ftp&cd pub/armlinux/toolchain/
ftp&get cross-2.95.3.tar.bz2
ftp&get cross-3.0.tar.bz2
ftp&get cross-3.2.tar.bz2
ftp&get README
Linux 2.4.xx及其以下的内核源码用2.95.3的交叉编译器来编译就可以了;而2.6.xx的内核源码一般要用到cross-3.x以上的版本来编译。所以我全都下载下来了,备用。若下載速度慢,可選擇在windows下用迅雷下載,速度很快。
要想用更新的版本,则可以到网站ftp://ftp.handhelds.org/projects/toolchain下载,这里可以下在到cross-3.3.2和cross-3.4.1,默认路径是/usr/local/arm/&版本号&。
从手动编译就可以知道,根据环境变量PREFIX指定了安装目标文件夹,那么上面提供的编译好的工具链也必须安装到指定的文件夹才可以使用。可以在README中知道安装方法:
This works for both gcc-2.95.3 and gcc-3.0.
How to install:
& cd /usr/local
& mkdir arm
& tar Ixvf cross-&version&.tar.bz2
Add /usr/local/arm/&version&/bin to your path to use the cross compiler.
在Linux下面要养成看README、INSTALL文件的习惯,虽然是英文,但是写得都比较具体,比较简洁,没有很困难的。
明确了方法就比较简单了。
#mkdir /usr/local/arm
#cd /usr/local/arm
#tar jxvf cross-2.95.3.tar.bz2
然后添加路径:
$vi .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
&&&&&&& . ~/.bashrc
# User specific environment and startup programs
export TARGET=arm-linux
export PRJROOT=/home/armlinux
export PREFIX=${PRJROOT}/tools
export TARGET_PREFIX=${PREFIX}/${TARGET}
export&PATH=$PATH:$HOME/bin:$PREFIX/bin:/usr/local/arm/2.95.3/bin:/sbin:/usr/sbin:/usr/local/sbin
unset USERNAME
修改好後,終端執行命令:
$. .bash_profile&&&&&&& //讓配置文件生效
看见红色的行就是修改好的。只需要把你的路径添加到后面就可以了。
这样可以验证一下了。
$cd program
$vi hello.c
-------------------------------------------
#include &stdio.h&
int main()
&&&&&&& for(i=1;i&9;i++)
&&&&&&&&&&&&&&& printf(&Hello World %d times!\n&,i);
--------------------------------------------
保存后退出。
$arm-linux-gcc hello.c -o hello-arm
$file hello-arm
hello-arm: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped
这就说明生成的hello-arm是可以工作在ARM平台上的,也证明了你的交叉编译工具链是有效并且可用的。
在下载的2.95.3的工具链中没有包含调试工具gdb和目标板的gdbserver。在这里一起搭建好。
首先从中获得gdb套件。解压缩关于路径就不多说了。
$mkdir build-gdb build-gdbserver
$cd software
$../source/gdb-5.2.1/configure --target=$TARGET --prefix=$PREFIX
$make install
这样就可以顺利的完成gdb-5.2.1的安装了。
要想对目标板进行交叉编译,gdb显得太大了些,所以需要gdbserver。下面建立gdbserver。
$cd debug/build-gdbserver
$chmod +x ../../source/gdb-5.2.1/gdb/gdbserver/configure
$CC=arm-linux-gcc ../../source/gdb-5.2.1/gdb/gdbserver/configure --host=$TARGET --prefix=$TARGET_PREFIX
$make install
n=`echo gdbserver | sed 's,x,x,'`; \
if [ x$n = x ]; then n= \
/usr/bin/install -c gdbserver /home/armlinux/tools/arm-linux/bin/$n; \
/usr/bin/install -c -m 644 ../../software/gdb-5.2.1/gdb/gdbserver/gdbserver.1 /home/armlinux/tools/arm-linux/man/man1/$n.1
/usr/bin/install: 无法创建一般文件‘/home/armlinux/tools/arm-linux/bin/gdbserver’: 没有那个文件或目录
/usr/bin/install: 无法创建一般文件‘/home/armlinux/tools/arm-linux/man/man1/gdbserver.1’: 没有那个文件或目录
make: *** [install-only] Error 1
此处错误不难理解,主要是因为交叉编译工具放到/usr/local/arm里面了。前面的安装目录tools里面缺少几个文件夹,只需要建立就可以了。
$cd $PRJROOT/tools
$mkdir arm-linux
$cd arm-linux
$mkdir bin man
$mkdir man1
$cd $PRJROOT/debug/build-gdbserver
$make install
这样就没有问题了,当然也可以修改makefile,但是自己还没有学好shell语言,所以采取上述方法解决了。这样首先用strip处理一下,目的是gdbserver不需要附带上调试的信息,把它们都剥离去就是了。
$arm-linux-strip $TARGET_PREFIX/bin/gdbserver/gdbserver
$ls -l $TARGET_PREFIX/bin/
-rwxr-xr-x&&& 1 armlinux armlinux&&& 23132& 8月 10 11:33 gdbserver
也就是说,gdbserver经过strip处理之后还剩下23KB多一点,已经挺小了,适合目标板了。
在CU论坛上看到tree工具可以查看目录树,觉得不错。也想要安装一个。下面這個站點已經沒有tree-1.5.0.tgz。
有效的下載地址:http://linus.yhspatriot.net/cs/cs/assignments/q1/introToUnix.html
$cd source
$ftp mama.indstate.edu
Connected to mama.indstate.edu (139.102.70.201).
220 ProFTPD 1.3.0 Server (ProFTPD Default Installation) [139.102.70.201]
Name (mama.indstate.edu:armlinux): anonymous
331 Anonymous login ok, send your complete email address as your password.
230 Anonymous access granted, restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp& cd linux/tree
250 CWD command successful
227 Entering Passive Mode (139,102,70,201,149,53).
150 Opening ASCII mode data connection for file list
drwxr-xr-x&& 2 root&&&& root&&&&&&&& 4096 Jun& 4& 2001 binary
drwxr-xr-x&& 2 root&&&& root&&&&&&&& 4096 May 19& 1999 slack
-rw-r--r--&& 1 root&&&& root&&&&&&&&& 406 Oct 11& 1996 tree-1.1.lsm
-rw-r--r--&& 1 root&&&& root&&&&&&& 13135 Oct 11& 1996 tree-1.1.tgz
-rw-r--r--&& 1 root&&&& root&&&&&&&&& 405 Jan& 6& 1997 tree-1.2.lsm
-rw-r--r--&& 1 root&&&& root&&&&&&& 16362 Jan& 6& 1997 tree-1.2.tgz
-rw-r--r--&& 1 root&&&& root&&&&&&&&& 436 Feb 21& 2002 tree-1.3.lsm
-rw-r--r--&& 1 root&&&& root&&&&&&& 25060 Feb 21& 2002 tree-1.3.tgz
-rw-r--r--&& 1 root&&&& root&&&&&&&&& 432 Feb 21& 2002 tree-1.4b1.lsm
-rw-r--r--&& 1 root&&&& root&&&&&&& 27536 Feb 21& 2002 tree-1.4b1.tgz
-rw-r--r--&& 1 root&&&& root&&&&&&& 27891 Mar 25& 2002 tree-1.4b2.tgz
-rw-r--r--&& 1 root&&&& root&&&&&&&&& 432 Jun 18& 2003 tree-1.4b3.lsm
-rw-r--r--&& 1 root&&&& root&&&&&&& 29366 Feb& 6& 2003 tree-1.4b3.tgz
-rw-r--r--&& 1 root&&&& root&&&&&&&&& 466 Aug 20& 2004 tree-1.5.0.lsm
-rw-r--r--&& 1 root&&&& root&&&&&&& 26543 Aug 16& 2004 tree-1.5.0.tgz
226 Transfer complete.
ftp& get tree-1.5.0.tgz
221 Goodbye.
在Windows下解壓tree-1.5.0.tgz,將解壓後的文件夾tree-1.5.0拷到/home/zhj1011/software下。
$cd /home/zhj1011/software/tree-1.5.0
$make install
然后就可以了,安装路径查看makefile文件知道在/usr/local/bin,也可以用which查看。现在可以用tree命令来查看一下自己的目录结构了。
$tree -L 1&&&& //显示一级目录,当然也可以显示二级目录了。
|-- bootloader
|-- images
|-- kernel
|-- program
|-- rootfiles
|-- software
|-- source
|-- sysapps
这样对自己的组织比较好。等用tree熟悉了,在补充它的用法。
四、引导装载程序bootloader
因为u-boot的功能比较强大,所以选择了u-boot。这几天想先研究研究它的代码,好好分析一下启动过程。原来做过一次,不过是利用原来开发板做好的,熟悉过程是可以,但是不明白原理仍然不行。这次要学习掌握原理部分。
待续。。。。
一、了解一下存储器的基本分类情况。
存储器的物理实质是一组或多组具备数据输入输出和数据存储功能的集成电路,用于充当设备缓存或保存固定的程序及数据。存储器按存储信息的功能可分为只读存储器()和随机存储器()。
图常见存储器分类
中的信息一次写入后只能被读出,而不能被操作者修改或删除,一般由芯片制造商进行掩膜写入信息,价格便宜,适合于大量的应用。一般用于存放固定的程序,如监控程序、汇编程序等,以及存放各种表格。()和一般的不同点在于它可以用特殊的装置擦除和重写它的内容,一般用于软件的开发过程。
特别介绍:闪存(Flash Memory)
闪速存储器(Flash Memory)又称PEROM(Programmable and Erasable Read Only Memory),是Intel&公司在80&年代末90&年代初推出的,由于它的众多优点而深受用户的青睐。Flash Memory&的两个主要特点是可以按整体/扇区擦除和按字节编程。它是完全非易失的,可以在线写入,并且可以按页连续字节写入,读出速度高。Flash&芯片划分成很多扇区,把一位从0&重置为1&不能通过对该位单独操作来实现,而必须擦除整个扇区。Flash芯片的寿命就用擦除周期来衡量。通常的寿命为每个扇区可擦除100,000&次。为了避免任意一个扇区在其他扇区之前达到这个极限,大多数Flash&芯片用户会尽量保证擦除次数在各扇区之间均匀分布,这一过程称为“磨损均衡”(wear
leveling)
就是我们平常所说的内存,主要用来存放各种现场的输入、输出数据,中间计算结果,以及与外部存储器交换信息和作堆栈用。它的存储单元根据具体需要可以读出,也可以写入或改写。只能用于暂时存放程序和数据,一旦关闭电源或发生断电,其中的数据就会丢失。现在的多为型半导体电路,它分为静态和动态两种。静态是靠双稳态触发器来记忆信息的;动态是靠电路中的栅极电容来记忆信息的。由于电容上的电荷会泄漏,需要定时给与补充,所以动态需要设置刷新电路。但动态比静态集成度高、功耗低,从而成本也低,适于作大容量存储器。所以主内存通常采用动态,而高速缓冲存储器()则使用静态。动态按制造工艺的不同,又可分为动态随机存储器()、扩展数据输出随机存储器()和同步动态随机存储器()。需要恒电流以保存信息,一旦断电,信息即丢失。它的刷新频率每秒钟可达几百次,但由于使用同一电路来存取数据,所以的存取时间有一定的时间间隔,这导致了它的存取速度并不是很快。另外,在中,由于存储地址空间是按页排列的,所以当访问某一页面时,切换到另一页面会占用额外的时钟周期。同相似,但在把数据发送给的同时可以去访问下一个页面,故而速度要比普通快。同有很大区别,它使用同一个时钟周期即可完成数据的访问和刷新,即以同一个周期、相同的速度、同步的工作,因而可以同系统总线以同频率工作,可大大提高数据传输率,其速度要比和快很多(比提高近)。
二、AT91RM9200开发板的存储器情况
级译码储执级统总线(ASB)&执译码将4G间为16&个256M节区区1&8&对应EBI选NC0&NCS7联区0为内储级译码1M节内储间区15为设对级设总线(APB)&访问它区它们进访问时将发访问请发异断注意,地址的转换都是按照字节为单位的。
1、内部存储器映射
内部ROM:AT91RM-K节内ROM时ROM0x10
0000复时BMS(引导模式选择引脚)&为则复执访问0x0容量为,即对应。所以范围为-。
内:AT91RM920016-K&节内SRAM复执访问SRAM&0x20
0000间SRAM&0x0&样容量为,即对应,所以范围为-。
:AT91RM9200个USB开(OHCI)ASB访问该标内储样0x30
图内部存储器映射
2、外部存储器映射
图3&外部存储器映射
嵌入式存储设备通常主要是RAM&和作为永久存储媒质的Flash。
现在所用的AT91RM9200开发板所用的SDRAM是HY57V281620HCT-H,其容量为4banks×2Mbits×16,即128Mbits=16Mbytes。SDRAM共有两片HY57V281620HCT-H,所以SDRAM容量为32MB。
现在所用的Flash芯片为Intel的28F640J3,容量为8MB,地址映射从0xx。现在将Flash分为64个扇区,每个扇区为128KB=0x20000,每个扇区分为两个擦除块,为64KB=0x10000。
-------------------------------------------------------------------
Chip Select 0――Flash(0x-0x1FFF FFFF)
0x(第0扇区)
&&&&&&&&boot.bin&&&&&&&&&&&&Flash
0x(第0扇区)
&&&&&&&&u-boot.bin.gz&&&Flash
0x(第1扇区)
&&&&&&&&uImage&&&&&&&&&&Flash
0x(第9扇区)
&&&&&&&&ramdisk&&&&&&&&&Flash
0x107E 0000(第63扇区)
&&&&&&&&u-boot环境变量&Flash
-------------------------------------------------------------------
Chip Select 1――SDRAM(0x-0x)
&&&&&&&&&&&&&&&&&&&&SDRAM
&&&&&&&&uImage&&&&&&SDRAM
&&&&&&&&ramdisk&&&&&SDRAM
-------------------------------------------------------------------
& u-boot移植
1& 首先,了解一下bootloader。bootloader是系统加电后运行的第一段代码。它要完成的工作就是初始化硬件设备,建立内存空间的映射图,这样为最终调用操作系统内核做好准备。
2& bootloader的操作模式
(1)启动加载模式(bootloading)
(2)下载模式(downloading)
开发时要用(2),target board上的bootloader将通过串口或者网络等通信手段从host上下载内核映象和根文件系统映象等到ram中。
3& bootloader的启动方式:网络启动、磁盘启动、flash启动。
4& bootloader的种类
区分一下“bootloader”和“monitor”的概念。bootloader只是引导设备并且执行主程序的固件;而monitor还提供了更多的命令行接口,可以进行调试、读写内存、烧写flash、配置环境变量等。monitor在嵌入式系统开发过程中还可以提供很好的调试功能,开发完成后,就完全配置成了一个bootloader。所以,习惯上把它们统称为bootloader。我现在要使用的u- boot就是典型的monitor。
5& bootloader的启动流程
搜集了一些资料,写的比较精彩,放在这里。。。
系统上电,检测BMS(引导模式选择引脚),选择系统的启动方式,如果BMS(引导模式选择引脚)为高电平,则系统从片内ROM启动。AT91RM9200的ROM上电后被映射到了0x0和0x100000处,在这两个地址处都可以访问到ROM。由于9200的ROM中固化了一个BOOTLOAER程序。所以PC从0X0处开始执行这个BOOTLOAER(准确的说应该是一级BOOTLOADER)。这个BOOTLOER
依次完成以下步骤:
1.&&&&&&&&&&&&&&PLL SETUP&&&&&&&&&&&&&& //PLL:鎖相環,倍頻的作用。
设置PLLB产生48M时钟频率提供给USB DEVICE。同时DEBUG USART也被初始化为48M的时钟频率。
2.&&&&&&&&&&&&&&相应模式下的堆栈设置
3.&&&&&&&&&&&&&&检测主时钟源(Main oscillator)
4.&&&&&&&&&&&&&&中断控制器(AIC)的设置
5.&&&&&&&&&&&&&&C 变量的初始化
6.&&&&&&&&&&&&&&跳到主函数
完成以上步骤后,我们可以认为BOOT过程结束,接下来的就是LOADER的过程,或者也可以认为是装载二级BOOTLOER。按照DATAFLASH、EEPROM、连接在外部总线上的8位并行FLASH的顺序依次来找合法的BOOT程序。所谓合法的指的是在这些存储设备的开始地址处连续的存放的32个字节,也就是8条指令必须是跳转指令或者装载PC的指令,其实这样规定就是把这8条指令当作是异常向量表来处理。必须注意的是第6
条指令要包含将要装载的映像的大小。关于如何计算和写这条指令可以参考用户手册。一旦合法的映像找到之后,则BOOT程序会把找到的映像搬到SRAM中去,所以映像的大小是非常有限的,不能超过16K的大小。当BOOT程序完成了把合法的映像搬到SRAM的任务以后,接下来就进行存储器的REMAP,经过REMAP之后,SRAM从映设前的0X200000地址处被映设到了0X0地址并且程序从0X0处开始执行。而ROM这时只能在0X100000这个地址处看到了。至此9200就算完成了一种形式的启动过程。如果BOOT程序在以上所列的几种存储设备中找到合法的映像,则自动初始化DEBUG
USART口和USB DEVICE口以准备从外部载入映像。对DEBUG口的初始化包括设置参数 N 1以及运行XMODEM协议。对USB DEVICE进行初始化以及运行DFU协议。现在用户可以从外部(假定为PC平台)载入你的映像了。在PC平台下,以WIN2000为例,你可以用超级终端来完成这个功能,但是还是要注意你的映像的大小不能超过13K。一旦正确从外部装载了映像,接下来的过程就是和前面一样重映设然后执行映像了。我们上面讲了BMS(引导模式选择引脚)为高电平,选择从片内的ROM启动的一个过程。如果BMS(引导模式选择引脚)为低电平,则会从片外的FLASH启动,这时片外的FLASH的起始地址就是0X0了,接下来的过程和片内启动的过程是一样的,只不过这时就需要自己写启动代码了,至于怎么写,大致的内容和ROM的BOOT差不多,不同的硬件设计可能有不一样的地方,但基本的都是一样的。由于片外FLASH可以设计的大,所以这里编写的
BOOTLOADER可以一步到位,也就是说不用像片内启动可能需要BOOT好几级了,目前上使用较多的bootloer是u-boot,这是一个开放源代码的软件,用户可以自由下载并根据自己的应用配置。
loader.bin, boot.bin, u-boot.bin代码执行流分析.
以上三个文件时at91rm9200启动所需要的三个bin,他们的实现代码并不难。
如果是你是采用at91rm9200的评估版,应该能得到其源码。
loader.bin 执行流程,这个文件主要在片内启动从串口下载代码时会用到
loader/entry.S init cpu
b main ---& crt0.S
--& copydata --& clearbss --& b boot
main.c --& boot --&
/*Get internel rom service address*/
/* Init of ROM services structure */&
pAT91 = AT91C_ROM_BOOT_ADDRESS;
/* Xmodem Initialization */
--& pAT91-&OpenSBuffer
--& pAT91-&OpenSvcXmodem
/* System Timer initialization */
---& AT91F_AIC_ConfigureIt
/* Enable ST interrupt */
AT91F_AIC_EnableIt
AT91F_DBGU_Printk(&XMODEM: Download U-BOOT &);
// Jump to Uboot BaseAddr exec
Jump((unsigned int)AT91C_UBOOT_BASE_ADDRESS)&
boot.bin执行流程 该文件会在从片内启动时被下载到板子上,以后还会被烧写到片外Flash中,以便在片外启动时
用它来引导并解压u-boot.bin.gz,并跳转到u-boot来执行。
boot/entry.S
b main --& crt0.S --& copydata --& clearbss --& b boot
AT91F_DBGU_Printk(& &);
AT91F_DBGU_Printk(&************************************** &);
AT91F_DBGU_Printk(&** Welcome to at91rm9200 ** &);
AT91F_DBGU_Printk(&************************************** &);
boot/misc.s /* unzip uboot.bin.gz */
----& decompress_image(SRC,DST,LEN) --& gunzip&
//jump to ubootBaseAddr exec 这里跳转到解压u-boot.bin.gz的地址处直接开始执行u-boot
asm(&mov pc,%0& : : &r& (DST));
u-boot.bin执行流程
u-boot/cpu/at91rm9200/start.S&
start ---&reset&
---& copyex ---& cpu_init_crit&
---& /* set up the stack */ --& start_armboot
u-boot/lib_arm/board.c
init_fnc_t *init_sequence[] = {
cpu_init, /* basic cpu dependent setup */
board_init, /* basic board dependent setup */
interrupt_init, /* set up exceptions */
env_init, /* initialize environment */
init_baudrate, /* initialze baudrate settings */
serial_init, /* serial communications setup */
console_init_f, /* stage 1 init of console */
display_banner, /* say that we are here */
dram_init, /* configure available RAM banks */
display_dram_config,
checkboard,
---& start_armboot ---& call init_sequence
---& flash_init --& display_flash_config&
---& nand_init ---& AT91F_DataflashInit&
---& dataflash_print_info --& env_relocate
---& drv_vfd_init --& devices_init --& jumptable_init
---& console_init_r --& misc_init_r --& enable_interrupts
---& cs8900_get_enetaddr --& board_post_init --&&
u-boot/common/main.c
{ /* shell parser */
main_loop () --& u_boot_hush_start --& readline
--& abortboot&
--&printf(&Hit any key to stop autoboot: %2d &, bootdelay);
以上是at91rm9200启动并进入u-boot的执行流分析。后面u-boot还会将uImage解压到特定的位置并开始执行内核代码。
6& u-boot-1.1.1的移植
自己先用u-boot-1.1.1,主要步骤如下:
(1)下载u-boot-1.1.1
用户:armlinux
$mkdir bootloader
$cd bootloader
$tar jxvf ../source/u-boot-1.1.1.tar.bz2
$cd u-boot-1.1.1
首先看一下结构
$ tree -L 1 -d
|-- board& 平台依赖,存放电路板相关的目录文件
|-- common& 通用多功能函数的实现
|-- cpu& 平台依赖,存放cpu相关的目录文件
|-- disk& 通用。硬盘接口程序
|-- doc& 文档
|-- drivers& 通用的设备驱动程序,如以太网接口驱动
|-- examples& 应用例子
|-- fs& 通用存放文件系统的程序
|-- include& 头文件和开发板配置文件,所有开发板配置文件放在其configs里
|-- lib_arm& 平台依赖,存放arm架构通用文件
|-- lib_generic& 通用的库函数
|-- lib_i386& 平台依赖,存放x86架构通用文件
|-- lib_m68k& 平台依赖
|-- lib_microblaze& 平台依赖
|-- lib_mips& 平台依赖
|-- lib_nios&& 平台依赖
|-- lib_ppc平台依赖,存放ppc架构通用文件
|-- net& 存放网络的程序
|-- post& 存放上电自检程序
|-- rtc& rtc的驱动程序
`-- tools& 工具
然后具体步骤为:
(一)在board文件夹下面建立自己的开发板的文件夹。一般的,要选取与自己的开发板硬件设置最为接近的型号。在u-boot-1.1.1中,已经支持at91rm9200,所以可以选取at91rm9200dk作为模板进行修改。设置你的开发板的名字,随意即可,我的设置为:myboard。
[armlinux@lqm u-boot-1.1.1]$ cd board
[armlinux@lqm board]$ cp -R at91rm9200dk/ myboard/
[armlinux@lqm board]$ cd myboard
[armlinux@lqm myboard]$ ls
at91rm9200dk.c& config.mk& flash.c& Makefile& u-boot.lds
(二)可以看到,这里共有5个文件。首先,要修改主文件的名字,即要把at91rm9200dk.c更改为 myboard.c。其次,要更改config.mk中TEXT_BASE的数值,与loader等一级bootloader的要一致。接下来,因为在 at91rm9200dk用的是AMD的flash,而我的开发板上用的是Intel的28F640J3,那么需要另外找Intel的flash.C,以减少工作量。在这里,推荐用source insight这个查看代码的工具。我是在win下面使用的,它可以很方便的读代码,并且查找调用函数等等的工作。在strong
ARM构架里有xm250,它的flash是Intel的,修改的东西并不是很多。需要注意的是,xm250的flash位宽是32,而我的位宽是16,要根据这个进行相应的修改。最后,修改Makefile,主要是修改生成文件的名字。具体操作如下:
[armlinux@lqm myboard]$ mv at91rm9200dk.c myboard.c
[armlinux@lqm myboard]$ cat config.mk
TEXT_BASE = 0x21f80000
[armlinux@lqm myboard]$ vi config.mk
修改成:TEXT_BASE = 0x21f00000,然后保存退出。
[armlinux@lqm myboard]$ vi Makefile
include $(TOPDIR)/config.mk
LIB&&&& = lib$(BOARD).a
OBJS&&& :=&myboard.o&flash.o
SOBJS&& :=
$(LIB): $(OBJS) $(SOBJS)
&&&&&&& $(AR) crv $@ $(OBJS) $(SOBJS)
&&&&&&& rm -f $(SOBJS) $(OBJS)
[armlinux@lqm myboard]$ rm flash.c
[armlinux@lqm myboard]$ cp ../xm250/flash.c ./
[armlinux@lqm myboard]$ ls
config.mk& flash.c& Makefile& myboard.c& u-boot.lds
[armlinux@lqm myboard]$ vi flash.c
&&&& 34&#undef FLASH_PORT_WIDTH32&&&/*不定义位宽32*/
&&&& 35&#define FLASH_PORT_WIDTH16& /*定义位宽16*/
&&& 216&&&&&&&& switch (value) {
&&& 218&&&&&&&& case (FPW) INTEL_ID_28F128J3A:
&&& 219&&&&&&&&&&&&&&&& info-&flash_id += FLASH_28F128J3A;
&&& 220&&&&&&&&&&&&&&&& info-&sector_count = 128;
&&& 221&&&&&&&&&&&&&&&&&info-&size = 0x;
&&& 222&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/* =& 16 MB&&&& */
&&& 224&&&&&&&& case (FPW)&INTEL_ID_28F640J3A:&&&&&/*就是这个芯片*/
&&& 225&&&&&&&&&&&&&&&& info-&flash_id += FLASH_28F640J3A;
&&& 226&&&&&&&&&&&&&&&& info-&sector_count = 64;
&&& 227&&&&&&&&&&&&&&&&&info-&size = 0x;
&&& 228&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/* =& 8 MB&&&& */
[armlinux@lqm myboard]$ cd ../..
[armlinux@lqm u-boot-1.1.1]$ vi Makefile
#########################################################################
## AT91RM9200 Systems
#########################################################################
at91rm9200dk_config&&&& :&&&&&& unconfig
&&&&&&& @./mkconfig $(@:_config=) arm at91rm9200 at91rm9200dk
myboard_config& :&&&&&& unconfig
&&&&&&& @./mkconfig $(@:_config=) arm at91rm9200 myboard
#########################################################################
在这里,可以在命令模式下输入“/at91rm9200”快速查找 at91rm9200dk,仿照它的例子,写出自己板子的配置。注意的是,第二行开头要用TAB键,不是空格,否则报错。选项arm表示目标板架构, at91rm9200表是片上系统,myboard是你自己的开发板名字。
[armlinux@lqm u-boot-1.1.1]$ vi MAKEALL
LIST_ARM9=&&&&& \
&&&&&&& at91rm9200dk&&& integratorcp& integratorap&&&&&&&&&&&&&&&&&&& \
&&&&&&& omap1510inn&&&& omap1610h2&&&&& omap1610inn&&&&&&&&&&&&&&&&&&&& \
&&&&&&& smdk2400&&&&&&& smdk2410&&&&&&& trab&&&&&&&&&&&&&&&&&&&&&&&&&&& \
&&&&&&& VCMA9&&&&&&&&&& versatile&&&&&&&myboard&&&&&&&&&&&&&&&&&&&&&&&& \
(三)修改主要的配置文件。配置选项比较多,主要是配置cpu,波特率,flash和sdram的类型大小,环境变量的偏移量等等,容易出错。应该首先了解硬件情况,仔细对应芯片资料进行修改。
[armlinux@lqm u-boot-1.1.1]$ cd include/configs
[armlinux@lqm configs]$ cp at91rm9200dk.h myboard.h
[armlinux@lqm configs]$ vi myboard.h
//行號和實際的myboard.h的行號有所偏差,認真修改好配置就可以了。
41 #define CONFIG_MYBOARD&&&&&&& 1&&&目标板
65 #define CONFIG_BOOTDELAY&&&&& 5&&&u-boot延时等待时间
110 #define CONFIG_NR_DRAM_BANKS 1&&&sdram banks,我的是一个
111 #define PHYS_SDRAM 0x&&&&sdram起始地址
112 #define PHYS_SDRAM_SIZE 0x2000000&&sdram容量32MB
121 #undef CONFIG_HAS_DATAFLASH&&&&&未用dataflash
128 #define PHYS_FLASH_1 0x
129 #define PHYS_FLASH_2 0x&&定义,flash.c用到,但实际并未起作用
130 #define PHYS_FLASH_SIZE 0x800000&flash容量8MB
131 #define CFG_FLASH_BASE&&&&&&&&&&PHYS_FLASH_1& flash起始地址别名
132 #define CFG_MAX_FLASH_BANKS 1&&&flash最大banks数
133 #define CFG_MAX_FLASH_SECT 64&&&扇区总数
134 #define PHYS_FLASH_SECT_SIZE&&& (128*1024)&&每个扇区128KB
135 #define CFG_FLASH_ERASE_TOUT&&& (2*CFG_HZ) /* Timeout for Flash Erase */
136 #define CFG_FLASH_WRITE_TOUT&&& (2*CFG_HZ) /* Timeout for Flash Write */
137 #define CFG_FLASH_UNLOCK_TOUT&& (2*CFG_HZ)
139 #undef& CFG_ENV_IS_IN_DATAFLASH
141 #ifdef CFG_ENV_IS_IN_DATAFLASH
142 #define CFG_ENV_OFFSET 0x20000
143 #define CFG_ENV_ADDR (CFG_DATAFLASH_LOGIC_ADDR_CS0 + CFG_ENV_OFFSET)
144 #define CFG_ENV_SIZE 0x2000& /* 0x8000 */
146 #define CFG_ENV_IS_IN_FLASH&&&& 1
147 #define CFG_ENV_ADDR (PHYS_FLASH_1 +&0x7e0000)& /* 0x107E0000 */
148 #define CFG_ENV_SIZE&0x20000&&环境变量占了一个扇区,共128KB
149 #endif
151 #define CFG_SOFT_RESET&&&&&&&&& 1&&定义软复位,flash.c用到
152 #define CFG_LOAD_ADDR 0x& /* default load address */
160 #define CFG_PROMPT &U-boot& &&提示符名字,可任意改
[armlinux@lqm configs]$ cd ../..
[armlinux@lqm u-boot-1.1.1]$ make myboard_config
Configuring for myboard board...
[armlinux@lqm u-boot-1.1.1]$ make CROSS_COMPILE=arm-linux-
然后把生成的u-boot.bin保存,并且压缩一下得到u-boot.bin.gz。将这两个文件通过ftp传至windows上,通过SecureCRT来进行传输。
//u-boot.bin在目錄: u-boot-1.1.1下。
$gzip u-boot.bin&&&&&&&&&& //壓縮得到u-boot.bin.gz
这里注意,知道CROSS_COMPILE路径,前面设置环境变量时说到过。压缩命令为gzip &filename&
利用交叉线将com1和开发板串口相连。首先设置为片内启动方式,上电。超级终端首先出现“CCCC”,这时利用modem协议传输loader.bin,成功后传输u-boot.bin。具体现象如下:
--------------------------------------------------------------
CCCCCCCCCCCC
正在开始 xmodem 传输。 按 Ctrl+C 取消。
正在传输 loader.bin...
& 100%&&&&&& 6 KB
-I- AT91F_LowLevelInit(): Debug channel initialized&&& 6 KB/s 00:00:01&&&&&& 0 错误
loader 1.0 (Aug& 8 2003 - 12:01:07)
XMODEM: Download U-BOOT
CCCCCCCCCCCCC
正在开始 xmodem 传输。 按 Ctrl+C 取消。
正在传输 u-boot.bin...
& 100%&&&&& 85 KB&&& 6 KB/s 00:00:14&&&&&& 0 错误
U-Boot downloaded successfully
U-Boot 1.1.1 (Aug 17 2006 - 14:07:56)
U-Boot code: 21F00000 -& 21F156CC& BSS: -& 21F198D0
RAM Configuration:
Flash:& 8 MB
*** Warning - bad CRC, using default environment
In:&&& serial
Out:&& serial
Err:&& serial
U-boot& version
U-Boot 1.1.1 (Aug 17 2006 - 14:07:56)
U-boot& printenv&
bootdelay=5
baudrate=115200
stdin=serial
stdout=serial
stderr=serial
Environment tes
-------------------------------------------------------
设定环境变量,当然这些也可以在include/configs/&your-board&.h里面定义。
U-boot& setenv ipaddr 192.168.1.100
U-boot& setenv serverip 192.168.1.106
U-boot& setenv ethaddr 36:B9:04:00:24:80
注意:物理地址应该合法,在tools文件夹内有一个文件gen_eth_addr.c,利用其生成可执行文件则能够获得有效的mac地址。你可以先用gcc编译,生成可执行文件,然后执行,获得合法的mac地址。
U-boot& saveenv
Saving Environment to Flash...
Un-Protected 1 sectors
Erasing Flash...
Erasing sector done
Erased 1 sectors
Writing to Flash...\done
Protected 1 sectors
U-boot& tftpboot
TFTP from server 192.168.1.106; our IP address is 192.168.1.100
Filename 'boot.bin'.
Load address: 0x
Loading: ###
Bytes transferred = 1 hex)
U-boot& protect off 1:0
Un-Protect Flash Sectors 0-0 in Bank # 1
U-boot& erase 1:0
Erase Flash Sectors 0-0 in Bank # 1&
Erasing sector& 0 ...& done
U-boot& cp.b
Copy to Flash...-done
U-boot& tftpboot
u-boot.bin.gz
TFTP from server 192.168.1.106; our IP address is 192.168.1.100
Filename 'u-boot.bin.gz'.
Load address: 0x
Loading: #########
Bytes transferred = 43791 (ab0f hex)
U-boot& cp.b 10000 ab0f
Copy to Flash...\done
断电重启,从片外启动。
这时遇到了一个问题,就是从flash启动时,总是提示:*** Warning - bad CRC, using default environment,具体解决方法:
现象:配置好u-boot,在RAM里正常启动如下:
--------------------------------
U-Boot 1.1.2 (Aug 17 2006 - 14:07:56)
U-Boot code: 21F00000 -& 21F156CC& BSS: -& 21F198D0
RAM Configuration:
Flash:& 8 MB
*** Warning - bad CRC, using default environment
In:&&& serial
Out:&& serial
Err:&& serial
--------------------------------
flash读写擦除均正常,当设置好环境变量,固化到flash之后,启动仍然如上,即总是提示“*** Warning - bad CRC, using default environment”。使用md查看环境变量所在63扇区,发现设置的环境变量仍然在。
问题解决:
通过分析u-boot的启动流程,调试代码,得知问题出在cpu/at91rm9200/start.S中。其中有一段代码:
--------------------
&&&&&&& ldr&&&& r0, =_start
&&&&&&& ldr&&&& r1, =0x0
&&&&&&& mov&&&& r2, #16
&&&&&&& subs&&& r2, r2, #1
&&&&&&& ldr&&&& r3, [r0], #4
&&&&&&& str&&&& r3, [r1], #4
&&&&&&& bne&&&& copyex
--------------------
它的作用是把中断向量表从flash reload到RAM,以提高速度。但是它没有进行remap。故而使得u-boot启动之后无法寻找到环境变量所在的第63扇区。更改如下:
--------------------
if 0&&&&&&&
&&&&&&&&ldr&&&& r0, =_start
&&&&&&& ldr&&&& r1, =0x0
&&&&&&& mov&&&& r2, #16
&&&&&&& subs&&& r2, r2, #1
&&&&&&& ldr&&&& r3, [r0], #4
&&&&&&& str&&&& r3, [r1], #4
&&&&&&& bne&&&& copyex
--------------------
即把此段代码注释掉。
【或者是在此段前面加上remap部分,不过如果加上remap,则需要把前面的设置svc部分的代码注释掉,否则在u-boot&reset时会进入异常状态。】
此解决方案对u-boot-1.1.2也有效。
U-Boot 1.1.1 (Aug 17 2006 - 16:50:31)
U-Boot code: 21F00000 -& 21F157F4& BSS: -& 21F199F4
RAM Configuration:
Flash:& 8 MB
In:&&& serial
Out:&& serial
Err:&& serial
经验证,这是u-boot-1.1.1已经能够正常启动了。
---------------------------
同样的方法,u-boot-1.1.2也正常启动了。另外,u-boot-1.1.2有几个小的补丁,等明天再做一下总结。同时看看如何制作补丁,如何打补丁。具体的调试过程没有写得很仔细,要想做好一项工作,只会写程序远远不够,更为重要的是会调试。我需要加强此方面的工作。明天把JEDI probe调试环境的建立也总结一下。
今天学习了一下Linux下面patch的制作和使用,做了总结,放到blog上面。u-boot-1.1.2有几个diff补丁文件,具体没有分析,先附在这里。我的使用倒是还没有发现这几个问题,也许没有测试,不管它,以后如果出现问题在来仔细考虑吧。
开发板由王老师用,我先学习内核裁减吧。关于移植版本,不一定非得越高越好。关于内核版本标号问题,详细参考《Building Embedded Linux Systems》。现在还不开发产品,那么先多试用几个,总结总结经验。初步打算先移植一个2.4.x版本,然后移植一个2.6.x版本。
-----------------------------
RCS file: /home/cvs/u-boot/tools/env/fw_env.c,v
retrieving revision 1.2
diff -u -r1.2 fw_env.c
--- fw_env.c&21 Jul :43 -
+++ fw_env.c&23 Jul :25 -0000
@@ -612,8 +612,8 @@
&&&if (!crc1_ok) {
&&&&fprintf (stderr,
&&&&&&Warning: Bad CRC, using default environment\n&);
-&&&environment.data = default_
-&&&free (addr1);
+&&&memset(environment.data, 0, ENV_SIZE);
+&&&memcpy(environment.data, default_environment, sizeof(default_environment));
&&} else {
&&&flag1 = environment.
saveenv bad checksum
when saving environment after changing stdin,
stdout,... the checksum is not consistent.
Adding an env_crc_update() before saving environment
could solve this. i.e in common/cmd_nvedit.c in
function do_saveenv() :
int do_saveenv (cmd_tbl_t *cmdtp, int flag, int argc,char *argv[])
extern char * env_name_
printf (&Saving Environment to %s...\n&, env_name_spec);
env_crc_update();
----------------------------------------
Linux内核移植
版本:Linux-2.4.27-vrs1
Target Board:ARM
U-boot:1.1.2
toolchain:cross-2.95.3
kernel下载到网站,可以通过ftp方式:$ftp&,采用匿名的方式输入anonymous即可进入下载。
patch准备:到官方网站,这里提供ftp方式$ftp&
2、打好补丁,执行make mrproper清理一下代码树。
3、修改根目录的Makefile文件,只需修改ARCH和CROSS_COMPILE即可。
ARCH :=arm
CROSS_COMPILE=arm-linux-
在这里,我已经将2.95.3放到PATH中,所以不需要写全路径。如果采用其他版本的toolchain,可以指明路径,如:CROSS_COMPILE=/usr/local/arm/3.3.2/bin/arm-linux-
4、$make at91rm9200dk_config
该步的作用是把根目录下面的.config重命名为.config.old,然后把arch/arm/defconfig/里的at91rm9200dk开发板的默认配置文件复制到根目录下,命名为.config。简单的说,就是要利用提供的开发板的配置文件,然后在此基础上进行修改。
下一步如果执行make oldconfig,那么就完全按照.config来配置。而现在需要根据实际应用需要重新配置,所以不执行make oldconfig。而要执行make menuconfig。这两个命令都是首先寻找默认的.config文件并且执行,但不同的是,make oldconfig只出现.config没有的新配置选项供选择。而make menuconfig则提供所有选项,图形界面默认的是.config的配置。
在这里,还是推荐在提供的开发板配置文件的基础之上进行修改,否则后面很容易出现意想不到的问题。我就是因为开始没有使用默认配置,后面的错误一个接一个,折腾了一个上午。
5、make menuconfig
在这里可以重新配置,根据你所需要的功能进行裁减。
6、make clean dep
建立依赖关系。
7、make Image 或者 make zImage。这要看你后面使用什么方式的内核映象。如果是make Image,则生成vmlinux,需要arm-linux-objcopy进行处理,生成uImage影响文件。如果是make zImage,则生成zImage,vmlinux,system.map。
zImage和uImage对应的u-boot处理的方式也不相同,分别对应着go和bootm。
[armlinux@lqm linux-2.4.27]$ cp arch/arm/boot/zImage /home/armlinux/images/zImage-2.4.27-vrs1
[armlinux@lqm linux-2.4.27]$ cp vmlinux $PRJROOT/images/vmlinux-2.4.27-vrs1
[armlinux@lqm linux-2.4.27]$ cp System.map $PRJROOT/images/System.map-2.4.27-vrs1
[armlinux@lqm linux-2.4.27]$ cp .config $PRJROOT/images/2.4.27-vrs1.config
9、生成uImage
[armlinux@lqm linux-2.4.27]$ arm-linux-objcopy -O binary -S vmlinux linux.bin
[armlinux@lqm linux-2.4.27]$ gzip -v9 linux.bin
linux.bin:&&&&&& 55.7% -- replaced with linux.bin.gz
[armlinux@lqm linux-2.4.27]$ ../../bootloader/u-boot-1.1.2/tools/mkimage -n 'RAM disk' -A arm -O linux -T&kernel -C gzip -a 0x -e 0x -d linux.bin.gz uImage
//纠正:利用mkimage制作uImage,其中-T后跟type,此时应该为kernel,不应该为ramdisk。如果是ramdisk,那么bootm肯定无法正常引导,会显示Wrong Image Type for bootm command。
Image Name:&& RAM disk
Created:&&&&& Wed Aug 23 09:09:27 2006
Image Type:&& ARM Linux&Kernel Image (gzip compressed)
Data Size:&&& 617981 Bytes = 603.50 kB = 0.59 MB
Load Address: 0x
Entry Point:& 0x
10、准备好uImage,先通过超级终端下载到ram里面,检测,然后烧写到flash里面。
可以发现已经成功。
本文已收录于以下专栏:
相关文章推荐
linux标准内核已经支持很多芯片,包括常见的s3c**系列,这些芯片的移植比较而言,还是很容易的,只需要修改少量地方就可以。
今天我想讨论的是linux内核完全不支持的芯片板级移植方法。
  b...
BootLoader指系统启动后,在操作系统内核运行之前运行的一段小程序。通过BootLoader,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调...
Ubuntu10.04
OK6410开发板
ARM Linux3.01系统
OpenCV-2.0.0
arm-linux-g++ 4.3.2 / arm-linux...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 ram和rom的区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信