http://blog.chinaunix.net/space.php?uid=7313069&do=blog&id=1676091

关于bootloader,先简要地总结一下。经过了第一个阶段的学习,对bootloader有了一个整体的认识,其实把它当作一个功能单元 就可以了,职责就是完成从硬件加电到操作系统内核运行之前的所有工作,这些工作包括硬件检测、硬件初始化、加载kernel。这些工作怎么完成呢?按照功 能分为两个部分比较合适,硬件检测和初始化功能实现作为stage1;加载kernel作为stage2。stage1完全依赖于硬件,这一部分用汇编语 言实现;stage2与操作系统有关,一般用C语言来实现。在嵌入式系统的开发过程中,bootloader有两种选择,要么自行开发,要么移植。我还没 有写过bootloader,只是移植过U-boot,使用过Redboot。

这里讨论一个问题,bootloader如何烧写(固化)到非易失性存储介质(比如Nor Flash,NAND Flash等)里呢?
讨论之前,先要理解编程器的概念。虽然学通信工程,应该对这些工具不陌生,但是本科下来,对这些概念确实没有深刻的印象。实际用到,才发现自己基础太差, 只能努力的弥补。我写blog,很大程度上是对基础知识的巩固,相信基础扎实了,知识体系才可以慢慢的完善,才能最终胜任更高难度的工作。
编程器也叫device programmer,是对非易失性存储介质和其他电可编程设备进行编程的工具。传统的编程器,需要把Flash(举例)从电路板上取下来,插到编程器的接口上,以完成擦除和烧写。现在的编程器发展的方向是ISP(In-System Programming,在系统可编程),就是指电路板上的空白器件可以编程写入最终用户代码,而不需要从电路板上取下器件。已经编程的器件也可以用ISP方式擦除或再编程,如Nor Flash支持重复擦写10万次左右。可见,ISP,智能编程器是发展的方向。
利用编程器可以解决前面提高的问题,不仅可以烧写bootloader,还可以烧写kernel,fs等等。也就是都属于固化最终用户代码的过程。
下面考虑两种实际情况:
1、厂商已经提供固化的程序代码,不允许对其修改。那么这种情况下,用不到编程器。
2、厂商提供的硬件没有固化代码,或者固化了部分代码(后面举例说明),这样就需要用到编程器。
第一种情况是对最终用户而言,第二种情况则对开发者而言。也就是在嵌入式开发过程中,我们总是需要用到编程器,不管原来是否知道这个概念,即使是下载线,也可以认为是简单的编程器。要想利用编程器进行数据交换,完成烧写擦除等操作,就必须硬件连接、软件操作。当 然,复杂的地方在软件操作,因为对不同的硬件,软件操作是不同的。有些厂商把编程器、编辑器、编译器、汇编器、链接器、调试器集成在一起,提供软硬件解决 方案,在学校学习大多是这种集成环境了。比如51单片机的仿真器和Keil开发环境。也因为这个原因,对于每个环节反而没有了概念。在Linux下开发的 时候,这些问题就都凸现出来了。不过早出来早解决,这样无论对于自己的认识,还是对于以后的发展,都是有利的。
有些厂商为了方便用户下载代码和调试,在其处理器内部集成了一个小的ROM,事先固化一小段代码。因为容量有限,所以代码的功能有限,一般只是初始化串口,然后等待从串口输入数据。这样,串口线实际上就成为了编程器的硬件连接了。比如,Cirrus Logic 的EP93XX系列,它内部集成了一个BootROM,固化代码初始化串口,支持从串口下载数据。那么在Host端只需要相应的开发一个相同串口协议的download程序,就可以完成bootloader(EP93XX系列使用的是Redboot)烧写到Falsh里【注:这里的编程器就可以认为是download+RS-232交叉线】, 然后从Falsh启动,有Redboot进行下面的工作。因为Redboot实现了串口传输协议和TFTP协议,就可以通过RS-232来进行控制,通过 Ethernet完成大的映象文件如kernel和fs的下载固化。这样,从硬件上电,到最后系统启动的所有环节就都很清晰了。ATMEL的 AT91RM9200内部也集成了一个ROM,固化代码,同样初始化串口,启动串口传输协议Xmodem,等待输入【注:这里的编程器就可以认为是loader+RS-232交叉线】。官方提供的loader就是完成把U-boot下载固化到flash里面。因为kernel和fs比较大,可以采用压缩,官方提供boot来完成从flash启动后自动解压过程。这样,从flash启动就慢了许多。
还有些厂商为了节省ROM空间,提高集成度,不支持从ROM启动模式。比如三星公司的S3C2410等。这样一种简单的方法就是采用JTAG下载线作为编 程器的硬件连接,完成其Bootloader(如Vivi)的烧写。在Windows环境下,针对JTAG硬件连接,编程器的软件有 JFlash(JTAG for Flash),SJF,Flash Programmer等,还是比较丰富的。在Linux环境下,我所知道的有JFlash的Linux版本【注:在Linux下,这里的编程器就可以认为是JFlash+JTAG下载线,S3C2410是提供JTAG接口的】。 因为学校实验室有S3C2410的实验箱,所以下个阶段会尝试以S3C2410为中心,进行详细深入的学习。其中之一就是bootloader的研究。那 么就可以分成两个部分:一是Linux环境下Flash烧写工具JFlash的工作原理,完成移植工作。二是移植Vivi(U-boot)。在这个过程 中,重点学习一下U-boot的移植和组织形式,掌握JTAG对应的软件JFlash的源代码编写方法。然后尝试自己写一个简单的bootloader。 我想,这样学习会更加有效。
总结完之后,对bootloader的理解有了一个新的概念。把bootloader理解成烧写工具和功能实现两个部分,对于实际理解会更有帮助。这样, 拿到一块板子,首先看它提供的启动方式有那些,是否支持从ROM启动,是否支持从Flash启动等等,针对启动方式,选择bootloader固化方式, 如果提供编程器软件资源最好,如果不提供,那么要么编写,要么移植。不过,大而全在商业中是行不通的,如同周立功所说,专注于自己最擅长的,其他的外包。这是工作后应该信奉的原则。现在还是以研究为目的,尽量弄明白每个环节的工作原理,形成清晰的认识,然后选择自己最为擅长的,作为谋生的手段。即使工作后,各个环节还是应该有所射猎,知识都是相通的,可能从别的方面得到启发,解决自己手头的难题。

