微操控器制造商的开发板,以及他们与开发板一同供给的软件项目例程,在工程师着手一个新规划时能够供给很大协助。但在规划项目完结其前期阶段后,进一步规划时,制造商供给的软件也或许会导致一些问题。
运用实时操作体系作为运用程序代码渠道的规划还面临着许多应战,比方怎么将功用分配给不同的并行使命、怎么规划高牢靠的进程间通讯、以及怎么在硬件上测验整个软件包等问题。
越来越多的OEM厂商发现,防止上述两个问题的最好办法,是运用依据开源、经过验证、可扩展、可运转在不同硬件渠道的操作体系Linux开端新的规划。就现已被移植到各种计算机硬件渠道的操作体系的数量来说,Linux名列前茅。Linux的衍生版别已运转在十分广泛的嵌入式体系中,包含:网络路由器、移动电话、修建主动化操控、电视机和视频游戏操控台。
尽管Linux被成功运用,但并不意味着它很简略运用。Linux包含的代码超越一百万行,其运作带有明显的Linux办法论滋味,初学者或许难以敏捷把握。
因而,本文的宗旨是为运用Linux的嵌入式操作体系版别——μClinux,开端一个新的规划项目,该攻略共分为五个进程。为了阐明该攻略,本文介绍了介意法半导体的STM32F429微操控器(ARMCortex-M4内核,最高180MHz)上的一个μClinux项目完结,运用了Emcraft 的STM32F429DiscoveryLinux板支撑包(BSP)。
进程1:Linux东西和项目布局
每个嵌入式软件规划都从挑选适宜的东西开端。
东西链是一组衔接(或链接)在一同的软件开发东西,它包含比如GNU编译器调集(GCC)、binutils(一组包含衔接器、汇编器和其它用于方针文件和档案东西的开发东西)和glibc(供给体系调用和根本函数的C函数库)等组件;在某些情况下,还或许包含编译器和调试器等其它东西。
用于嵌入式开发的东西链是一个穿插东西链,更常见的叫法是穿插编译器。
GNUBinutils是嵌入式Linux东西链的第一个组件。GNUBinutils包含两款重要东西:
●“as”,汇编器,将汇编代码(GCC所生成)转换成二进制代码
●“ld”,衔接器,将离散方针代码段衔接到库或构成可履行文件
编译器是东西链的第二个重要组成部分。在嵌入式Linux,它被称为GCC,支撑许多种微操控器和处理器架构。
接下来是C函数库。它完结Linux的传统POSIX运用编程接口(API),该API可被用来开发用户空间运用。它经过体系调用与内核对接,并供给高阶服务。
工程师有几种C函数库挑选:
●glibc是开源GNU项目供给的可用C函数库。该库是全功用、可移植的,它契合Linux规范。
●嵌入式GLIBC(EGLIBC)是一款针对嵌入式体系优化的衍生版。其代码是精简的,支撑穿插编译和穿插测验,其源代码和二进制代码与GLIBC的兼容。
●uClibc是另一款C函数库,可在闪存空间有限、和/或内存占用有必要最小的情况下运用。
调试器一般也是东西链的一部分,由于在方针机上调试运用程序运转时,需求一个穿插调试器。在嵌入式Linux范畴,GDB是常用调试器。
上述东西是如此地不可或缺,但当它们各自为战时,会花太长时刻来编译Linux源代码并将其整组成终究映像(image)。走运的是,Buildroot(主动生成穿插编译东西的东西)会主动完结构建一个完好嵌入式体系的进程,并经过发生下述任一或一切使命,简化了穿插编译:
●穿插编译东西链
●根文件体系
●内核映像
●引导映像
对嵌入式体系规划师来说,还能够方便地运用一种东西(utility)聚合东西,如BusyBox,这种东西将一般最需求的东西整合在一同。依据 BusyBox的信息页面介绍,“它将许多常用UNIX东西的微型版别整组成一个小的可履行文件。它供给了对大多数你一般会在GNUfileutils和 shellutils等东西中看到的东西的代替。BusyBox里的东西一般比其全功用GNU对应版别的挑选少;但所包含选项所供给的预期功用和行为则与对应的GNU所供给的几无差别。对任何小或嵌入式体系来说,BusyBox供给的环境都是适当完好的。”
最终一个重要东西是一款BSP,是为搭载了项目方针MCU或处理器的主板专门做的。
BSP包含预先装备的东西,以及将操作体系加载到主板的引导加载程序。它还为内核和器材驱动器供给源代码(见图1)。
图1:用于STM32F429Discovery板的EmcraftBSP的首要部件
进程2:引导序列、时钟体系、存储器和串行接口
典型的嵌入式Linux发动次序履行如下:
1)引导加载程序固件(示例项目里的U-Boot)运转于方针MCU内置闪存(无需外部存储器),并在上电/复位后,履行一切必需的初始化作业,包含设置串口和用于外部存储器(RAM)拜访的存储器操控器。
2)U-Boot可将Linux映像从外部Flash转移到外部RAM,并将操控交接到RAM中的内核进口点。可压缩Linux映像以节约闪存空间,价值是在发动时要支付解压缩时刻。
3)Linux进行引导并装置依据RAM的文件体系(initramfs)作为根文件体系。在项目构建时,Initramfs被填充以所需的文件和目录,然后被简略地链接到内核。
4)在Linux内核下,履行/sbin/init。/sbin/init程序依照/etc/inittab中装备文件的描绘对体系进行初始化。
5)一旦初始化进程完结运转级履行和/sbin/init里的指令,它会发动一个登录进程。
6)壳初始化文件/etc/profile的履行,标志着发动进程的完结。
经过使能就地履行(ExecuteInPlace——XIP)能够明显缩短发动时刻、提高全体功能,XIP是从闪存履行代码的办法。一般,Linux代码是从闪存加载到外部存储器,然后从外部存储器履行。经过从闪存履行,因不再需仿制这步,然后只需较少的存储器,且只读存储器不再占程序空间。
本文的示例项目依据STM32F429MCU。事实上,用户或许会发现,开端时,STM32F4系列MCU的外设初始化不简略把握。走运的是,意法半导体开发了一些东西来协助处理这一问题。STM32CubeMX初始化代码生成器(部件编号UM1718)归于最新的。该东西包含外设初始化的每一个细节,在装备外设时,会显现正告和过错、并正告硬件抵触。