嵌入式学习第一篇:Boot-loader

使用ADS+HJTAG调试Boot Loader 嵌入式系统的Boot Loader相当于PC机的BIOS,通常我们在移植Boot Loader的时候,往往会陷入无任何软件工具可用的情况,甚至连串口都无法输出任何信息,要追查错误是非常困难的,这时候往往就需要JTAG接口协助我们进行调试了。 JTAG是联合测试工作组的简称,发展于1985年,作为一种简单的电路接口协议,一般用于访问IC内部的子模块,因此也常用于嵌入式系统的调试,目前大部分C 阅读详情

由于 Boot Loader 的实现依赖于 CPU 的体系结构,因此大多数 Boot Loader 都分为 stage1 和 stage2

两大部分。
依赖于 CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用

汇编语言来实现,以达到短小精悍的目的。
而 stage2 则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性可移植性.

 

*

Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序):
·硬件设备初始化。
·为加载 BootLoader的stage2准备 RAM空间
·拷贝 Boot Loader 的 stage2 到 RAM 空间中
·设置好堆栈。
·跳转到 stage2 的 C 入口点。

Boot Loader 的 stage2 通常包括以下步骤(以执行的先后顺序):
·初始化

本阶段要使用到的硬件设备。
·检测系统内存映射(memory map)。
·将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。
·为内核设置启动参数。
·调用内核。

 

 

//Boot-loader

unsigned long address;
unsigded long data;
unsigned long length;
void init_uart(void)     //串口1初始化
{
 IO_UBRLCR1=(IO_UBRLCR1 & ~BRDIV) | BR_115200; //串口频率
 IO_UBRLCR1=IO_UBRLCR1 | FIFOEN;
 IO_UBRLCR1=(IO_UBRLCR1 & ~WRDLEN) | (3<<WRDLEN_SHIFT);
 IO_SYSCON1 |=UARTLEN;
}
unsigned char get_char(void)
{
 while(IO_SYSFLG1 & UR5XFE1);
 return IO_UBRLCR1 & 0xff;
}
void put_char(unsigned char data)
{
 while(IO_SYSFLG & UTXFF1);
 IO_UARTDR1=data;
}
void put_string(char *sp)
{
 unsigned int i=0;
 while(sp[i]!=0)
  put_char(sp[i]++);
}
unsigned int wait(unsigned int i)
{
 unsigned int sum=0;
 for(;i>0;i--)
  sum+=i;
 return(sum);
}
void flash_erase()
{
 SYSC_(0x70005555)=0xaa;
 wait(1);
 SYSC_(0x70002aaa)=0x55;
 wait(1);
 SYSC_(0x70005555)=0x80;
 wait(1);
 SYSC_(0x70005555)=0xaa;
 wait(1);
 SYSC_(0x70002aaa)=0x55;
 wait(1);
 SYSC_(0x70005555)=0x10;
 wait(1);
 while((SYSC_(0x70000000) & 0x80)==0);  //确认已擦出
}
void flash_prog(unsigned long address,unsigned char data)
{
 SYSC_(0x70005555)=0xaa;
 wait(1);
 SYSC_(0x70002aaa)=0x55;
 wait(1);
 SYSC_(0x70005555)=0xa0;
 wait(1);
 SYS_(address)=data;
 while(SYS_(address)!=data);   //确认已写入
}
void writein()
{
 unsigned long i,data;
 put_string("len:/n");
 length=get_char();
 length=(length<<8)+get_char();
 length=(length<<8)+get_char();
 length=(length<<8)+get_char();
 for(i=0;i<length;i+=4)
 {
  data=get_char();
  data+=get_char()<<8;
  data+=get_char()<<16;
  data+=get_char()<<24;
  SDRAM_(i)=data;
 }
 put_string("OK!/n");
}
void flashload()
{
 unsigned long i;
 writein();
 flash_erase();
 for(i=0;i<length;i+=4)
 {
  data=SDRAM_(i);
  flash_prog((0x70000000+i),data & 0xff);
  flash_prog((0x70000000+i),(data>>8) & 0xff);
  flash_prog((0x70000000+i),(data>>16) & 0xff);
  flash_prog((0x70000000+i),(data>>24) & 0xff);
 }
 put_string("Done!/n");
}
void mymain(void)
{
 unsigned char scomm,sdata;
 unsigned char *addrp;
 unsigned char *datap;
 addrp=(unsigned char *)& address;
 datap=(unsigned char *)& data;
 put_string("ok!/n");

 while(1)
 {
  scomm=get_char();
  if(scomm==0xff)
  {
   scomm=get_char();
   if(scomm!=0xff)
    switch(scomm)
    {
     case 0xfa:flashload();break;
     default:put_string("not support!/n");
    }
   else sdata=0xff;
  }
  else sdata=scomm;
 }
}
void C_vMain(void)
{
 unsigned char i;
 unsigned short j;
 init_uart();
 while(1)
 {
  i=get_char();
  if(i==0x79)
   mymain();
  else put_string(i);
 }
}

