AVR之BOOTLOADER技术详解

AVR之BOOTLOADER技术详解
AVR之BOOTLOADER技术详解

A VR之BOOTLOADER技术详解

ATmega128具备引导加载支持的用户程序自编程功能(In-System Programming by On-chipBoot Program),它提供了一个真正的由MCU本身自动下载和更新(采用读/写同时"Read-While-Write"进行的方式)程序代码的系统程序自编程更新的机制。利用A VR的这个功能,可以实现在应用编程(IAP)以及实现系统程序的远程自动更新的应用。

IAP的本质就是,MCU可以灵活地运行一个常驻Flash的引导加载程序(Boot Loader Program),实现对用户应用程序的在线自编程更新。引导加载程序的设计可以使用任何的可用的数据接口和相关的协议读取代码,或者从程序存储器中读取代码,然后将代码写入(编程)到Flash存储器中。

引导加载程序有能力读写整个Flash存储器,包括引导加载程序所在的引导加载区本身。引导加载程序还可以对自身进行更新修改,甚至可以将自身删除,使系统的自编程能力消失。引导加载程序区的大小可以由芯片的熔丝位设置,该段程序区还提供两组锁定位,以便用户选择对该段程序区的不同级别的保护。

本节将给出一个实际的的Boot Loader程序,它可以配合Windows中的超级终端程序,采用Xmodem传输协议,通过RS232接口下载更新用户的应用程序。

5.2.1 基本设计思想

1.Boot Loader程序的设计要点

Boot Loader程序的设计是实现IAP的关键,它必须能过通过一个通信接口,采用某种协议正确的接收数据,再将完整的数据写入到用户程序区中。本例Boot Loader程序的设计要点有:

(1)采用ATmega128的USART口实现与PC之间的简易RS232三线通信;

(2)采用Xmodem通信协议完成与PC机之间的数据交换;(3)用户程序更新完成后自动转入用户程序执行;

(4)Boot Loader程序采用C语言内嵌AVR汇编方式编写,阅读理解方便,可移植性强,代码小于1K字。2.Xmodem通信协议

Xmodem协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个认可字节。为了便于读者阅读程序,下面简要说明该协议的主要特点,有关Xmoden的完整的协议请参考其它相关的资料。

(1)Xmodem的控制字符:<soh> 01H、<eot> 04H、<ack> 06H、<nak> 15H、<can> 18H、

<eof> 1AH。

(2)Xmodem传输数据块格式:"<soh> <packNO> <255-packNO> <...128个字节的数据块...>

<cksum>"。其中<soh>为起始字节;<packNO>为数据块编号字节,每次加一;<255-packNO>是前一字节的反码;接下来是长度为128字节的数据块;最后的

<cksum>是128字节数据的CRC校验码,长度为2个字节。

(3)接收端收到一个数据块并校验正确时,回送<ack>;接收错误回送<nak>;而回送<can>表示要发送端停止发送。

(4)发送端收到<ack>后,可继续发送下一个数据块(packNO+1);而收到<nak>则可再次重发上一个数据块。

(5)发送端发送<eot>表示全部数据发送完成。如果最后需要发送的数据不足128个字节,用<eof>填满一个数据块。

(6)控制字符"C"有特殊的作用,当发送端收到"C"控制字符时,它回重新开始以CRC校验方式发送数据块(packNO = 1)。

(7)每发送一个新的数据块<packNO>加1,加到OxFF 后下一个数据块的<packNO>为零。

(8)校验方式采用16位CRC校验(X^16 + X^12 + X^5 + 1)。

5.2.2 源程序代码

下面给出的源程序是在ICCA VR中实现的。

/*************************************************** **

采用串行接口实现Boot_load应用的实例

华东师大电子系马潮2004.07

Compiler: ICC-A VR 6.31

Target: Mega128

Crystal: 16Mhz

Used: T/C0,USART0

*************************************************** **/

#include <iom128v.h>

#define SPM_PAGESIZE 256 //M128的一个Flash页为256字节(128字)

#define BAUD 38400 //波特率采用

38400bps

#define CRYSTAL 16000000 //系统时钟16MHz //计算和定义M128的波特率设置参数

#define BAUD_SETTING (unsigned char)((unsigned

long)CRYSTAL/(16*(unsigned long)BAUD)-1)

#define BAUD_H (unsigned

char)(BAUD_SETTING>>8)

#define BAUD_L (unsigned char)BAUD_SETTING

#define DATA_BUFFER_SIZE SPM_PAGESIZE //定义接收缓冲区长度

//定义Xmoden控制字符

#define XMODEM_NUL 0x00

#define XMODEM_SOH 0x01

#define XMODEM_STX 0x02

#define XMODEM_EOT 0x04

#define XMODEM_ACK 0x06

#define XMODEM_NAK 0x15

#define XMODEM_CAN 0x18

#define XMODEM_EOF 0x1A

#define XMODEM_RECIEVING_WAIT_CHAR 'C'

//定义全局变量

const char startupString[]="Type 'd' download, Others run app./n/r/0";

char data[DATA_BUFFER_SIZE];

long address = 0;

//擦除(code=0x03)和写入(code=0x05)一个Flash页

void boot_page_ew(long p_address,char code)

{

asm("mov r30,r16/n"

"mov r31,r17/n"

"out 0x3b,r18/n"); //将页地址放入Z寄存器和RAMPZ的Bit0中

SPMCSR = code; //寄存器SPMCSR中为操作码

asm("spm/n"); //对指定Flash页进行操作

}

//填充Flash缓冲页中的一个字

void boot_page_fill(unsigned int address,int data)

{

asm("mov r30,r16/n"

"mov r31,r17/n" //Z寄存器中为填冲页内地址

"mov r0,r18/n"

"mov r1,r19/n"); //R0R1中为一个指令字

SPMCSR = 0x01;

asm("spm/n");

}

//等待一个Flash页的写完成

void wait_page_rw_ok(void)

{

while(SPMCSR & 0x40)

{

while(SPMCSR & 0x01);

SPMCSR = 0x11;

asm("spm/n");

}

}

//更新一个Flash页的完整处理

void write_one_page(void)

{

int i;

boot_page_ew(address,0x03); //擦除一个Flash页

wait_page_rw_ok(); //等待擦除完成

for(i=0;i<SPM_PAGESIZE;i+=2) //将数据填入Flash缓冲页中

{

boot_page_fill(i, data[i]+(data[i+1]<<8));

}

boot_page_ew(address,0x05); //将缓冲页数据写入一个Flash页

wait_page_rw_ok(); //等待写入完成

}

//从RS232发送一个字节

void uart_putchar(char c)

{

while(!(UCSR0A & 0x20));

UDR0 = c;

}

//从RS232接收一个字节

int uart_getchar(void)

