嵌入式项目之mini2440系统制作烧写

article/2025/8/4 21:10:34

系统移植的必要性与组成  

在嵌入式开发中,**系统移植(Linux 系统定制)** 是常见的需求,主要原因在于:  
1. **官方镜像体积过大**:标准 Linux 发行版(如 Ubuntu)可能占用数 GB 存储,而嵌入式设备的 **Flash 存储容量有限**(如 256MB),因此需要裁剪和优化。  
2. **资源适配**:不同硬件(如 ARM 开发板)需要匹配专用的驱动和配置,直接使用通用镜像可能导致兼容性问题。  

操作系统的核心组成部分  
嵌入式 Linux 系统通常由以下部分构成,需按顺序烧录至开发板:  
1. 开机引导程序(Bootloader)
   - 例如 `U-Boot`(支持网络加载)、`vBoot`、`vivi`,负责初始化硬件并加载内核。  
2. 内核(Linux Kernel)
   - 裁剪后的核心,包含必要的驱动和进程管理功能。  
3. 文件系统(Root Filesystem)
   - 包含基础命令(如 `ls`、`cd`)和应用程序,通常通过 `BusyBox` 精简实现。  

企业开发中,工程师需根据硬件资源(如 Flash 大小、CPU 架构)定制这三部分,确保系统高效运行。

制作过程

制作u-boot

在网上下载好bootloader,Linux内核和busybox压缩包。并将其解压,首先先来制作u-boot,进入到bootloader中更改一个参数,vim /bootloader/u-boot/common/main.c  ,将bootdelay设置成时间长一点,相当于进入bios的时间,默认是0

设置好之后返回到u-boot页面,make mini2440_config , make  , 即可制作好u-boot。

Linux内核

解压之后进入 vim .config  里面内容=M,表示独立的块,要用的时候在用,y是直接编译到内核里面。使用 make menuconfig进入到类似BIOS页面,进入图形页面对内核进行配置。

 这边我只需要修改文件系统 Miscellaneous filesystems

cramfs(Compressed ROM file system support)选中按回车变成<*> 

 

保存之后退出,执行下面代码

cp /home/friendlyarm/bootloader/u-boot/tools/mkimage /binmake uImage ARCH=arm CROSS_COMPILE=arm-linux-

即可制作好uImage

根文件系统

构建嵌入式 Linux 文件系统的过程中,BusyBox 是核心组件之一,它提供了绝大多数常用的 Unix/Linux 命令,适用于资源受限的嵌入式系统。

文件系统主要依赖 BusyBox 来提供基础命令和工具。构建文件系统通常从创建一个空目录开始,用作根文件系统的基础结构。

mkdir rootfs

cd rootfs

进入到rootfs文件里面新建一般常用的Linux文件 

mkdir bin sbin etc lib proc sys usr dev tmp var mnt

到/dev目录下新建两个结点

mknod -m 666 console c 5 1
mknod -m 666 null c 3 1

然后切换到busybox文件里面 , 使用menuconfig图形页面配置文件,配置完之后使用make make install 。这时候rootfs中的bin就含许多可执行的命令比如ls kill等。解压之前准备好的etc压缩包到rootfs/etc文件下,这时候自己制作的文件系统中就含有脚本文件。最后使用mkcramfs进行压缩。

./mkcramfs rootfs/ rootfs.img

这里创建的文件系统是只读的。

这样就做好了三个需要烧写的镜像u-boot.bin rootfs-img uImage

烧入嵌入式开发板上

在嵌入式系统烧录过程中,第一步通常是通过 MiniTools 工具将 u-boot.bin(引导加载程序)烧入开发板的 Flash。该版本的 U-Boot 支持 UDP TFTP 协议,便于后续通过网络将 Linux 内核和根文件系统下载到板子上。

烧写完成后,开发板上电启动后会运行 U-Boot,此时可以通过串口或网络命令,从主机 TFTP 服务器下载 uImage(内核镜像)和根文件系统(如 rootfs.cpiorootfs.ext4),并将它们加载到内存中,接着启动内核。

这种方式适用于开发调试阶段,速度快、无需每次烧录 Flash,同时也方便系统升级和调试内核或文件系统问题。

这里选择Linux,然后只需要烧入第一行文件,也就是u-boot,其余不用,可以点上格式化flash.

 烧入完u-boot之后就可以进入uboot模式,在uboot模式下我们需要配置IP地址,这时候开发板上的IP要和电脑 的IP在一个局域网内,

setenv ipaddr xx.xx.xx.xxx
setenv serverip xx.xx.xx.xxx
saveenv

保存,这时候使用printenv可以查看到改变的环境变量

设置完IP之后就可以ping通主机电脑(这里在ping的时候要记得将电脑的防火墙关闭)。便可以通过tftp下载uImage和rootfs.img。