嵌入式Boot Loader核心原理与实战:从PowerPC到ARM的启动设计精髓 Boot Loader是嵌入式系统上电后执行的第一段代码,负责完成硬件初始化、内存配置和操作系统加载等核心任务。其工作原理基于CPU的固定复位向量和内存映射机制,通过读取存储设备中的代码完成自举。在技术价值上,一个设计良好的Boot Loader实现了配置与代码分离、支持多重加载通道(如TFTP网络加载和串口加载),并内置了Fallback模式等鲁棒性设计,是确保系统可靠启动和便于远程维护的关键。这些设计思想广泛应用于从工业控制到网络设备的各类嵌入式场景。本文以经典的PlanetCore Boot Load 阅读详情

相关推荐

深入解析Stellaris ROM Boot Loader与ADC驱动:嵌入式开发核心机制

Boot Loader是嵌入式系统启动与固件更新的基石,它决定了微控制器上电后的执行流程,并支持通过UART、I2C等串行接口进行可靠的固件升级。模数转换器(ADC)作为连接物理世界与数字世界的关键外设,其采样序列器、硬件过采样和数字比较器等高级功能,能够实现高精度、高效率的数据采集。在基于ARM Cortex-M内核的嵌入式开发中,深入理解这些底层机制,不仅能优化系统资源利用,还能提升产品的可靠性与性能。本文以TI Stellaris系列微控制器为例,详细剖析其ROM中固化的Boot Loader与ADC

weixin_34343000的博客 465

某公司面试题

一、基础题 1,冯诺依曼结构的计算机硬件逻辑组成中,不包含以下哪个模块? A,编译器 B,控制器 C,输入设备 D,输出设备 解释:冯诺依曼由五个模块组成:输入设备 输出设备 存储器 控制器 运算器 故答案选择:A 2,假设有一个栈,元素依次进栈的顺序是A,B,C,D,E。下列不可能的出栈顺序是? A,EDCBA B,ABCDE C,BCDEA D,EABCD 解释:栈:先进后出 故答案选择:D 3,[多选]C语言中,static关键字说法正确的有? A,用static修饰的全局变量可以在运行时修改 B,用

beyond谚语的博客 634

系统引导程序 Boot Loader——学习笔记

(1) 8.8. 配置引导加载器(Bootloader) - Debian. https://www.debian.org/doc/manuals/debian-handbook/sect.config-bootloader.zh-cn.html.一般来说,引导加载程序需要支持多种文件系统,能够识别不同的操作系统,提供友好的用户界面,支持安全启动等功能。由操作系统的引导加载程序完成,它负责读取操作系统的核心文件,设置启动参数,创建启动菜单,或者链载另一个引导加载程序。区,并跳转到内核的入口,将系统。

usstmiracle的博客 2175

boot loader(grub) 的两个 stage

boot loader 的两个 stage 我们在第一小节启动流程的地方曾经讲过,在 BIOS 读完资讯后,接下来就是会到第一个启动装置的 MBR 去读取 boot loader 了。这个 boot loader 可以具有菜单功能、直接加载核心文件以及控制权移交的功能等,系统必须要有 loader 才有办法加载该操作系统的核心就是了。但是我们都知道, MBR 是整个硬盘的第一个 sector

wangzengdi的专栏 1013

深入解析TI Stellaris微控制器ROM Boot Loader与驱动库设计

在嵌入式系统开发中,Boot Loader是系统上电后执行的第一段代码,负责硬件初始化、应用程序加载与固件更新,其设计直接影响系统的启动可靠性与可维护性。其工作原理通常基于特定的硬件触发条件(如检查Flash特定地址内容)来决定启动路径,并通过串行通信协议与主机交互。这一机制的技术价值在于为资源受限的微控制器提供了可靠的、可远程操作的固件更新通道,是实现设备后期功能升级与故障修复的关键。在ARM Cortex-M内核的微控制器上,这种能力尤为重要。应用场景广泛覆盖物联网终端、工业控制、消费电子等需要现场升级

chuannaoxuan4674的博客 389

ARM9嵌入式Linux开发-嵌入式系统的Boot Loader技术

ARM9嵌入式系统学习

ce123的技术博客 896