{

unsigned char status,res;

if(!(UCSR0A & 0x80)) return -1; //no data to be received

status = UCSR0A;

res = UDR0;

if (status & 0x1c) return -1; // If error, return -1

return res;

}

//等待从RS232接收一个有效的字节char uart_waitchar(void)

{

int c;

while((c=uart_getchar())==-1);

return (char)c;

}

//计算CRC

int calcrc(char *ptr, int count)

{

int crc = 0;

char i;

while (--count >= 0)

{

crc = crc ^ (int) *ptr++ << 8;

i = 8;

do

{

if (crc & 0x8000)

crc = crc << 1 ^ 0x1021;

else

crc = crc << 1;

} while(--i);

}

return (crc);

}

//退出Bootloader程序,从0x0000处执行应用程序

void quit(void)

{

uart_putchar('O');uart_putchar('K');

uart_putchar(0x0d);uart_putchar(0x0a);

while(!(UCSR0A & 0x20)); //等待结束提示信息回送完成

MCUCR = 0x01;

MCUCR = 0x00; //将中断向量表迁移到应用程序区头部

RAMPZ = 0x00; //RAMPZ清零初始化

asm("jmp 0x0000/n"); //跳转到Flash的0x0000处,执行用户的应用程序

}

//主程序

void main(void)

{

int i = 0;

unsigned char timercount = 0;

unsigned char packNO = 1;

int bufferPoint = 0;

unsigned int crc;

//初始化M128的USART0

UBRR0H = BAUD_H;

UBRR0L = BAUD_L; //Set baud rate

UCSR0B = 0x18; //Enable Receiver and Transmitter

UCSR0C = 0x0E; //Set frame. format: 8data, 2stop bit

//初始化M128的T/C0,15ms自动重载

OCR0 = 0xEA;

TCCR0 = 0x0F;

//向PC机发送开始提示信息

while(startupString[i]!='/0')

{

uart_putchar(startupString[i]);

i++;

}

//3秒种等待PC下发"d",否则退出Bootloader程序,从0x0000处执行应用程序

while(1)

{

if(uart_getchar()== 'd') break;

if (TIFR & 0x02)

//timer0 over flow

{

if (++timercount > 200) quit();

//200*15ms = 3s

TIFR = TIFR|0x02;

}

}

//每秒向PC机发送一个控制字符"C",等待控制字〈soh〉while(uart_getchar()!=XMODEM_SOH) //receive the start of Xmodem

{

if(TIFR & 0x02) //timer0 over flow

{

if(++timercount > 67)

//wait about 1 second

{

uart_putchar(XMODEM_RECIEVING_WAIT_CHAR);

//send a "C"

timercount="0";

}

TIFR="TIFR" | 0x02;

}

}

//开始接收数据块

do

{

if ((packNO == uart_waitchar()) && (packNO ==(~uart_waitchar())))

{ //核对数据块编号正确

for(i=0;i<128;i++) //接收128个字节数据

{

data[bufferPoint]= uart_waitchar();

bufferPoint++;

}

crc = (uart_waitchar()<<8);

crc += uart_waitchar(); //接收2个字节的CRC效验字

if(calcrc(&data[bufferPoint-128],128)==crc) //CRC校验验证

{ //正确接收128个字节数据

while(bufferPoint >= SPM_PAGESIZE)

{ //正确接受256个字节的数据

write_one_page(); //收到256字节写入一页Flash中

address += SPM_PAGESIZE;

//Flash页加1

bufferPoint = 0;

}

uart_putchar(XMODEM_ACK); //正确收到一个数据块

packNO++; //数据块编号加1

}

else

{

uart_putchar(XMODEM_NAK); //要求重发数据块

}

}

else

{

uart_putchar(XMODEM_NAK); //要求重发数据块

}

}while(uart_waitchar()!=XMODEM_EOT); //循环接收,直到全部发完

uart_putchar(XMODEM_ACK); //通知PC机全部收到

if(bufferPoint) write_one_page(); //把剩余的数据写入Flash中

quit(); //退出Bootloader程序,从

0x0000处执行应用程序

}

程序的主体部分采用C高级编写,结构性好,程序的相应部分都给出了比较详细的注释说明,读者非常容易读懂和理解。下面再对程序做进一步的说明。

(1)函数"void write_one_page(void)" 实现了对ATmega128一个Flash页的完整编程处理。当程序从串口正确接收到256个字节后,(ATmega128一个Flash页为128个字),便调用该函数将其写入ATmega128一个Flash页中。函数先将一个指定的Flash页进行擦除;然后将数据填入Flash的缓冲页中,最后将Flash 缓冲页的数据写入到该指定的Flash页中(详细技术细节见第二章相关内容的介绍)。(2)一个Flash页的擦除、写入,以及填充Flash缓冲页的函数采用内嵌A VR汇编完成,在ICCA VR中,寄存器R16、R17、R18、R19用于传递一个C函数的第1、2个参数(int 类型)或第1个乘数(long类型),具体参考ICCAVR应用说明。

(3)函数"void quit(void)"的用途是退出Bootloader程序,从Flash的0x0000处执行用户的应用程序。在执行强行跳转指令"jmp 0x0000"前,对寄存器MCUCR的操作是将中断向量地址迁移回应用程序区的头部,因为在ICCAVR环境中编译Bootloader程序时,其自动把中断向量地址迁移到了Bootloader区的头部。为了保证能正确执行用户的程序,在跳转前需要把中断向量地址迁再移回应用程序区的头部。(4)在这段Bootloader程序中使用的硬件资源为T/C0和USART0,用户在编写其应用程序时,应首先对这两个硬件资源相关的寄存器重新做初始化。

(5)Bootloader程序占具并住留在Flash的最高1K字空间内,因此实际的应用程序空间为63K字(126K字节),所以用户编写的应用程序不得超出126K字节。同时应将ATmega128的熔丝位BLB12、BLB11的状态设置为"00",禁止SPM和LPM指令对Bootloader区的读写操作,已确保Bootloader程序不被改写和擦除。

5.2.3 IAP的实现与应用

1.Bootloader程序的编译与下载

首先在ICCA VR中新建一个工程项目,并按照生成Bootloader程序代码的要求进行正确的设置。打开Project

-> Options的Compiler Options设置选项窗口,见图5.1:(1)在Device Configration栏中选定器件ATMega128;(2)选定Use RAMPZ/ELPM项(ATMega128的Flash > 64K字节);

(3)Program Type选定为Boot Loader;

(4)Boot Size选择1K Words。

正确设置好编译选项后输入C的源代码,然后编译生成.HEX 的下载代码程序。

在下载HEX文件前还要对ATmega128芯片的熔丝位进行正确的配置:

(1)配置M103C熔丝位,使芯片工作于ATmega128方式;(2)配置BOOTSZ1和BOOTSZ0熔丝位,设定

BOOTLOADER区的大小为1024个字,起始首地址为