下载内核文件和根文件系统通常需要三步骤

1、下载:tftp 0x30000000 192.168.1.100:uImage

        从192.168.1.100目录下下载uImage到norflash 0x30000000内存地址上。

2、擦除:nand erase 0x00060000 0x00500000

        在nandflash从0x00060000地址开始向后擦除0x00500000个字节。

3、写入:nand write 0x30000000 0x00060000 0x00500000

      从norflash 0x30000000内存地址写到nandflash地址0x00060000,大小0x00500000。

按照同样的操作继续将rootfs.img烧写到开发板上,之后需要进行环境变量的配置。

1、setenv bootcmd 'nboot 0x30008000 0 0x00060000;bootm 0x30008040'

uboot起来之后去哪找根文件系统和uimage

2、setenv bootargs console=ttySAC0 noinitrd root=/dev/mtdblock3 init=/linuxrc rootfstype= cramfs(文件系统模型)

然后saveenv,保存完之后reset重启一下,烧入完成,可以使用。

当前使用的根文件系统格式为 cramfs(Compressed ROM File System),这是一种只读文件系统。因此,如果希望在系统中运行自己的程序或脚本,需要事先将它们打包进根文件系统中,例如放在 /home 目录下。

虽然 cramfs 是只读的,但在系统启动后,某些目录(如 /dev)是以可写方式挂载的(通常通过内存虚拟文件系统如 tmpfs 实现)。因此,在系统运行过程中,可以进入 /dev 目录临时使用 tftp 命令从主机下载测试用的可执行文件,并在该目录下进行调试。

⚠️ 需要注意的是:这些通过 /dev 或其他临时目录下载或创建的文件 在系统重启后都会被清除,因为它们位于内存文件系统中。
因此,这种方式仅适用于临时测试和调试。如果希望这些文件在每次启动后依然保留,应在制作根文件系统镜像(如 cramfs)时,将所需可执行文件和资源直接打包进 /home 或其他目录中。


http://www.hkcw.cn/article/rgQdWwMoex.shtml

相关文章

OpenShift AI - 启用过时版本的 Notebook 镜像

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.18 OpenShift AI 2.19 的环境中验证 文章目录 查看可用 Notebook 镜像控制台查看命令行查看 Notebook 镜像和 Image Stream 对应关系启用老版本的 Notebook 镜像参考 查看可用 Notebook 镜…

“人单酬“理念:财税行业的自我驱动革命

引言&#xff1a;当薪酬不再是"固定数字"&#xff0c;而是"成长标尺" "为什么有人拼命工作却收入停滞&#xff1f;为什么企业总在人才流失中挣扎&#xff1f;"这些问题背后&#xff0c;往往隐藏着传统薪酬体系的僵化。而"人单酬"&…

yolo目标检测助手:具有模型预测、图像标注功能

在人工智能浪潮席卷各行各业的今天&#xff0c;计算机视觉模型&#xff08;如 YOLO&#xff09;已成为目标检测领域的标杆。然而&#xff0c;模型的强大能力需要直观的界面和便捷的工具才能充分发挥其演示、验证与迭代优化的价值。为此&#xff0c;我开发了一款基于 WPF 的桌面…

Spring Ai 从Demo到搭建套壳项目(一)初识与实现与deepseek对话模式

前言 为什么说Java长青&#xff0c;主要是因为其生态圈完善&#xff0c;Spring又做了一款脚手架&#xff0c;把对接各个LLM厂商的sdk做了一遍&#xff0c;形成一系列的spring-ai-starter-** 的依赖。 目前为止版本去到1.0.0.M6&#xff0c;golang跟不上了吧&#xff0c; Make …

机器学习实验七--SVM垃圾邮件分类器

SVM垃圾邮件分类器 一、什么是SVM二、实例&#xff1a;垃圾邮件分类器1.实验要求2.原理解释2.1 数据预处理流程2.2 特征提取方法2.3 SVM分类器 3.代码实现4.实验结果5.实验总结 一、什么是SVM 支持向量机(Support Vector Machine, SVM)是一种监督学习算法&#xff0c;主要用于…

lidar和imu的标定(一)Robust Real-time LiDAR-inertial Initialization

一、Robust Real-time LiDAR-inertial Initialization 看了这篇文章。在方法中&#xff0c;A和B都不细看了。主要看后边的几个部分。 C. LiDAR-inertial Initialization 在这一部分中&#xff0c; 1) Data Preprocess:主要是准备数据。 1.雷达里程计之后&#xff0c;可以得…

【手写系列】手写线程池

PS&#xff1a;本文的线程池为演示 Demo&#xff0c;皆在理解线程池的工作原理&#xff0c;并没有解决线程安全问题。 最简单一版的线程池 public class MyThreadPool {// 存放线程&#xff0c;复用已创建的线程List<Thread> threadList new ArrayList<>();publ…