嵌入式linux面试题解析(三)——Linux应用编程部分一

嵌入式linux面试题解析(三)——Linux应用编程部分一1、TCP与UDP的区别TCP:是面向连接的流传输控制协议,具有高可靠性,确保传输数据的正确性,有验证重发机制,不会出现丢失或乱序。UDP:是无连接的数据报服务,不对数据报进行检查与修改,无须等待对方的应答,会出现分组丢失、重复、乱序,但具有较好的实时性,UDP段结构比TCP的段结构简单,因此网络开销...

weixin_34334744的博客 796

STM32官方IAP升级Boot Loader演示项目实战

是指微控制器在正常运行过程中,由当前正在执行的应用程序主导完成对自身或其他应用区域固件的擦除与写入操作的技术。这与通过专用下载工具(如ST-Link)进行的ISP(In-System Programming)有本质区别:IAP是在用户程序控制下动态发生的,通常通过通信接口(如UART、USB、CAN等)接收新的固件镜像并写入Flash指定区域。在STM32平台上,IAP广泛应用于以下场景:远程固件升级(FOTA):设备部署在现场后,可通过串口、以太网或无线模块接收更新包,避免返厂刷机。

weixin_34547628的博客 1122

初学者如何理解和学习Boot Loader

学习Boot Loader不仅是理解计算机启动过程的关键,更是深入掌握计算机底层技术和系统开发的基础。通过理论学习、实践操作和项目开发,初学者可以逐步掌握Boot Loader的原理和实现方法,为日后更深入的系统开发和优化奠定坚实的基础。

weixin_43199439的博客 1255

【FPGA】AD9653设计和调试总结

基于FPGA的AD9653设计,设计思路,注意事项

weixin_41246509的博客 7586

labview设置工业摄像头外部触发

使用labview对海康MV-CA013-GM相机设置外部触发。 一、硬件部分 1、硬件引脚定义 2、触发模式设置 相机的触发模式分为两种,一种是内触发模式、另外一种是外触发模式。 3、接线图 信号线的地要跟给信号的设备共地。信号线给高电平时触发拍照。 二、软件部分 1、创建vision acquisition 2、选择使用的摄像头。 3、选择模式。 4、在Acquisition Control中设置这些选项。 5、设置保存图片路径 设置保存路径和保存图片的格式。点击完成即可 参考:https:/

qq_43493715的博客 5665

Boot Loader启动过程分析

一、    Boot Loader的概念和功能  1、嵌入式Linux软件结构与分布在一般情况下嵌入式Linux系统中的软件主要分为以下及部分: (1)引导加载程序:其中包括内部ROM中的固化启动代码和Boot Loader两部分。而这个内部固化ROM是厂家在芯片生产时候固化的,作用基本上是引导Boot Loader。有的芯片比较复杂,比如Omap3,他在flash中没有代码的时候有许多启动方

wxie的Linux人生 3381

蓝牙开发那些事之ceva controller代码解读

对比ceva的经典蓝牙和ble的controller在软件上的差异点

袁赟的博客 1089

嵌入式系统 第六讲 Boot Loader技术

任务1:基本的硬件设备初始化•屏蔽所有的中断(通过写CPU的中断屏幕寄存器或状态寄存器(如CPSR)来完成)• 设置CPU的速度和时钟频率• RAM初始化• 初始化LED(通过LED显示系统的状态是OK还是Error)– 任务2:为加载阶段2准备RAM(SDARM)空间• 阶段2加载到RAM中,通常准备1MB的RAM空间,放在整个RAM的最顶端,并且要 对这个1MB的空间进行测试复制阶段2的代码到RAM(SDRAM)• 阶段2的映像在Flash中的起始地址和终止地址•RAM空间的起始地址。

m0_74313796的博客 1870

从X86到ARM:将VINS-Fusion-GPU和ego-planner迁移到Jetson Orin-NX时,我踩过的那些‘环境差异’坑

本文详细介绍了将VINS-Fusion-GPU和ego-planner从X86平台迁移到Jetson Orin-NX(ARM架构)时遇到的环境差异问题及解决方案。内容涵盖ARM与X86的架构差异、依赖管理、性能调优和硬件接口适配,特别强调了CUDA在ARM平台上的优化配置和内存访问技巧,帮助开发者高效完成跨平台迁移。

weixin_42647395的博客 119

用pyqtgraph 和pyqt5绘制股票K线图

# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'QWidget_plot.ui' # # Created by: PyQt4 UI code generator 4.11.4 # # WARNING! All changes made in this file will be lost!...

qq_23114283的博客 5427

