嵌入式linux开发01-uboot,kernel,roottfs

前言

本文主要基于正点原子的阿尔法开发板进行说明。笔者采用的alpha底板+8G emmc核心板+ATK4384(800*480)电容触摸屏。
开发板资源如下图所示。

本篇主要理清楚嵌入式linux开发,移植linux系统的时候,具体需要做哪些移植工作,这些移植工作之间的联系是什么。先对linux开发的移植过程有一个总的映像。站在一个高的层面了解移植的整个过程。

笔者目前正在跟随《【正点原子】I.mx6U嵌入式linux驱动开发指南1.6.pdf》这本书,结合alpha开发板,学习linux驱动开发。目前已经跟着这本书完成驱动开发前的所有内容。现根据学习的过程,对嵌入式linux系统移植做一个简单的整理。

linux移植的几个部分

纵观这几周的学习过程,拿到一块新的arm linux板子,一般需要进行如下3部分工作的移植

1.U-boot移植
2.linux 内核移植
3.roottfs根文件系统移植

先不看这三个玩意到底是啥。先回顾下单片机的开发过程,笔者之前主要从事的是单片机相关下位机开发,比较常用的有stm32单片机。stm32用的实际上也是arm内核,只不过是缺少内存管理mmu单元,故一般不能运行linux等操作系统。既然同样都是arm系列的内核,那说明stm32等单片机与arm linux开发应该有相似之处。

一般stm32比较初级的开发流程为。
1.keil中新建工程
2.编写main.c gpio.c uart.c
3. 然后编译下载,采用jtag jlink等工具连接单片机的编程口,进行代码下载。
4. 重启上电运行。
通过这几部一个简单的单片机程序就可以运行起来了。

以上便是开发stm32的大致过程,当开发的产品要量产的时候,以及应对后续要更新固件的时候。上述过程,就明显不太合适了,总不能发个程序给客户,让客户在自己电脑上用keil编译,然后用jlink烧录吧。如果这样,客户只会原理你,最好你的产品能自动升级,或者通过u盘,sd卡等设备升级。

所以当碰到需要固件升级的时候,上述过程满足不了产品的需求。那怎么实现自动或者u盘升级呢。

最好要的方式就是将单片机的flash进行分区。比如分两个区域,每个区域都是可执行程序,并且这两个程序能互相跳转。
嵌入式linux开发01-uboot,kernel,roottfs_第1张图片
如上图所示,一开始上电,直接运行分区1程序,程序会读取服务器或者读取upan上的指定bin文件,如果读取到了bin文件件,则将bin文件按字节写入分区2。写完成后,根据事先定义的分区2主函数main的地址,进行跳转到分区2执行程序。分区2便是最终为用户提供功能的程序。

在这里分区1程序的作用主要是管理固件升级。分区2为用户程序区。分区1和2一般分别叫做,BootLoader 和 app区。这里出现了boot 再看看上面移植linux时需要移植u-boot,都有boot,那是不是这二者功能类似?这里先不急着下结论,我们继续沿着stm开发的过程往下看。

当我们需要做一个比较大系统,里面要用网络 ,蓝牙,can,后台等等功能时,如果这是还是只有一个软件工程师来开发这个程序,那必然会造成时间风险不可控。最好就是几个工程师能分工,共同来完成这一整个大的系统。比如A负责蓝牙,B负责wifi等等。如果按照上文的开发流程会面对一个问题。那怎么整合这么多工程师的代码呢?我写完代码怎么只测试自己的代码而不影响别人呢。怎么保证对实时性要求高的部分代码能够以高优先及运行呢?

当单片机开发的组件越来越多时,采用上述的裸机开发十分不方便管理、调试等等。所以开发单片机最终肯定是要用上操作系统的。比如freertos ucos等。这些操作系统的出现,上述头痛的问题就迎刃而解,操作系统提供有限级调度,可设置同任务的优先级,确保实时性要求高的任务能够得到运行。有了操作系统后,A工程师就是用开发 蓝牙任务,B就只用负责wifi任务,最后管理的时候,只要main函数中创建蓝牙任务,wifi任务,系统便能运行,调试的时候,A只用创建蓝牙任务运行,B只用创建wifi任务运行。

嵌入式单片机开发高阶阶段都要用到操作系统,进行协同开发。等等,这里出现了操作系统,linux开发中也要一直linux内核系统。

看到这里,在单片机高阶开发中我们会用到。BootLoader Rtos操作系统。嵌入式linux开发中要移植u-boot,linux内核,根文件系统。根文件系统暂时放一放。

单片机 嵌入式linux 说明
BootLoader u-boot 配置、升级、启动操作系统
freertos linux内核 提供调度,任务优先级等功能,便于开发

单片机开发VS嵌入式linux开发过程如上表所示,二者具有较强的相关性。最终在存储器中,都会进行分区,都是有多段程序运行。u-boot通过初步学习可以知道,其与BootLoader比较类似,都是为操作系统的运行做一些准备工作。单片机中用到实时操作系统与linux内核都是操作系统, 提供相似的服务,知识运行的硬件平台不一样。通过这样的对比分析,只要有单片机的开发经验就比较能初步容易理解u-boot 和linux内核。

现在再来说说roottfs根文件系统。简单理解就是某个格式的文件来赖以生存的系统。比如windows中常见的fat32,NTFS系统。linux中常见ext4,ext3,这些都是文件系统。一旦接触过linux,肯定有一句话是大家都听过的。在linux中,一切皆文件,就是说linux把所有的东西都看作文件。

linux kernel只是运行linux的核心,并不包含文件系统。所以要想linux能够正常运行,就需要提供文件系统,让其能够基于文件来执行各种命令。这便是根文件系统的作用。

以上结合单片机的开发过程,类比理解了下linux开发过程需要移植的组件。归纳一下。

拿到一块arm 主板,需要进行 u-boot ,linux 内核,根文件系统等三个组件移植。移植就是让这三个组件能够识别arm主板,从而能调用板子上的硬件资源来进行各项功能开发。

你可能感兴趣的:(arm-linux开发,linux,单片机,stm32,嵌入式,arm)