0xFC00;

(3)配置BOOTRST熔丝位,设定芯片上电起动从BOOTLOADER区的起始地址处开始,即每次RESET复位后从0xFC00处执行Bootloader程序;

(4)下载Bootloader程序的HEX文件;

(5)配置LB2和LB1熔丝位,加密程序;

(6)配置BLB12和BLB11熔丝位,对BOOTLOADER区进行安全锁定。

特别注意的是,以上对芯片熔丝位的配置以及Bootloader程序的下载,需要由ISP、或JTAG、或并行方式实现,既要实现IAP,首先还需要使用一次非IAP的编程方式来建立IAP 的应用环境。

2.IAP应用

当你按照上面的方法将Bootloader程序下载完成后,就可以使用它来下载你的应用程序了。具体操作如下。

(1)编写你的应用程序,编译生成HEX文件;

(2)使用HEX2BIN.EXE转换程序,将HEX文件转换成BIN 文件;

(3)使用普通的RS232电缆将PC机的串口与ATmega128的串口连接;

(4)打开WINDOWS中的超级终端软件,正确设置COM

口的参数:38400,1,8,无,2,无(使用2位停止位提高通信可靠性);

(5)ATmega128上电,在PC超级终端收到"Type 'd' download, Others run app."的Bootloader程序启动的提示详细;

(6)3秒钟内在PC上按下"d"键,通知Bootloader程序转入接收数据并更新应用程序的处理。3秒钟内没有按"d"键,PC 超级终端收到"OK"提示,Bootloader程序退出,自动转入执行芯片内原有的用户应用程序(如果有的话,否则再次启动Bootloader程序);

(7)当PC超级终端收到"C"(一秒钟一个),说明Bootloader 程序转入接收数据和更新应用程序的处理流程,正在等待PC 下发数据;

(8)在PC超级终端上的工具栏中选择"传送->发送文件",在发送文件窗口选择协议"Xmodem",文件栏中选定要下载应用程序的BIN文件,单击发送按钮;

(9)此时出现文件发送窗口,显示文件发送的过程和进度,以及是否出错;

(10)当文件全部正确发送完成后,PC超级终端收到"OK"提示,Bootloader程序退出,自动转入执行刚更新的用户应用程序。

在ATmega128中烧入这样一个Bootloader程序,建立了IAP 后,最基本的开发A VR的环境就简化成"PC+RS232电缆+目

标板"。读者在掌握了Bootloader程序编写的原理后,可以编写自己的Bootloader程序,实现系统程序的自动远程网络更新等应用。

A VR的BOOTLOADER功能同其它一些芯片不同,它的BOOTLOADER程序没有固化(固定)在芯片内部(出厂为空),而是需要由用户设计实现(实际上,你第一次下载BOOTLOADER程序还必须使用其它的方式编程,如ISP、JTAG等),因此对一般的用户掌握起来有一定的困难,不如一些其它芯片的固化IAP使用方便。但对高手来讲,可以根据实际需要编写高级、高效、专用的BOOTLOADER程序,如从一个U盘读取数据,更新用户的应用程序;编写一个时间炸弹,或对用户的密码进行验证,10次不对则将系统程序销毁等等。简单意味着使用方便,但灵活和适应性差,而灵活性需要你具备更高的能力去驾驭它。可能会有一天,在单片机的系统上也出现了"病毒"程序,其原因就是使用了固化的BOOTLOADER程序。由于固化(固定)的程序采用规定公开(开放)的接口,那么用一个带"病毒"的应用程序更新原来的应用程序也就轻而易举了。

基于AT89C51控制的0.01℃数显温度计的设计

万方数据

万方数据

万方数据

基于AT89C51控制的0.01℃数显温度计的设计 作者:罗兴垅, 黄隆胜, Lou Xinglong, Huang Longsheng 作者单位:罗兴垅,Lou Xinglong(341000,江西赣州,赣南师范学院物理与电子信息科学系), 黄隆胜,Huang Longsheng(341000,江西赣州,赣南师范学院物理与电子信息科学系;341000,江西赣 州,江西理工大学机电工程学院) 刊名: 微计算机信息 英文刊名:CONTROL & AUTOMATION 年,卷(期):2006,22(14) 被引用次数:12次 参考文献(3条) 1.万永波;张根宝;田泽;杨峰基于ARM的嵌入式系统Bootloader启动流程分析[期刊论文]-微计算机信息 2005(11) 2.谈文心;钱聪;宋云购模拟集成电路原理及应用 1995 3.潘学军0.01℃的数显温度计[期刊论文]-物理实验 2003(05) 引证文献(12条) 1.姚勇哲.张荣.邹志荣.张智日光温室温湿度自动监测预警器的研制[期刊论文]-农机化研究 2010(2) 2.符时民.于震数显测温系统设计与特性的研究[期刊论文]-辽宁石油化工大学学报 2010(2) 3.李铁军.何永洪基于单片机的IC卡系统设计[期刊论文]-微型机与应用 2009(21) 4.任小青.王晓娟基于AT89C51单片机的频率计设计方法的研究[期刊论文]-青海大学学报(自然科学版) 2009(2) 5.关玉明.程琪.肖艳春.姜云峰触摸屏变频器与PLC在调速系统中的设计[期刊论文]-机械设计与制造 2009(3) 6.关玉明.程琪.杨戈.姜云峰基于AT89C51的锌空电池温控系统设计[期刊论文]-微计算机信息 2008(32) 7.高海东.钱江基于HT48R30A-1的自动寻星系统[期刊论文]-微计算机信息 2008(29) 8.李邕数字式热敏电阻温度计设计[期刊论文]-甘肃科技纵横 2008(1) 9.张平川.许兴广基于单片机电热水器模糊控制系统设计[期刊论文]-微计算机信息 2007(32) 10.李宝营.赵永生.祖龙起.牛悦苓基于单片机的等精度频率计设计[期刊论文]-微计算机信息 2007(26) 11.肖艳军.程琪.许波基于AT89C51单片机的自动纠偏仪的设计[期刊论文]-微计算机信息 2007(23) 12.李学聪.万频.邓庆华.李军一种新型温盐深传感器的数据采集与应用[期刊论文]-微计算机信息 2007(10) 本文链接:https://www.360docs.net/doc/4914875003.html,/Periodical_wjsjxx200614026.aspx

BootLoader引导程序