Git企业级项目管理实战

目录 1. 准备工作 2. 添加成员 2.1 添加企业成员 2.2 添加项目成员 2.3 添加仓库开发人员 3. 开发场景 - 基于git flow模型的实践 3.1 新需求加入 3.2 修复测试环境 Bug 3.3 修改预发布环境Bug 3.4 修改正式环境 Bug 3.5 紧急修复正式环境 Bug 4. 拓展阅读 4.1 其…

go环境配置

下载对应版本的 go 版本 https://go.dev/dl/ 配置 vim ~/.zshrc export GOROOT/usr/local/go export PATH$PATH:$GOROOT/binsource ~/.zshrc >>>>>> go versiongoland 配置&#xff1a; &#x1f50d; 一、什么是GOPATH&#xff1f; GOPATH 是旧的项目结…

MySql(十二)

目录 MySql约束 1.添加主键约束 语法格式 1&#xff09;创建一个带主键的表 查看表结构 2&#xff09;创建表的时候指定主键名称 查看表结构 3&#xff09;创建一个表然后&#xff0c;然后再使用alter为列添加主键 查看表结构 4&#xff09;为表添加数据 1---正常数据 2---主键…

chrome.runtime.sendMessage 和 new FormData()

chrome.runtime.sendMessage 是Chrome扩展程序API中的一个方法&#xff0c;可用于背景脚本和内容脚本之间的消息传递。 new FormData() 提供了一种方便的方式来构建表单数据集。 在Chrome插件中&#xff0c;在 background.js 和 content.js 进行通信时使用了使用new FormData()…

数据结构-排序-排序的七种算法(2)

一&#xff0c;七种算法的介绍和比较 二&#xff0c;冒泡排序 原理&#xff1a;重复遍历列表&#xff0c;比较相邻元素&#xff0c;如果顺序错误就交换它们 时间复杂度&#xff1a; 最好&#xff1a;O(n)&#xff08;已有序时&#xff09; 平均&#xff1a;O(n) 最坏&#x…

【目标检测】backbone究竟有何关键作用?

backbone的核心在于能为检测提供若干种感受野大小和中心步长的组合&#xff0c;以满足对不同尺度和类别的目标检测。

JAVA实战开源项目:精简博客系统 (Vue+SpringBoot) 附源码

本文项目编号 T 215 &#xff0c;文末自助获取源码 \color{red}{T215&#xff0c;文末自助获取源码} T215&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

IO流1——体系介绍和字节输出流

什么是io流 io流分类 纯文本文件&#xff1a; windows自带的记事本打开能读懂的 经验证&#xff1a; word&#xff0c;excel不是&#xff0c; txt, md的是纯文本文件 &#xff01;&#xff01;&#xff01;&#xff01; 字节输出流 io流体系 抽象类不能直接创建他们的对象…

告别复杂操作!电脑极简风格计时使用

无论是工作、学习还是日常生活&#xff0c;这款小巧实用的计时工具都能成为你掌控时间的好帮手。特别适合需要频繁切换正计时、倒计时和查看当前时间的场景。界面简洁&#xff0c;操作便捷&#xff0c;助你高效管理每一刻。 这是一款免安装的工具&#xff0c;下载后可直接打开…

湖北理元理律师事务所:个人债务管理的温度与精度

湖北理元理律师事务所&#xff1a;个人债务管理的温度与精度 面对信用卡、网贷、医疗债等多重债务压力&#xff0c;普通人常陷入“拆东墙补西墙”的恶性循环。湖北理元理律师事务所通过计划集团公司服务平台&#xff0c;推出“有温度的债务优化计划”&#xff0c;其人性化设计…

启动你的RocketMQ之旅(七)-Store存储原理

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final。 &#x1f4dd;个人主页&#xff1a; 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;java专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一…

无标注数据如何提升LLM推理能力?熵最小化 提升LLM自信度

熵最小化 提升LLM自信度 ——熵最小化(Entropy Minimization,EM),如何在不使用任何标注数据的情况下,提升大语言模型(LLMs)在数学、物理和编程等复杂推理任务上的表现。 1. 什么是熵最小化? 熵在机器学习中衡量模型输出的不确定性。熵越小,模型对输出越“自信”(概率…

[yolov11改进系列]基于yolov11引入多尺度空洞注意力MSDA的python源码+训练源码

【MSDA介绍】 本文提出了一种新颖的多尺度空洞 Transformer&#xff0c;简称DilateFormer&#xff0c;以用于视觉识别任务。原有的 ViT 模型在计算复杂性和感受野大小之间的权衡上存在矛盾。众所周知&#xff0c;ViT 模型使用全局注意力机制&#xff0c;能够在任意图像块之间建…