嵌入式系统中 Boot、Loader 及 Bootloader 的定义、区别与启动流程解析

Boot:是宏观的启动过程,包含从通电到系统就绪的所有步骤。Bootloader:是启动过程中的关键软件组件,位于最底层,负责初始化硬件并加载后续程序(如Loader或内核)。Loader:是Bootloader的“下游”组件,专注于加载特定程序(如内核)到内存,属于Boot过程中的一个环节。本文为个人学习笔记,内容仅供参考,若有疏漏恳请指正,相关风险还请自行留意。

weixin_47442083的博客 2742

ROS2+PYTHON VENV虚拟环境配置方法

ROS2+PYTHON VENV配置方法本篇针对的是python。

下雨夏云的博客 555

spring-boot-loader执行Jar文件原理

1.spring-boot-loader简介 ​ spring-boot-loader模块让你的springboot应用具备打包为可执行jar或war文件的能力。只需要引入Maven插件或者Gradle插件就可以自动生成。 2.spring-boot-loader的优势 ​ Java中并没有标准的方法加载嵌入式的jar文件,通常都是在一个jar文件中。这种情况下,如果你要通过命令行的形式发布一个没...

爱吃花生酱的猴子 6580

Python 爬虫实战:豆瓣 / IMDB 电影数据抓取(评分 + 剧情 + 演员阵容结构化处理)

在数据为王的时代,电影数据是进行市场分析、推荐系统构建和学术研究的重要资源。豆瓣和 IMDB 作为国内外最具影响力的电影评分和资讯网站,包含了海量高质量的电影数据。本文将带领你从零开始,构建一个健壮的 Python 爬虫,用于抓取豆瓣和 IMDB 的电影信息,并将其中的非结构化数据(如剧情简介、演员列表)进行清洗和结构化处理,最终存储到便于分析的结构化文件(如 CSV)中。

yansideyucsdn的博客 953

4、接收天线:接收电压、功率和传输系数

本文详细探讨了接收天线的性能参数,包括接收电压、功率和传输系数,通过建立等效电路模型分析接收偶极子的电流和开路电压,并定义电压和功率传输函数。研究揭示了天线长度、工作频率及极化失配对传输性能的影响,并提出了优化接收天线性能的策略,为天线系统的设计与优化提供了理论支持。

ll5678的博客 232

详解嵌入式系统Boot-Loader

上电之后(bootload阶段)该做什么 1、第一行程序 拿到空PCB板之后,硬件工程师首先会测试各主要线路是否通连,各焊点是否有空焊、断接或短路的情况,然后逐个模块焊接上去。之后需要验证系统上电之后,CPU与各组件的供电电压是否正常,供给CPU的震荡电路能否能够正常起振,外部存储器能否正常读写。当把我们的程序用JTAG工具下载到板子上后,在真正调试系统前需要做好以下检查: 利用调试工具,在程...

Leon的博客 1770

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux内核的启动boot loader原理

处理器首先执行ROMCode的代码,处理器中还有一部分存储空间即内部SRAM可以执行代码,但是SRAM通常都比较小,不能放下Linux内核的压缩image,这样就需要有个中间过渡的模块,该模块的主要功能是进行系统加载,叫做bootloader.。内核相关的初始化既要有体系结构相关的部分,又要有板级相关的部分。另外现在的处理器从内存解压比从外部存储读取速度快得多,所以通常在内存中解压启动也会快,这就需要Linux内核初始化的时候,能够将压缩的image进行解压,当然解压功能应该由Linux内核提供。

sinat_31608641的博客 909

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Boot Loader的实例有哪些

Boot Loader的实例有哪些

xie__jin__cheng的博客 819

Boot loader嵌入式系统的典型启动流程

上电 → 芯片硬件初始化 → 从系统存储器(0x1FFF0000)执行内置Bootloader → 等待主机通过UART/USB发送烧录指令。某些项目会在用户Flash中实现自己的Bootloader(如IAP升级程序),但这是可选的,且需主动跳转到APP。如果你的项目没有特殊需求(如IAP),烧录后设为BOOT0=0即可,芯片会直接从Flash运行你的代码。了Bootloader(如通过软件跳转),才会进入Bootloader逻辑。是可选功能,需自行实现,与芯片内置Bootloader无关。

weixin_48206394的博客 879

嵌入式系统Boot Loader技术内幕,带你完全了解Boot Loader

一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。 2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。 3. 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram disk 来作为 root fs。 4. 用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常...

AlpHaCracker的博客 843
上一篇: 胡乱宣扬
下一篇: 一些胡乱的想法
codeferever
博客等级 码龄17年 19粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值