首页 > 其他分享 >嵌入式系统开发笔记

嵌入式系统开发笔记

时间:2024-01-20 14:31:40浏览次数:27  
标签:uboot boot 笔记 嵌入式 编译 开发 linux main 下载

嵌入式概念:

是应用为中心,以计算机技术为基础,软硬件可裁剪,对功耗、体积、可靠性、成本都有严格要求的专用计算机系统。

内存寻址

  • 独立寻址:片内片外存储器只能选择其中一个(芯片内部有标志引脚,使用高低电平来表示读取片内或者片外)
  • 统一寻址:片内片外存储器都能使用,且使用的是同一片连续的寻址空间。

软件怎么访问硬件设备

  1. 软件==》 内存 ==》 内存映射 ==》 硬件控制寄存器 ==》 硬件
  2. 怎么直接通过内存地址实现对串口(uart)数据的发送
  • 通过原理图结合开发板找到与PC相连的串口uart0
  • 通过数据手册查找uart0的发送数据寄存器地址映射到了内存什么地址
  • 发送数据地址为:0xc00a1020
  • 向0xc00a1020写入数据完成发送,数据值最好大于32(空格),小于32也可以发送,只是不可见
  • mw 0xc00a1020 0x41(A)

裸机开发的基本特点

  • 没有操作系统(Linux)
  • 不使用带有系统调用的标准C库
  • 大量使用物理内存地址进行数据操作
  • 如果要用到库函数,需要自己去实现
  • 将编译和链接分步骤完成,实现对可执行程序的指定链接,并指定连接地址
  • Linux 操作系统一般支持可执行文件格式elf,在裸机环境下不好使
  • 需要将elf格式裁剪成纯净的二进制可执行文件
  • 将纯二进制文件下载到链接时指定的物理内存空间,修改PC指向开始执行

程序的编译链接过程分解

  • gcc -o main main.c 可以分解成以下步骤(可执行程序main的隐藏后缀是 .elf)
  • gcc -E -o main.i main.c
  • gcc -S -o main.S main.i
  • gcc -c -o main.o main.S
  • gcc -o main.elf main.o

安装交叉编译器

裸机代码编译流程

只编译不链接:arm-linux-gcc -c -o t.o t.c

链接并指定地址:arm-linux-ld -o t t.o -Ttext=0x48000000

链接并指定地址(修改程序入口函数):arm-linux-ld -o t t.o -Ttext=0x48000000 -e main

Boot 概念

启动引导,自举程序

由于boot设计比较偏底层,所以根据CPU架构和OS类型可能有所不同

uboot是对CPU架构和OS类型支持得比较多的一种开源引导程序

s5p6818启动流程

  • 芯片最初是从iROM启动,叫BL0
  • iROM选择启动的下一阶段引导程序BL1
  • 单阶段启动:如果BL1可以完成内核加载,这就是单阶段启动
  • 多阶段启动:启动加载内核的工作由BL2之后的程序完成,这就是多阶段启动
  • 为什么BL1不直接加载到DDR
  • SRAM比DDR更快
  • DDR需要初始化,而SRAM不需要(总线结果不需要初始化,直接拿来就能使用)

BL1启动Bootloader第二阶段BL2

BL2启动内核

内核加载根文件系统

引导传参

  • 所传数据结构必须约定一致
  • 引导程序与内核之间必须约定一个参数存放的地址DDR Base+0x100(0x400000100)
  • 数据格式约定一致
  • 比如用户传给内核的参数:
  • bootargs root=/dev/mmcblk0p8 rw rootfstype=ext4 init=/linuxrc lcd=wy070ml tp=gslx680

uboot介绍

  • u-boot最初是由PPCBoot发展而来的
  • u-boot已经成为当前主流引导程序
  • 官方引导程序由于与硬件平台差异,所以并不能下载直接运行(需要经过调试和修改及移植)
  • 编译uboot
  • 源码获取:
  • 下载地址:http://git.denx.de/?p=u-boot.git;a=summary
  • 从芯片原厂获取配套的BSP

配置编译uboot

  • 进入uboot源码目录:cd u-boot
  • 清除编译痕迹(只是第一次做):make distclean
  • 编译前配置成目标平台:make 6818_config
  • 编译源码:make
  • 编译完成后在源码根目录下会生成镜像:ubootpak.bin

镜像烧录

  • 找到官方提供的标准镜像
  • boot.img
  • gtkfs.img
  • ubootpak.bin
  • 开发板开机进入uboot命令行模式
  • 执行下载命令:fastboot
  • 插入miniUSB下载线
  • 如果打开了虚拟机,要确认USB连接到物理主机
  • 在PC设备管理可以发现Android device并确认是否安装驱动
  • 未安装驱动则需要重新安装,安装完驱动后重新插拔USB线
  • 修改下载脚本文件
  • REM表示注释一行
  • 下载uboot:fastboot flash ubootpak ../linux_image/ubootpak.bin
  • 下载内核:fastboot flash boot ../linux_image/boot.img
  • 下载根文件系统:flash gtkfs ../linux_image/gtkfs.img
  • 可写脚本完成三步下载
  • 下载完成,开发板提示: Flash : ubootpak - DONE
  • 下载完成后,Ctrl+C退回到命令行,获直接重启开发板即可


