当前位置:首页 > 智能硬件 > 智能硬件
[导读]文章详细说明了从Nandflash引导操作系统要完成的主要任务和实现方法,并给出了在S3C2410上实现Nandflash启动的试验结果。

摘要:Bootloader是系统上电或复位后首先运行的一段代码,是连接操作系统和硬件的桥梁,负责初始化硬件和引导操作系统等。目前已有很多通用的Bootloader,但是如何根据特定的嵌入式平台,移植自己的引导程序是一个重点和难点。文章详细说明了从Nandflash引导操作系统要完成的主要任务和实现方法,并给出了在S3C2410上实现Nandflash启动的试验结果。
关键词:Bootloader; 移植;Nandflash;S3C2410

0 引言

Bootloader通常称为系统的引导加载程序,是系统加电或复位后执行的第一段代码[ 1 ]。一般它只在系统启动时运行非常短的时间,但对于嵌入式系统来说,这是一个非常重要的系统组成部分。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为调用操作系统内核准备好正确的环境,并同时提供基本输入、输出系统监控功能和程序调试功能。

Bootloader是严重地依赖于硬件而实现的。每种不同体系结构的处理器都有不同的Bootloader。除了依赖于处理器的体系结构以外,Bootloader实际上也依赖于具体的嵌入式板级设备的配置,也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种处理器而构建的,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,通常也都需要修改与目标硬件相关的代码。因此有必要分析Bootloader,并理解和找出其中的原理和规律,就其特定的嵌入式系统,移植或开发属于自己的Bootloader。

1 系统硬件平台简介
   本系统采用的是SamSung公司的S3C2410处理器[ 2 ],它是专门为移动手持设备提供的高性价比和高性能的嵌入式微处理器解决方案。其内核是ARM920T,最高能工作在202.8MHz,为了减少系统总成本和减少外围器件,它集成了如下部件:分别为16KB指令和数据Cahce、1个LCD控制器、SDRAM控制器、NANDFLASH控制器、3通道UART、4通道DMA、4个具有PWM功能的计时器和1个内部时钟、8通道10位ADC、触摸屏接口、I²S总线接口,2个USB主机接口、1个USB设备接口,2个SPI接口、SD和MMC卡接口、看门狗定时器、117位通用IO口、24位外部中断源、8通道10位AD控制器等。本文涉及的S3C2410开发板的硬件结构如图1所示,本文主要阐述从Nandflash引导操作系统要完成的主要任务和实现方法,至于从Norflash引导操作系统,不打算具体实现。
 
图1  S3C2410硬件结构图

2 存储空间分布和映射图
硬件平台的Nandflash(型号是:K9F1208U0M[ 3])空间为64MB,SDRAM(型号是:HY57V561620[ 4 ],32Mx2)空间为64M(0x30000000-0x33ffffff),采用如图2所示的存储空间分布图,因为Nandflash只能存储程序,无法运行程序。为了能够从Nandflash启动,上电复位时,S3C2410通过硬件逻辑把Nandflash的前4KB的内容复制到片内SRAM中,而片内SRAM被映射到地址0x0,这样就可以从地址0x0处取到有效指令,开始执行bootloader,完成把Nandflash中的内核代码复制到sdram中等工作。
 
图2   引导代码和操作系统内核在Nandflash和存储空间中的分布情况

3 Bootloader的设计流程
Bootloader引导程序是硬件上电复位后首先运行的代码,由它来加载嵌入式操作系统。然后由操作系统接管整个系统,进行进程管理、内存管理、磁盘管理和各个外设管理等工作。 BootLoader是操作系统内核运行之前的一段自举程序,用来初始化硬件设备、改变处理器运行模式和重组中断向量,建立内存空间的映射图,将系统的软硬件环境带到一个由用户定制的特定状态,然后加载操作系统内核。从操作系统的角度来看,Bootloader的总目标就是正确地调用内核来执行。Bootloader一般分为stage1和stage2两大部分[ 5 ],对于依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的,也就是前面说的启动代码。而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。

3.1 Bootloader的stage1
这部分代码必须首先完成一些基本的硬件初始化。为stage2 的执行以及随后的内核的执行准备好一些基本的硬件环境。Bootloader 的stage1 一般通用的内容包括:
(1)设置中断和异常向量;(2)禁止看门狗;(3) 屏蔽所有的中断, 在Boot Loader 的执行全过程中可以不必响应任何中断, 中断屏蔽可以通过写CPU 的中断屏蔽寄存器或状态寄存器CPSR 寄存器来完成;(4) 设置CPU 的速度和时钟频率;(5) 对RAM进行初始化, 包括正确设置系统的内存控制器的功能寄存器等;(6)初始化LED或UART,就是通过GPIO来驱动LED,也可以通过初始化UART向串口打印Bootloader的调试信息来表明系统的状态是OK还是ERROR,以便跟踪系统运行情况;(7)关闭CPU 内部指令/数据高速缓存(cache);(8)为加载Bootloader的stage2准备RAM空间;(9)设置好堆栈;(10)跳转到stage2的C入口点;其流程图如图3所示。 
 