转载于:https://blog.51cto.com/jkers/634752

bootloader烧写相关推荐

  1. atmega8a如何烧写程序_快捷又安全!如何利用芯片内部Bootloader烧写程序?

    CC2640 R2是德州仪器推出的面向 Bluetooth Smart 应用的低功耗无线 MCU.该芯片运行TI的BLE协议栈,具有功耗低,外设种类丰富,射频性能好等特点.利用它可以实现许多有趣的应用 ...

  2. Pixhawk遥控器无法检测bootloader烧写

    Pixhawk"detected 0 radio channel" 导火索:最近毕设想用pixhawk来做个东西.于是跟着官方的wiki,搭建起了编译环境.但是奇怪的事情突然发生了 ...

  3. 用Arduino板为另一块Arduino烧写(更新)BootLoader

    手上有两块几年前买的arduino nano板子,这两天要用的时候发现用arduino IDE 1.8.11烧写的时候始终报错"上传失败".查阅相关资料发现应该在 IDE–工具–处 ...

  4. 烧写APM板的bootloader

    所需工具材料: 1.一个AVRusbasp编程器以及相应的烧写软件,推荐progisp1.72下载链接https://download.csdn.net/download/sky7723/124776 ...

  5. atmega168P烧写bootloader

    atmega168P烧写bootloader 烧写bootloader的方法大体分为两种: 1.使用Arduino IDE烧写bootloader 2.使用USBasp烧写 方法一:使用Arduino ...

  6. [Arduino]烧写Arduino BootLoader的几种方法

    [Arduino]烧写Arduino BootLoader的几种方法 身为Arduino 电子工程师,很多时候都会涉及到自制各种功能的Arduino 电路板(亦或者说是功能扩展板),但是从网上或者其他 ...

  7. 使用Arduino烧写 Arduino BootLoader

    文章目录 1.连接方式 2.烧写ArduinoISP固件 3.BootLoader烧写 1.连接方式 作为烧写器的Arduino UNO 板 待烧写单片机芯片/电路板 D10 RESET D11 D1 ...

  8. 基于USBASP给AVR单片机烧写Arduino bootloader和application固件

    基于USBASP给AVR单片机烧写Arduino bootloader和application固件 Arduino 微控制器的数字端口和模拟端口与 ATMEGA 328 芯片引脚的对应关系图如下.其中 ...

  9. 裸板烧写linux内核,嵌入式linux学习(二):烧写裸板进程

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 用了两种方式烧写裸板 1.使用J-link烧写uboot,然后再使用uboot烧写其他进程1)J-link只能烧写Nor ...

最新文章

  1. 2021-07-30 自己垃圾场景数据集训练Bisenet网络
  2. 招募 | 《大数据实践课》课程实践企业合作项目
  3. shell写的检测linux系统硬件信息的脚本
  4. webshpere MQ linux 上安装
  5. 旗帜鲜明的反对李彦宏当选院士!
  6. Python 技术篇 - 使用pypandoc库实现html文档转word文档实例演示
  7. Logic-算法-八个箱子找一个最轻的
  8. 内向的人能做管理吗?
  9. 用VMware GSX和W2K群集服务实现Exchange群集
  10. mapreduce实现——腾讯大数据QQ共同好友推荐系统【你可能认识的人】
  11. RPA应用场景-自动轮询汇总报表
  12. r语言调用python_如何在Rstudio中使用python 语言 (图文详解)
  13. 深度解析 | 炎症,肠道菌群以及抗炎饮食
  14. 组合模式中的“整体与部分”你真的清楚吗?
  15. 概率论与数理统计学习笔记(5)——极大似然估计
  16. 薅羊毛php源码,基于AutoJs实现的薅羊毛App专业版源码大分享---更新啦
  17. 【引用】pygame菜鸟入门指南
  18. App启动就闪退引发的深思
  19. 去哪儿攻略app v3.9.2 官方iphone版
  20. 在线课程推荐(国外篇)

热门文章

  1. border-raduis 在IE8中的兼容性问题
  2. python知识点 07-11
  3. 我个人认为.NET总有开源的一天
  4. EPSON机器人SPLE+语言_简单实例
  5. qstring 属于元数据类型吗_2020年退休养老金只有1800元,属于什么水平?还要继续工作吗?...
  6. sqlalchemy exists 子查询_学好ORM框架SQLAlchemy面试必问
  7. c 语言编译是什么意思,我有个C语言编译程序,但是不知道是什么意思,望大家解释哈,在下...
  8. 记录一下水下相机标定
  9. 动态显示时采色改为单帧采色
  10. MFC消息响应函数OnPaint