标签:uboot,boot,笔记,嵌入式,编译,开发,linux,main,下载
From: https://blog.51cto.com/u_16443180/9345617

相关文章

  • 二项式反演学习笔记
    前置知识二项式定理:\((a+b)^n=\sum_{i=0}^n\binom{n}{i}a^ib^{n-i}\)。二项式反演反演公式1:\[f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\iffg(n)=\sum_{i=0}^n(-1)^{n-i}\binom{n}{i}f(i)\]证明:\[\begin{aligned}\sum_{i=0}^n(-1)^{n-i}\binom{n}{i}f(i)&=\sum_{i=0......
  • 积性函数学习笔记
    积性函数定义积性函数:\(f(x)\)满足\(\forall\gcd(a,b)=1,f(ab)=f(a)f(b)\)若没有\(\gcd(a,b)=1\)的性质,则为完全积性函数。性质性质1:\(f(x),g(x)\)是积性函数\(\implies\)\(f\timesg\)是积性函数,\(f\divg\)是积性函数证明略。性质2:狄利克雷(Dirichlet)卷积\(......
  • 欧拉定理学习笔记
    费马小定理\(a,p\in\mathbb{Z_+}\),\(p\)为质数,\(\gcd(a,p)=1\)。定理:\(a^{p-1}\equiv1\pmodp\)。证明:考虑下面两个整数集合:\[A=\{x\in\mathbb{Z_+}|1\lex<p\}\]\[B=\{y\in\mathbb{Z_+}|y=ax,x\inA\}\]\(A\)中很明显每个数对\(p\)取余各不相同......
  • 莫比乌斯反演学习笔记
    前置知识狄利克雷卷积:\(f*g=\sum_{d|n}f(d)g(\frac{n}{d})\)。积性函数,线性筛。数论分块。单位函数:\(\varepsilon(n)=[n=1]\)。(积性函数)常数函数:\(1(n)=1\)。(积性函数)莫比乌斯函数引理1:\(f(n)\)是积性函数等价于\(g(n)=\sum_{d|n}f(d)\)是积性函数。证明:显然,\(g=......
  • 容斥学习笔记
    目录容斥原理Min-Max容斥广义容斥原理容斥原理原理:\[|\bigcup_{i=1}^nA_i|=\sum_{j=1}^n(-1)^{j-1}\sum_{a_k\not=a_{k+1}}\bigcap_{l=1}^mA_{a_i}\]这东西学过小学奥数就会了。一些有用的结论:\[|\bigcap_{i=1}^nA_i|=|\Omega|-|\bigcup_{i=1}^n\overline{A_i......
  • 杜教筛学习笔记
    原理前置知识:积性函数,狄利克雷卷积。杜教筛可以在亚线性的时间内算出某些函数的前缀和。假设我们要算出函数\(f\)的前缀和,我们要找到函数\(g\),记\(f*g=h\)。杜教筛的前提是\(g\)的前缀和与\(h\)的前缀和都可以快速计算,我们可以快速计算\(f\)的前缀和。首先,我们考......
  • PHP学习第七天:框架开发与自动化工具
    在PHP学习的第七天,我深入了解了框架开发和自动化工具的使用。早上,我学习了如何使用PHP框架来加速Web应用程序的开发。PHP框架提供了一套预先构建的组件和工具,可以简化开发过程并提高应用程序的可靠性。我学习了Laravel和Symfony这两个流行的PHP框架,并了解了它们的核心概念和特性。......
  • 开发生态圈总结
    1:后端:1)java:后台、大数据开发,资料丰富、需求大、生态圈丰富2)C++:相对底层语言,性能高,游戏开发,大部分业务公司用不到;系统开发3)PHP:4)Go5)Python:动态类型语言,易学习6)NodeJS 2:前端web:html、css、javascript(动态类型)框架:1)Angular:Angular最初是由Google工程师MiskoHevery......
  • ai 开发
     开发步骤总览选择与训练模型Caffe:由BerkeleyVisionandLearningCenter开发,以速度和效率见长,特别适合计算机视觉任务。其模型定义采用配置文件(.prototxt),权重存储在二进制文件(.caffemodel)中。PyTorch:由FacebookAIResearch开发,以其动态计算图和易读的PythonicAPI......
  • Linux操作系统简介:为何成为全球开发者热门选择?
    Linux是一种自由和开放源代码的操作系统。这意味着任何人都可以查看、修改和分发Linux的源代码,而不需要支付任何费用。这种开放性使得Linux能够快速地发展和进步,吸引了全球数以万计的开发者共同参与其中,形成了一个庞大的开源社区。那么,Linux究竟是什么?它又是如何影响我们的生活的......