图3  Bootloader的stage1的实现

3.2 Bootloader的stage2
为了让程序跳入C 语言的“main”函数, 我们采用直接跳转到“main”函数的方法, 实现代码如下:
b   Main 
进入main 函数后即可以开始本阶段stage2 的初始化任务, 这包括:
(1) 如果在stage1没有初始化UART,这时候至少初始化一个串口, 以便和终端用户进行交互,当然也可以继续点亮或熄灭LED来判断程序执行情况;
(2) 修改时钟频率;
(3) 使能指令Cache;
(5) 从串口中打印一些必要的交互信息,了解系统状态;
(6) 初始化中断, 包括屏蔽中断, 清除中断悬挂标志, 初始化中断向量表, 注册需要的中断处理函数等;
(8)打印版本、时间等信息,并从Nandflash复制内核到SDRAM中;
(9)修改指针,直接跳到内核在SDRAM中的首地址处,至此,完成了Bootloader的全部运行加载工作;

下面是main()函数和从Nandflash复制内核到SDRAM中的ReadImageFromNandflash()函数的具体实现,但省略了一些具体细节,包括从串口打印的启动、交互、调试信息和一些具体函数的实现。一些具体函数的实现可以参考三星评估版源代码。
void Main(void)
{
   JumpAddr=0x30200000; //拷贝内核到sdram中的起始地址,也是内核开始执行的地址
    ChangeClockDivider(1,1);     //1:2:4
    ChangeMPllValue(0x5c,0x1,0x1);   // FCLK=202.8MHz
    MMU_EnableICache();   //使能指令Cache
    Uart_Init();      // 初始化串口
Port_Init();      //初始化I/O口
NF_Init();        //初始化Nandflash控制器
NF_ReadID();      //读取Nandflash存储器ID号
ReadImageFromNandflash();//把存储在Nandflash中的内核拷贝到SDRAM中
rINTMSK=BIT_ALLMSK; //屏蔽所有中断
Launch(JumpAddr); //跳转到sdram中内核开始处,并运行内核
}
从Nandflash(Flash是K9F1208U0M)拷贝内核到SDRAM的函数具体实现如下:
void ReadImageFromNandflash(void)
{
U8 Image_Buf[512];
    U32 Sram_Space=0;
    U32 j,k, numberblock;
    static U32 i, SECTOR_SIZE=512;
    static U8 isbad;
    volatile U32 IMAGE_BASE=0x30200000;  //内核在sdram中运行的开始地址
    rINTMSK = BIT_ALLMSK;    //屏蔽所有中断
    i=2; //从第2个block开始拷贝内核,第0个用于存储本文的bootloader,第1个没用到
numberblock=2047; //拷贝多少个block到sdram中,视内核大小设置此值
    while(1)
    {
     nextblock:
       isbad=0;
       isbad=NF_IsBadBlock(i);    //判断正在拷贝的block是否是坏block
       if (isbad)  //是坏block,就进行相应的处理;否则就忽略此处,进行下面的拷贝
       { 
         i=i+1;    //调整,指向下一个block
         isbad=0;
         if(i>= numberblock)     //判断是否拷贝完了所需的block
         {
            Launch(JumpAddr);  //拷贝完了所需的block,就跳到sdram中内核开始处
}
goto nextblock;    
       }
       for(k=0;k<32;k++)     //1 block=32 pages
       {  // FMD_ReadSector()函数实现从Nandflash存储器中读取数据到数据缓冲区中
          FMD_ReadSector(i, (U8 *)&Image_Buf, k);
          for (j=0;j<SECTOR_SIZE;j++)   //1 page=512 bytes
          {  //从数据缓冲区中拷贝到sdram中
             *((U8 *)(IMAGE_BASE+Sram_Space+j))=Image_Buf[j]; 
           }
            Sram_Space=Sram_Space+SECTOR_SIZE; //调整sdram中的偏移地址
         }
        i=i+1; //调整,指向下一个block
        if(i>= numberblock)    //判断是否拷贝完了所需的block
        {
           Launch(JumpAddr);  //拷贝完了所需的block,就跳到sdram中内核开始处
         }
    }
}

4 试验结果
由于三星公司的S3C2410集成了Nandflash控制器,它通过硬件逻辑把Nandflash的前4KB内容,即把Bootloader复制到片内sram中,并被映射到地址0x0处。通过跳线设置默认从nandflash启动,那么,系统每次上电或复位后,首先开始运行的就是Bootloader。使用ADS1.2集成开发环境建立Bootloader应用工程,添加必需的文件并设置好编译环境,如Bootloader的RO_Base设置为0x0,RW_Base设置为0x33ff0000等,调试并最后生成可执行二进制文件,通过JTAG接口把Bootloader烧写到Nandflash的第0个block地址开始处,通过usb下载工具把操作系统烧写到第2个block地址开始处,复位启动系统运行后的结果如图4所示,该程序用于基于uCOS操作系统的图像采集系统的引导。用同样的方法烧写不同的操作系统内核应用程序,试验结果每一次表明:Bootloader运行良好,启动加载内核快,且简单、实用、可靠。
 
