ARM嵌入式开发——基础概念

简介: ARM嵌入式开发——基础概念

文章目录

嵌入式Linux系统组成

嵌入式Linux系统的启动流程

uboot制作

uboot特点

uboot三大功能

硬件初始化功能

引导加载内核

为内核传递启动参数

uboot源码操作


嵌入式Linux系统组成

  • 嵌入式Linux系统软件由三部分组成:

  • BootLoader(uboot)裸板软件,初始化硬件+从闪存加载内核到内存并且启动内核+给内核传递启动参数,告诉内核根文件系统rootfs在什么地方。(上电运行,内核启动后结束)
  • Linux内核(kernel):Linux系统7大功能,管理进程、管理内存、文件系统、设备控制、网络管理。掉电结束。
  • 根文件系统(rootfs):
  • bin:各种命令。
  • sbin:各种超级用户的命令。
  • lib:标准系统库。
  • etc:各种服务的配置(tftpd-hpa,nfs)
  • dev:存放设备文件
  • sys:存放虚拟文件系统sysfs相关内容
  • proc:存放虚拟文件系统procfs相关内容
  • usr:存放其他命令

嵌入式Linux系统的启动流程

  1. 上电CPU运行uboot
  2. uboot根据bootcmd加载启动内核并且通过bootargs给系统传递参数。
  3. 内核启动,完成7大功能。
  4. 内核最后根据uboot传递的bootargs到某个地方找到根文件系统rootfs
  5. 一旦找到根文件系统rootfs,控制权交给根文件系统。
  6. 内核会运行第一号进程/sbin/init
  7. /sbin/init穿件子进程,子进程执行/bin/sh
  8. shell程序启动,用户即可输入各种Linux命令。

uboot制作

uboot特点

uboot是一款著名的开源软件,德国的denx开发小组维护。

uboot支持多种处理器架构(x86、ARM、PowerPC、MIPS、FPGA、dsp)

uboot支持多种多样的硬件开发板

uboot支持引导多种操作系统(Linux、VxWorks)

uboot支持多种多样的文件系统格式(ext4、ext2、fat32)

uboot支持多种多样的硬件外设的设备驱动(应哦按驱动,SD卡驱动等)

uboot本质就是一个裸板程序,知识这个裸板程序很复杂。

uboot上电执行,内核启动结束uboot运行。


uboot三大功能

硬件初始化功能

必要的硬件初始化


  • 初始化CPU的cache(缓存)
  • 初始化始终(CPU主频,UART时钟等等)
  • 初始化内存
  • 初始化闪存
  • 初始化UART(调试串口)
  • 初始化网卡(下载使用)
  • 关闭中断(避免嵌入式Linux系统启动时被打断,造成系统启动时间加长,等系统正式启动完毕再处理中断)
  • 关闭看门狗(避免嵌入式Linux系统启动时看门狗给CPU发送复位信号,等待系统正式启动完毕再开启看门狗)

可选硬件初始化:


  • 由于内核启动,uboot的生命周期就要结束,并且uboot之前所做的硬件初始化工作无效(内核重新硬件初始化),没有必要在uboot中做大量的硬件初始化代码,如果做了会影响系统的启动时间,所以uboot有些外设是否初始化完全根据用户需求来定。

引导加载内核

setenv bootcmd mmc read A B C\; bootm A

从EMMC的B开始读C这么多的数据到内存的A,并且从A启动内核。

setenv bootcmd tftp A uImage \; bootm A

从上位机下载内核到内存的A,并且从A启动内核


为内核传递启动参数

setenv bootargs root=/dev/mmcblk0p2 ....

告诉内核rootfs在EMMC的第三个分区。

setenv bootargs root=/dev/nfs ...

告诉内核rootfs在上位机,利用NFS网络服务找到文件系统启动。


uboot源码操作


  • uboot.bin二进制文件肯定是由uboot源码编译生成。
  • uboot源码一定要从芯片厂家或者开发板的厂家来获取,由于每板子的外围布线不一样,所以虽然很多板子使用的CPU芯片一直,但是外围设备不一样,所以官方的uboot源码仅仅支持官方的参考板子,并不会每种板子都支持。所以如果将来出现硬件差异,需要对官方的uboot源码进行针对性修改。当然,板子如果是从厂家购买的,那么厂家肯定有针对的uboot修改好的源码。
  • 获取正确的交叉编译器,交叉编译器的版本要和uboot源码的版本相配合,如果不匹配则会发生编译报错。
  • 验证官方uboot源码的正确性。
  • uboot源码操作三部曲:
  • make distclean
  • make ABC_config
  • make

相关文章
|
2月前
|
算法 编译器 Linux
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
18 0
|
29天前
|
安全 Unix Linux
【ARM】在NUC977上搭建基于boa的嵌入式web服务器
【ARM】在NUC977上搭建基于boa的嵌入式web服务器
|
2月前
|
物联网 编译器 测试技术
【嵌入式 交叉编译器】如何在 ARM 架构下选择和使用高版本交叉编译器
【嵌入式 交叉编译器】如何在 ARM 架构下选择和使用高版本交叉编译器
207 7
|
2月前
|
存储 机器学习/深度学习 人工智能
嵌入式中一文搞懂ARM处理器架构
嵌入式中一文搞懂ARM处理器架构
38 1
|
4月前
|
存储 Ubuntu Linux
ARM-Linux开发与MCU开发的不同之处分析
ARM-Linux开发与MCU开发的不同之处分析
22 0
ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)
ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)
312 0
|
8月前
|
Linux C++
基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号
基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号
80 0
|
8月前
|
芯片
基于友善之臂ARM-ContexA9-ADC驱动开发
基于友善之臂ARM-ContexA9-ADC驱动开发
40 0
|
8月前
|
缓存 C++
基于ARM-contexA9-蜂鸣器pwm驱动开发
基于ARM-contexA9-蜂鸣器pwm驱动开发
53 0
|
8月前
基于ARM-contexA9蜂鸣器驱动开发
基于ARM-contexA9蜂鸣器驱动开发
43 0