BootLoader引导程序 一、实验目的 1.学会配置linux下的minicom和windows下的超级终端 2.了解bootloader的基本概念和框架结构 3.了解bootloader引导操作系统的过程 4.掌握bootloader程序的编译方法 5.掌握bootloader程序的使用方法 二、实验内容 1. 学习x-loader 作用和编译过程 2.学习uboot作用和编译过程 3.学习bootloader的操作 三、实验设备 PentiumII以上的PC机, LINUX操作系统 四、BOOTLOADER程序说明 完整的系统由x-loader、u-boot、kernel(内核)、rootfs(根文件系统)组成,x-loader 是一级引导程序,其作用是初始化CPU,拷贝u-boot到内存,然后把控制权交给u-boot。当OMAP3530上电时,memory controller(内存控制器)还未初始化,这个任务便由完成的x-loader。初始化外部RAM控制器,把u-boot读到外部RAM,之后把控制入口交给。u-boot 是二级引导程序,其作用主要是引导内核,提供映像更新,同用户进行交互。系统结构图如 下: 1. BootLoader的作用 在嵌入式系统中,BootLoader的作用与PC机上的BIOS类似,其主要作用:(1)初始化硬件设备;(2)建立内存空间的映射图;(3)完成内核的加载,为内核设置启动参数。通过BootLoader可以完成对系统板上的主要部件如CPU、SDRAM、Flash、串行口等进行初始化,也可以下载文件到系统板上,对Flash进行擦除与编程。当运行操作系统时,它会在操作系统内核运行之前运行,通过它,可以分配内存空间的映射,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统准备好正确的环境。 通常,BootLoader 是依赖于硬件而实现的,特别是在嵌入式系统中。因此,在嵌入式系统里建立一个通用的 BootLoader 几乎是不可能的,不同的处理器架构都有不同的

bootloader

Boot Loader的启动流程和开发经验总结 Windows CE最大程度继承了桌面版Windows的丰富功能,但是Windows CE并不是一个通用的安装版操作系统。在形形色色的嵌入式设备世界里,一款CE系统通常只会针对某一种硬 件平台生成。 一般来说,Windows CE的开发过程可以分为:0AL(OEM Abstraction Layer)、驱动、应用程序开发三个步骤。其中,0AL开发最基本的一步是板级支持包(BSP),而BootLoader 设计则在BSP开发中具有极为关键的地位。 1.什么是BootLoader 嵌入式系统的启动代码一般由两部分构成:引导代码和操作系统执行环境的初始化代码。其中引导代码一般也由两部分构成:第一部分是板级、片级初始化代码,主要功能是通过设置寄存器初始化硬件的工作方式,如设置时钟、中断控制寄存器等,完成内存映射、初始化MMU等。第二部分是装载程序,将操作系统和应用程序的映像从只读存储器装载或者拷贝到系统的RAM中并执行。 (1)什么是板级BSP? BSP(Board Support Package)是板级支持包,是介于主板硬件和操作系统之间的一层,主要是为了支持操作系统,使之能够更好的运行于硬件主板。不同的操作系统对应于不同形式的BSP,例如WinCE的BSP和Linux的BSP相对于某CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的。所以,BSP一定要按照该系统BSP的定义形式来写,这样才能与上 层OS保持正确的接口,良好的支持上层OS。 (2)什么是Boot Loader

在BSP中有一个重要的组成部分就是BootLoader,它是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,为调用操作系统内核准备好环境。 一般来说,在嵌入式世界里BootLoader 是严重地依赖于硬件的,因此想建立一个通用的 BootLoader 几乎是不可能的。不同的 CPU 体系结构有不同的BootLoader,而且除了依赖于 CPU的体系结构外,BootLoader还依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 结构而构建的,要想让运行在一块板子上的 BootLoader 程序也能运行在另一块板子上,通常也都需要修改 BootLoader 的源程序。 2.BootLoader在PC机与嵌入式的区别比较 (1)引导程序在PC机和嵌入式上的区别 一般来说,在PC的硬件平台上,由于硬件启动根本就不是通过BootLoader(而是通过BIOS),所以BootLoader就不需要对CPU加电后的初始化做任何工作。在桌面系统中,有以下几种设备可以作为启动设备使用:硬盘、USB盘、光盘驱动器、还有网卡的Boot ROM 等。但无论选择了哪一种启动设备,操作系统都会去将该设备起始地址的内容读入内存,BIOS 将控制移交给引导装载程序。如果启动设备是IDE硬盘,这时通常将引导装载程序装入第一个扇区(通常被称做主引导扇区,MBR),然后将内容读入内存再运行。 在嵌入式平台上,引导装载程序是在硬件上执行的第一段代码,通常将引导程序放置在不易丢失的存储器的开始地址或者是系统冷启动时PC寄存器的初始值。在嵌入式系统中,通常并没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完

详解bootloader的执行流程与ARM Linux启动过程分析

详解bootloader的执行流程与ARM Linux启动过程分析 ARM Linux启动过程分析是本文要介绍的内容,嵌入式Linux 的可移植性使得我们可以在各种电子产品上看到它的身影。对于不同体系结构的处理器来说Linux的启动过程也有所不同。 本文以S3C2410 ARM处理器为例,详细分析了系统上电后bootloader的执行流程及ARM Linux的启动过程。 1、引言 Linux 最初是由瑞典赫尔辛基大学的学生Linus Torvalds在1991 年开发出来的,之后在GNU的支持下,Linux 获得了巨大的发展。虽然Linux 在桌面PC 机上的普及程度远不及微软的Windows 操作系统,但它的发展速度之快、用户数量的日益增多,也是微软所不能轻视的。而近些年来Linux 在嵌入式领域的迅猛发展,更是给Linux 注入了新的活力。 一个嵌入式Linux 系统从软件角度看可以分为四个部分:引导加载程序(bootloader),Linux 内核,文件系统,应用程序。 其中bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用Linux 内核。 Linux 内核在完成系统的初始化之后需要挂载某个文件系统做为根文件系统(Root Filesystem)。 根文件系统是Linux 系统的核心组成部分,它可以做为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。 应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。 从以上分析我们可以看出bootloader 和Linux 内核在嵌入式系统中的关系和作用。Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本

引导加载程序