图4  Bootloader引导运行的系统

5 结论
Bootloader的设计与实现是一个非常复杂的过程,因此要根据具体的硬件和软件需求分析来进行移植或设计。本文设计的Bootloader完成的主要功能包括:试验板硬件的初始化、串口初始化、时钟频率修改以及从Nandflash复制操作系统到SDRAM中运行等,并通过PC机上的超级终端显示了正确的启动运行信息,且可执行代码只有3K左右。因此,本文所详细描述的Bootloader启动运行的全过程,对理解、设计和移植Bootloader具有一定的参考意义。

参考文献:
[1] 徐宇清,黄彦平等.S3C44B0X的Bootloader技术分析[J]. 上海理工大学学报,2005,27(4):369-372.
[2]SAMSUNG公司. Samsung s3c2410a User Manual v1.0.pdf.
[3]SAMSUNG公司.K9F1208U0M-YCB0.pdf.
[4] http://www.icpdf.com/pdf/HY57V561620.htm. HY57V561620(L)T.pdf.
[5]张嵛编著.32位嵌入式系统硬件设计与调试.北京:机械工业出版社,2005,7.

[作者简介] 
郝卫东(1964-),男,汉族,河北定县人,桂林电子科技大学高级工程师,硕士研究生导师,主要从事机器人技术和医疗电子方面的研究。

刘溯奇(1977-),男,汉族,广西桂林人,广西桂林电子科技大学机器人中心硕士研究生,主要从事机器人技术、嵌入式系统应用方面的研究。
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

伦敦2024年4月16日 /美通社/ -- ATFX宣布任命Siju Daniel为首席商务官。Siju在金融服务行业拥有丰富的经验和专业知识,曾在全球各地的高管职位上工作了19年以上。Siju之前担任FXCM首席商务官...

关键字: NI AN SI BSP

在这篇文章中,小编将为大家带来Linux内核的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 嵌入式 Linux 内核

常州2023年9月25日 /美通社/ -- 9月23日,由江苏省商务厅指导,世界中餐业联合会、常州市人民政府主办的"第三届中华节气菜大会暨首届江南美食节"在江苏常州开幕。文化和旅游部国际交流与合作局一...

关键字: BSP 可持续发展 大赛 质量控制

北京2023年9月25日 /美通社/ -- 9月21日,由中国质量报刊社·中国质量新闻网主办的第六届食品高质量发展交流会在北京举行,会议主题为"高质量,新生活",旨在推动食品行...

关键字: 自动化 BSP ISO9001 NAS

北京2023年9月23日 /美通社/ -- 近日,主线科技正式获准在北京市智能网联汽车政策先行区道路开启常态化测试与示范,将与物流客户在真实开放的城区道路场景中,率先开启基于L4级别自动驾驶能力的智能卡车运输示范。 随...

关键字: 智能卡 测试 高速公路 BSP

曼谷2023年9月18日 /美通社/ -- 作为东南亚的旅游胜地,泰国一直在全球范围内吸引着无数游客的目光。泰国旅游和体育部近日公布的报告显示,今年前7个月,泰国旅游业总收入约为1.08万亿泰铢(约合人民币2233亿元)...

关键字: BSP GEN 国美 AN

哥伦比卡尔达斯2023年9月22日 /美通社/ -- 近日,天合跟踪与中国电建签订拉美地区哥伦比亚泰普伊光伏电站跟踪支架供货协议,将为其提供108MW智能跟踪系统,其中包含开拓者1P智能跟踪支架、智能算法、以及智慧云平台...

关键字: 光伏电站 跟踪系统 控制器 BSP

2型炎症领域新突破 上海2023年9月22日 /美通社/ -- 赛诺菲今天宣布,达必妥®(度普利尤单抗注射液)获得中国国家药品监督管理局(NMPA)批准,用于治疗适合系统治疗的中度至重度结节性痒疹的成...

关键字: PRIME BSP REPORT SAR

欧莱雅中国旗下上海美次方投资有限公司达成首次开放式创新投资 法国克里希2023年9月22日 /美通社/ -- 欧莱雅集团宣布对中国创新型生物科技公司杉海创新进行少数股权投资,以建立长期合作伙伴关系,共同开发新...

关键字: AN BSP DEVELOPMENT FOR

赋能企业实现业务数据的可识别、可见、可协作和安全数据的可操作 北京2023年9月22日 /美通社/ -- 亚马逊云科技持续加速分析与安全服务创新,守护安全基座,助力企业进一步释放数据要素价值,实现创新增长。在数字经济时...

关键字: 亚马逊 BSP 生成式AI SECURITY
关闭
关闭