1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。 2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。 3. 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram disk 来作为 root fs。 4. 用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 懂。 引导加载程序是系统加电后运行的第一段软件代码。回忆一下 PC 的体系结构我们可以知道,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘 MBR 中的 OS Boot Loader(比如,LILO 和 GRUB 等)一起组成。BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader。Boot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。 而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序(注,有的嵌入式 CPU 也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 Boot Loader 来完成。比如在一个基于 ARM7TDMI core 的嵌入式系统中,系统在上电或复位时通常都从地址 0x00000000 处开始执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序。 本文将从 Boot Loader 的概念、Boot Loader 的主要任务、Boot Loader 的框架结构以及Boot Loader 的安装等四个方面来讨论嵌入式系统的 Boot Loader。 2. Boot Loader 的概念 简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 通常,Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 Boot Loader 设计与实现。 1. Boot Loader 所支持的 CPU 和嵌入式板 每种不同的 CPU 体系结构都有不同的 Boot Loader。有些 Boot Loader 也支持多种体系结构的 CPU,比如 U-Boot 就同时支持 ARM 体系结构和MIPS 体系结构。除了依赖于 CPU 的体系结构外,Boot Loader 实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 而构建的,要想让运行在一块板子上的 Boot Loader 程序也能运行在另一块板子上,通常也都需要修改 Boot Loader 的源程序。

bootloader分析

Bootloader分析

?熟悉BootLoader的实现原理?认识Bootloader的主要任务?熟悉BootLoader的结构框架?U-boot使用

引言本章详细地介绍了基于嵌入式系统中的OS启动加载程序――Boot Loader的概念、软件设计的主要任务以及结构框架等内容。 一个嵌入式Linux系统从软件的角度看通常可以分为四个层次: ?1.引导加载程序。包括固化在固件(firmware)中的boot代码(可 选),和Boot Loader两大部分。 ?2.Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数。 ?3.文件系统。包括根文件系统和建立于Flash内存设备之上文件 系统。通常用ram disk来作为root fs。 ?4.用户应用程序。特定于用户的应用程序。有时在用户应用程序和 内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:MicroWindows和MiniGUI。

?引导加载程序是系统加电后运行的第一段软件代码。回忆一下PC 的体系结构我们可以知道,PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS Boot Loader(比如,LILO和GRUB等)一起组成。 ?BIOS在完成硬件检测和资源分配后,将硬盘MBR中的Boot Loader读到系统的RAM中,然后将控制权交给OS Boot Loader。 Boot Loader的主要运行任务就是将内核映象从硬盘上读到RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。 而在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由Boot Loader来完成。 ?比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电 或复位时通常都从地址0x00000000处开始执行,而在这个地址 处安排的通常就是系统的Boot Loader程序。

感觉系统

感觉器官练习题 一、单选题 1.下列哪项不属于感觉器官的是( ) A.耳 B.鼻 C.神经D.皮肤 E.以上均错 2.视器包括( ) A.眼球壁和附属结构 B.眼球壁和屈光装臵 C.眼球及其附属结构 D.眼球及其屈光装臵 E.眼球及其眼睑 3.眼球() A.壁仅由巩膜、脉络膜、视网膜构成 B.折光系统包括角膜、房水、晶状体和玻璃体 C.视神经盘是感光最敏锐的部位 D.房水由虹膜分泌形成 E.角膜中央一圆孔称瞳孔 4.巩膜() A.乳白色,厚而坚韧,是硬脑膜的延伸结构 B.前方与晶状体相连C.占纤维膜的前1/6 D.有屈光作用 E.以上均错 5.瞳孔大小() A.随眼压高低而变化 B.随光线强弱而变化 C.由睫状体收缩来调节D.与三叉神经眼神经的作用有关E.随晶状体突度变化而变化 7.眼前房是指() A.角膜与玻璃体之间腔隙 B.角膜与虹膜之间腔隙 C.虹膜与晶状体之 间腔隙 D.虹膜与玻璃体之间腔隙 E.角膜与晶状体之间腔隙 8.黄斑() A.位于视神经乳头(盘)外侧约3-4mm 处 B.感光作用强,但无辨色能力C.中央有中央凹,该处对光不敏感D.视网膜节细胞轴突由此向后穿出眼 球壁 E.此处无感光细胞,称为生理性盲点 9.上直肌收缩时,瞳孔转向()A.上内方 B.下内方 C.上外方 D.下外方 E.外侧 10.上斜肌可使() A.瞳孔转向上外方 B.瞳孔转向下外方 C.瞳孔转向上方D.瞳孔转向外侧 E.瞳孔 转向下方 11.眼球的折光装臵为() A.晶状体 B.角膜、晶 状体 C.角膜、房水、晶状 体 D.角膜、房水、晶状体、玻璃体 E.角 膜、房水、晶状体、玻璃体、视网膜 12.泪道包括() A.鼻泪管、泪小管 B.泪小管、 泪囊 C.泪小管、泪囊、鼻泪管 D.泪点、泪小管、泪囊、鼻泪管 E.泪腺、结膜囊、泪小管、泪囊、鼻 泪管 13.视网膜中央动脉来源于() A.颈内动脉B.颈外动脉 C.椎动脉 D.脑膜中动脉 E.面 动脉 17. 属于生理性盲点的是 A、脉络膜 B、角膜 C、虹膜 D、视轴 E、视网膜中央凹 14. 眼前房与后房的分界是() A.睫状体 B.虹膜 C.脉 络从 D.晶状体 E.玻璃体 15.关于中耳鼓室壁的描述中,何者是错误的() A.上壁为鼓室盖,分隔鼓室与颅中 窝 B.内壁为乳突窦壁 C.下壁为颈静脉壁,将鼓室与颅内 静脉起始部隔开 D.外侧壁为鼓膜 E.前壁为颈动脉壁,此壁上部有咽 鼓管鼓口 16. 位于鼓室内的结构是() A.球囊 B.面神经 C.听 小骨 D.螺旋器(Corti器) E.半规管 17.耳蜗( ) A.由软骨构成B.由蜗管围绕蜗轴约两周半形成的 C.仅分为前庭阶和鼓阶两部分D.前庭阶和鼓阶充满内淋巴 E.以上均不对 18.不属于位觉感受器的是() A.椭圆囊斑 B.球囊斑 C.壶 腹嵴 D.螺旋器 E.以上均不对 19.前庭阶和鼓阶借何结构相通 () A.蜗孔 B.蜗管 C.蜗 窗 D.前庭窗 E.联合管 20.将声波的振动传人内耳的是 () A.听小骨 B.前庭 C.耳

Boot_Loader介绍

Boot Loader Windows CE最大程度继承了桌面版Windows的丰富功能,但是Windows CE并不是一个通用的安装版操作系统。在形形色色的嵌入式设备世界里,一款CE系统通常只会针对某一种硬件平台生成。 一般来说,Windows CE的开发过程可以分为:0AL(OEM Abstraction Layer)、驱动、应用程序开发三个步骤。其中,0AL开发最基本的一步是板级支持包(BSP),而BootLoader 设计则在BSP开发中具有极为关键的地位。 1.什么是BootLoader 嵌入式系统的启动代码一般由两部分构成:引导代码和操作系统执行环境的初始化代码。其中引导代码一般也由两部分构成:第一部分是板级、片级初始化代码,主要功能是通过设置寄存器初始化硬件的工作方式,如设置时钟、中断控制寄存器等,完成内存映射、初始化MMU等。第二部分是装载程序,将操作系统和应用程序的映像从只读存储器装载或者拷贝到系统的RAM中并执行。 (1)什么是板级BSP? BSP(Board Support Package)是板级支持包,是介于主板硬件和操作系统之间的一层,主要是为了支持操作系统,使之能够更好的运行于硬件主板。不同的操作系统对应于不同形式的BSP,例如WinCE的BSP和Linux的BSP相对于某CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的。所以,BSP一定要按照该系统BSP的定义形式来写,这样才能与上层OS保持正确的接口,良好的支持上层OS。 (2)什么是Boot Loader 在BSP中有一个重要的组成部分就是BootLoader,它是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,为调用操作系统内核准备好环境。

嵌入式linux学习心得(精选多篇)

嵌入式linux学习心得(精选多篇) 第一篇:嵌入式linux学习内容 知识结构 1嵌入式处理器与裸机程序开发2linux系统管理3linux 应用程序开发4linux驱动程序开发5linux内核开发与系统移植 一、处理器 1arm处理器工作模式2arm系统寄存器3arm寻址方式4arm汇编指令集5arm环境c语言编程6arm中断与异常7ads 集成开发环境 8裸机程序开发(串口、lcd、时钟、led、按键……) 二、系统管理 1linux定制安装2linux命令详解 3samba、nfs、tftp、wireshark使用4shell编程 三、应用程序开发 1gcc、gdb、makefile2文件、时间编程

3多进程、多线程程序设计4进程间通讯5网络编程 6qt图形化应用程序开发7android图形化应用程序开发 四、内核开发 1linux内核配置与裁剪2linux内核模块开发3根文件系统制作4进程子系统5内存子系统6proc文件系统7系统调用8内核定时器9内核异常分析 五、驱动程序开发 1字符设备驱动程序2总线、设备、驱动模型3硬件访问技术4中断处理5input设备驱动6platform驱动程序7pci、usb 驱动程序8网卡驱动程序9触摸屏驱动程序xx串口驱动程序 学习顺序 1嵌入式处理器与裸机程序开发2linux系统管理3linux 应用程序开发4linux内核开发基础5嵌入式linux环境搭建6linux驱动程序开发7深入学习linux内核 第二篇:嵌入式linux学习步骤 嵌入式linux学习步骤 作者:phantom时间:xxxx-8-6文章来源:来自网络

U-Boot从NAND Flash启动的实现

U -Boot 从NAND Flash 启动的实现 王磊 (太原理工大学信息工程学院,山西太原030024) 摘要:U -Boot 不能从NAND Flash 启动给应用带来些不便,因此修改U -Boot 使其支持从NAND Flash 启动。分析了 U -Boot 启动流程的两个阶段及实现从NAND Flash 启动的原理和思路,并根据NAND Flash 的物理结构和存储特 点,增加U -Boot 对NAND Flash 的操作支持,从而完成把存储在NAND Flash 上的U -Boot 代码复制到SDRAM 中执行,实现从NAND Flash 的启动。修改过后的U -Boot 可以直接从NAND Flash 启动,给应用带来便利。关键词:U -Boot ;NAND Flash ;Bootloader ;S3C2440;移植中图分类号:TP316 文献标识码:A 文章编号:1674-6236(2010)05-0098-03 Realization of U -Boot booting through NAND Flash WANG Lei (Department of Information Engineering ,Taiyuan University of Technology ,Taiyuan 030024,China ) Abstract:It is not convenient that U -Boot can ’t boot through NAND Flash.In this paper ,the codes of U -Boot is modified to support that.This paper analyzes two steps of U -Boot and the method of supporting that the U -Boot boots from NAND Flash.Based on the memory characteristics and the physical structure of NAND Flash ,this paper adds the codes of NAND Flash in order to carry the codes to SDRAM that stored in the NAND Flash ,thus realizes U -Boot boots from NAND Flash.The modified U -Boot runs through NAND Flash straightly ,it is a great convenience to the application of U -Boot.Key words:U -Boot ;NAND Flash ;Bootloader ;S3C2440;porting 电子设计工程 Electronic Design Engineering 第18卷 Vol.18 第5期No.52010年5月May.2010 收稿日期:2009-10-11 稿件编号:200910032 作者简介:王磊(1985—),男,山西河津人,硕士研究生。研究方向:嵌入式系统、DCS 、自动控制。 Bootloader 引导装载程序是系统上电后运行的第一段程 序,其作用是完成基本的硬件初始化工作,所以引导装载程序跟硬件有着紧密的联系。因此必须根据开发板的硬件配置对引导装载程序进行修改才可以使其运行起来。随着嵌入式系统的复杂化,大容量数据存储的NAND Flash 的应用会越来越广泛,同时U -Boot 是功能最丰富的Bootloader ,但遗憾的是U -Boot 不支持从NAND Flash 启动。所以如果能实现 U -Boot 从NAND Flash 启动的话将会给应用带来很大的方 便。本文讨论修改U -Boot 使其支持从NAND Flash 启动,采用基于S3C2440的开发板。 1U -Boot 简介及流程分析 U -Boot ,全称universal boot loader ,是遵循GPL 条款的开 放源代码项目。可以引导多种操作系统,支持多种架构的 CPU 。它支持如下操作系统:Linux 、NetBSD 、VxWorks 等,支持 如下架构的CPU :PowerPC 、MIPS 、X86、ARM 、NIOS 、XScale 等,同时支持NFS 挂载,是一个功能丰富的BootLoader 。它的整个程序框架清晰,易于移植,许多设计人员将自己的移植代码上传到网站(http ://https://www.360docs.net/doc/4914875003.html,/projects/u-boot/)上,更新速度很快。目前的版本是1.1.6,本论文正是采用此版本进行说明,U -Boot 的目录结构参见U -Boot 源代码。要进行U -Boot 的修改移植必须了解U -Boot 的程序运行流程,这是必要的一步。U -Boot 属于两阶段的BootLoader ,其启动流程如图1所示。第一阶段的文件为cpu/arm920t/start.S 和board/smdk2410/lowlevel_init.S ,用ARM 汇编语言编写,前者是平台相关的,后者是开发板相关的[1]。第一阶段主要是关于基本硬件的初始化,包括关闭MMU 、CACHE 、设置PLL 时钟比例、关闭看门狗;初始化SDRAM ,为复制第二阶段代码做准备,最后复制第二阶段代码到SDRAM 中,然后跳到 图1 U -Boot 启动流程 -98-

Linux启动全过程-由bootloader到fs

Linux启动过程 许多人对Linux的启动过程感到很神秘,因为所有的启动信息都在屏幕上一闪而过。其实Linux的启动过程并不象启动信息所显示的那样复杂,它主要分成两个阶段: 1.启动内核。在这个阶段,内核装入内存并在初始化每个设备驱动器时打印信息。 2.执行程序init。装入内核并初始化设备后,运行init程序。init程序处理所有程序的启动, 包括重要系统精灵程序和其它指定在启动时装入的软件。 下面以Red Hat为例简单介绍一下Linux的启动过程。 一、启动内核 首先介绍启动内核部分。电脑启动时,BIOS装载MBR,然后从当前活动分区启动,LILO获得引导过程的控制权后,会显示LILO提示符。此时如果用户不进行任何操作,LILO将在等待制定时间后自动引导默认的操作系统,而如果在此期间按下TAB键,则可以看到一个可引导的操作系统列表,选择相应的操作系统名称就能进入相应的操作系统。当用户选择启动LINUX操作系统时,LILO就会根据事先设置好的信息从ROOT文件系统所在的分区读取LINUX映象,然后装入内核映象并将控制权交给LINUX内核。LINUX内核获得控制权后,以如下步骤继续引导系统: 1. LINUX内核一般是压缩保存的,因此,它首先要进行自身的解压缩。内核映象前面的一些代码完成解压缩。 2. 如果系统中安装有可支持特殊文本模式的、且LINUX可识别的SVGA卡,LINUX会提示用户选择适当的文本显示模式。但如果在内核的编译过程中预先设置了文本模式,则不会提示选择显示模式。该显示模式可通过LILO或RDEV工具程序设置。 3. 内核接下来检测其他的硬件设备,例如硬盘、软盘和网卡等,并对相应的设备驱动程序进行配置。这时,显示器上出现内核运行输出的一些硬件信息。 4. 接下来,内核装载ROOT文件系统。ROOT文件系统的位置可在编译内核时指定,也可通过LILO 或RDEV指定。文件系统的类型可自动检测。如果由于某些原因装载失败,则内核启动失败,最终会终止系统。 二、执行init程序 其次介绍init程序,利用init程序可以方便地定制启动其间装入哪些程序。init的任务是启动新进程和退出时重新启动其它进程。例如,在大多数Linux系统中,启动时最初装入六个虚拟的控制台进程,退出控制台窗口时,进程死亡,然后init启动新的虚拟登录控制台,因而总是提供六个虚拟登陆控控制台进程。控制init程序操作的规则存放在文件/etc/inittab中。Red Hat Linux缺省的inittab文件如下:# #inittab This file describes how the INIT process should set up the system in a certain #run-level. # # #Default runlevel.The runlevels used by RHS are: #0-halt(Do NOT set initdefault to this) #1-Single user mode #2-Multiuser,without NFS(the same as 3,if you do not have networking) #3-Full multiuser mode #4-unused #5-X11 #6-reboot(Do NOT set initdefault to this)

BootLoader—vivi注释

s3c2410 bootloader vivi完全注释 四.Bootloader vivi 为了将linux移植到ARM上,碰到的第一个程序就是bootloader,我选用韩国mizi公司的vivi。您可以在以下地址下载: https://www.360docs.net/doc/4914875003.html,/developer/s3c2410x/download/vivi.html 如果您对bootloader没有什么概念,在学习VIVI的代码之前,建议您阅读一篇文章《嵌入式系统 Boot Loader 技术内幕》(詹荣开著)。链接地址如下:https://www.360docs.net/doc/4914875003.html,/developerworks/cn/linux/l-btloader/ 当您阅读了上述文章后,我再企图在理论上罗嗦什么就不合适了(这篇文章实在太好了)。vivi也可以分为2个阶段,阶段1的代码在 arch/s3c2410/head.S 中,阶段2的代码从init/main.c的main函数开始。您可以跳到实验部分先感受一下vivi。 (1)阶段1:arch/s3c2410/head.S 沿着代码执行的顺序,head.S完成如下几件事情: 1、关WATCH DOG:上电后,WATCH DOG默认是开着的 2、禁止所有中断:vivi中没用到中断(不过这段代码实在多余,上电后中断默认是关闭的) 3、初始化系统时钟:启动MPLL,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz,“CPU bus mode”改为“Asynchronous bus mode”。请参考实验十一:CLOCK 4、初始化内存控制寄存器:还记得那13个寄存器吗?请复习实验五:MEMORY CONTROLLER 5、检查是否从掉电模式唤醒,若是,则调用WakeupStart函数进行处理——这是一段没用上的代码,vivi不可能进入掉电模式 6、点亮所有LED 7、初始化UART0: a.设置GPIO,选择UART0使用的引脚 b.初始化UART0,设置工作方式(不使用FIFO)、波特率115200 8N1、无流控等,请参考实验七:UART 8、将vivi所有代码(包括阶段1和阶段2)从nand flash复制到SDRAM中:a.设置nand flash控制寄存器 b.设置堆栈指针——调用C函数时必须先设置堆栈 c.设置即将调用的函数nand_read_ll的参数:r0=目的地址(SDRAM的地址),r1=源地址(nand flash的地址),r2=复制的长度(以字节为单位) d.调用nand_read_ll进行复制 e.进行一些检查工作:上电后nand flash最开始的4K代码被自动复制到一个称为“Steppingstone”的内部RAM中(地址为0x00000000-0x00001000);在执行nand_read_ll之后,这4K代码同样被复制到SDRAM中(地址为 0x33f00000-0x33f01000)。比较这两处的4K代码,如果不同则表示出错 9、跳到bootloader的阶段2运行——就是调用init/main.c中的main函数:a.重新设置堆栈 b.设置main函数的参数 c.调用main函数

单片机自编程及Bootloader设计

?Bootloader是在单片机上电启动时执行的一小段程序。也称作固件,通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用应用程序准备好正确的环境。 Boot代码由MCU启动时执行的指令组成。这里的loader指向MCU的Flash中写入新的应用程序。因此,Bootloader是依赖于特定的硬件而实现的,因此,在众多嵌入式产品中目前还不可能实现通用Bootloader。 Bootloader的最大优点是:在不需要外部编程器的情况下,对嵌入式产品的应用代码进行更新升级。它使得通过局域网或者Intemet远程更新程序成为可能。例如,如果有5 000个基于MCU的电能表应用程序需要更新,电能表制造商的技术人员就可以避免从事对每一个电能表重新编程的巨大工作量,通过使用Bootloader的功能,由控制中心通过电能表抄表系统网络,远程对5 000个电表重新编程。可见,Bootloader功能对于嵌入式系统的广泛应用具有十分重要的意义。 1 78K0/Fx2系列单片机简介 78K0/Fx2系列是带CAN控制器的8位单片机,该系列单片机广泛应用于汽车电子,智能仪表等领域。其内置POC(可编程上电清零电路)/LVI(可编程低电压指示器),单电压自编程闪存,引导交换功能(闪存安全保护),具有低功耗、宽电压范围、超高抗干扰等性能。 78K0系列单片机支持自编程(Self-programming)。所谓自编程,是指用Flash存储器中的驻留的软件或程序对Flash存储器进行擦除/编程的方法。通过单片机的自编程功能,可以设计Bootloader程序,通过串口等通信接口实现对产品重新编程、在线升级的功能。 以μPD78F0881为例。μPD78F0881为78KO/Fx2系列中的一款44管脚单片机,内置32 KB Flash ROM,2 KB RAM,自带2个串行通信接口。其内部Flash结构如图1所示。为了方便实现擦除和编程,人为地将整个Flash分成若干个block,每个block 大小为1 KB。block为自编程库函数中空白检测、擦除、校验的最小单位。blockO从地址0000H开始,程序都从0000H开始执行。block0~block3共4 KB存储空间为 Bootloader程序存储区域。block4~block31为应用程序存储区域。

S3C2410 bootloader ----VIVI阅读笔记

S3C2410 bootloader ----VIVI阅读笔记 建议读一读《嵌入式系统BootLoader技术内幕》(詹荣开著),google一下就会找到一片。什么是Bootloader就不再这里废话了,看看上面的文章就明了了。Bootloader有非常多种,如本文将要阅读的vivi,除此之外更有uboot,redboot,lilo等等。Vivi 是韩国mizi公司专门为三星s3c2410芯片设计的Bootloader。 先来看看vivi的源码树: vivi-+-arch-+-s3c2410 |-Documentation |-drivers-+-serial | …-mtd-+-maps | |-nor | …-nand |-include-+-platform | |-mtd | …-proc |-init |-lib-+-priv_data |-scripts-+-lxdialog |-test |-util 能google一下,搜到源码vivi.tar.gz。 前面提到的文件已系统的分析了bootloader的,这里就按原始码来具体说事。vivi也能分为2个阶段,阶段1的代码在arch/s3c2410/head.S中,阶段2的代码从init/main.c的main函数开始。 1.阶段1 阶段1从程式arch/s3c2410/head.S开始,按照head.S的代码执行顺序,一次完成了下面几个任务: u 1、关WA TCH DOG (disable watch dog timer) 上电后,WATCH DOG默认是开着的 u 2、禁止所有中断(disable all interrupts) vivi中不会用到中断,中断是系统的事,bootloader可不能去干这事的(不过这段代码实在多余,上电后中断默认是关闭的) u 3、初始化系统时钟(initialise system clocks) 启动MPLL,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz,“CPU bus mode”改为“Asynchronous bus mode”。 u 4、初始化内存控制寄存器(memsetup) S3c2410共有15个寄存器,在此开始初始化13个寄存器。 u

bootloader流程

Bootloader 设计分析 3.1 Bootloader 的操作模式 (Operation Mode) 大多数 Bootloader 都包含两种不同的操作模式[2]: (1). 启动加载(Boot loading)模式:也称为“自主”模式。即Bootloader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。 (2).下载(Downloading)模式:在这种模式下,目标机上的Bootloader将通过串口或网络连接等通信手段从主机(Host)下载内核映像和根文件系统映像等,然后保存到目标机上的FLASH 类固态存储设备中。Bootloader的这种模式通常在系统初次安装和更新时被使用,工作于这种模式下的Bootloader通常都会向它的终端用户提供一个简单的命令行接口。 在我们的Bootloader设计中我们同时支持这两种工作模式,采用的方法是:一开始启动时处于正常的启动加载模式,但并不立即启动进入uClinux内核,而是提示延时5秒,等待终端用户如果按下某一特定按键,则切换到下载模式,否则继续启动uCLinux 内核。 3.2 Bootloader 的启动及初始化 基于ARM的芯片多数为复杂的片上系统(SoC),这类复杂系统里的多数硬件模块都是可配置的[3]。因此大多数 Bootloader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,通常都放在 stage1 中,而且在这一部分,我们直接对处理器内核和硬件控制器进行编程,因此常常都用汇编语言来实现。而stage2则通常用C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。 3.2.1 Bootloader的stage1 这部分代码必须首先完成一些基本的硬件初始化,为stage2的执行以及随后的kernel 的执行准备好一些基本的硬件环境[2]。Bootloader的stage1一般通用的内容包括: * 定义程序入口点 * 设置异常向量表 * 初始化存储系统(包括地址重映射) * 初始化有特殊要求的端口,设备 * 初始化用户程序的执行环境

(完整版)感觉系统检查--浅感觉

感觉系统检查--浅感觉 1.痛觉:用大头针的针尖轻刺被检者皮肤以检查痛觉,左右远近对比并记录感觉障碍类型(过敏、减退或消失)与范围。 2.触觉:用棉签或软纸片轻触被检者的皮肤或粘膜。 3.温度觉:用盛有热水(40 ℃~50 ℃)或冷水(5~10 ℃)的试管接触皮肤,辨别冷热感觉。深感觉 1、运动觉:被检者闭目,检查者轻轻夹住被检者的手指或足趾两侧,上下移动5°左右,令被检者说出“向上”或“向下”。如感觉不明显可加大活动幅度或测试较大的关节。 2、位置觉:被检者闭目,检查者将其肢体摆成某一姿势,请患者描述该姿势或用对侧肢体模仿。 3、振动觉:用振动着的音叉柄置于骨隆起处(如内、外踝,手指、桡尺骨茎突、胫骨、膝盖等),询问有无振动感觉和持续时间,并两侧对比。 .腹壁反射(abdominal reflex):被检者仰卧,下肢稍屈曲,使腹壁松弛,然后用钝头竹签分别沿肋弓下缘(T7~8)、脐孔水平(T9 ~10)及腹股沟上(T11 ~12)的平行方向,由外向内轻划腹壁皮肤。正常反应是该侧腹肌收缩,脐孔向刺激部分偏移。 .提睾反射(cremasteric reflex)反射中心L1 ~2。 与检查腹壁反射相同,竹签由下而上轻划大腿上部内侧皮肤,反应为该侧提睾肌收缩使睾丸上提。 跖反射(plantar reflex) :反射中心S1~2。被检者仰卧、下肢伸直,医生手持被检者踝部。用钝头竹签划足底外侧,由足根向前至小趾根部足掌时转向内侧,正常反应为足趾跖屈(即Babinski征阴性)。 肛门反射:反射中心S4~5。用竹签轻划肛门周围皮肤,可引起肛门外括约肌收缩。 膝反射(k nee reflex)(L2~4) 坐位检查时,患者小腿完全松弛下垂,与大腿成直角,卧位检查则患者仰卧,检查者以左手托起其膝关节使之屈曲约120°,用右手持叩诊锤叩击膝盖髌骨下方股四头肌腱,可引起小腿伸展。 踝反射(ankle reflex) (S1~2) 又称跟腱反射。患者仰卧,屈膝约90°,检查者左手将其足部背屈成直角,以叩诊锤叩击跟腱,反应为腓肠肌收缩,足跖屈;或俯卧位,屈膝90°,检查者用左手按足跖,再扣击跟腱;或患者跪于床边,足悬于床外,扣击跟腱。 .Babinski巴宾斯基征取位与检查跖反射一样,用竹签沿患者足底外侧缘,由后向前至小趾跟部并转向内侧,阳性反应为踇趾背屈,其余各趾呈扇形展开。

相关文档
最新文档