嵌入式是如何做到将某功能植入芯片的

嵌入式是如何做到将某功能植入芯片的,第1张

用一片或少数几片大规模集成电路组成的中央处理器。

这些电路执行控制部件和算术逻辑部件的功能。微处理器与传统的中央处理器相比,具有体积小,重量轻和容易模块化等优点。

一) 微处理器的基本组成部分有:寄存器堆、运算器、时序控制电路,以及数据和地址总线。微处理器能完成取指令、执行指令,以及与外界存储器和逻辑部件交换信息等 *** 作,是微型计算机的运算控制部分。它可与存储器和外围电路芯片组成微型计算机。但这些专用 *** 作系统都是商业化产品,其高昂的价格使许多低端产品的小公司望而却步;而且,源代码封闭性也大大限制了开发者的积极性。

二) 而Linux的开放性,使得许多人都认为Linux非常适合多数Intemet设备。Linux *** 作系统可以支持不同的设备和不同的配置

Linux对厂商不偏不倚,而且成本极低,因而很快成为用于各种设备的 *** 作系统。嵌入式linux是大势所趋,其巨大的市场潜力与酝酿的无限商机必然会吸引众多的厂商进入这一领域。

三) 嵌入式linux *** 作系统

Linux是一类Unix计算机 *** 作系统的统称。Linux *** 作系统的内核的名字也是"Linux".Linux *** 作系统也是自由软件和开放源代码发展中最着名的例子。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的 *** 作系统。

Linux得名于计算机业余爱好者LinuSTorvalds.Linux的程序源码全部公开,任何人都可以根据自己的需要裁剪内核,以适应自己的系统。

linux移植到ARM920T内核的s3c2410处理器芯片为例,介绍了嵌入式linux内核的裁剪以及移植过程,文中介绍的基本原理与方法技巧也可用于其它芯片。

四) 内核移植过程

1 ,建立交叉编译环境

在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。

这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、 *** 作系统(Operating System)。

2,同一个体系结构可以运行不同的 *** 作系统;同样,同一个 *** 作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86 *** 作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86 *** 作系统的简称。

3,交叉编译交叉编译呢,简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓 平台,实际上包含两个概念:体系结构(Architecture)、 *** 作系统(Operating System)。同一个体系结构可以运行不同的 *** 作系统;同样,同一个 *** 作系统也可以在不同的体系结构上运行。

4,交叉编译器完整的安装涉及到多个软件安装,最重要的有binutils、gcc、glibc三个。其中,binutils主要用于生成一些辅助工具;gcc则用来生成交叉编译器,主要生成arm-linux-gcc交叉编译工具;glibc主要是提供用户程序所使用的一些基本的函数库。

5,自行搭建交叉编译环境通常比较复杂,而且很容易出错。本文使用的是开发板自带的交叉编译器,即CROSS一3.3.4.交叉编译器,该编译只需将光盘中的arm-linux一3.3.4.bar.bz2用tar ixvf arm-linux一3.3.4.bar.bz2命令解压到/usr/local/arm下即可。

五) 修改Makefile

Makefile文件Makefile一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能 *** 作,因为makefile就像一个Shell脚本一样,其中也可以执行 *** 作系统的命令。

修改内核目录树根下的Makefile时,可先指明交叉编译器。设计时,可向Makefile中添加如下内容:

ARCH ?=arm

CROSS_COMPILE?=arm-linux-然后设置PATH环境变量,使其可以找到其交叉编译工具链,然后运行vi~/.bashrc,再添加如下内容:

export PATH=/usr/local/arln-linux一3.4.4/bin:$PATH

六) 设置Flash分区

此处一共要修改3个文件,分别如下:

(1)在arch/arm/machS3C2410/devs.c文件中添加如下内容:

#include

#include

#include

然后再建立Nand flash分区表;同时建立Nand F1ash芯片支持,最后加入Nand FLASH芯片并支持到Nand Flash驱动。

另外,还要修改arch/arm/machs3c2410/devs.C文件中的s3c_device_nand结构体变量,同时添加对dev成员的赋值。

(2)指定启动时初始化

内核启动时,可以依据对分区的设置进行初始配置,然后修改arch/am4mach-s3c2410/machsmdk2410.e文件下的smdk2410_devices[],指明初始化时包括在前面所设置的flash分区信息,并添加如下语句:

&s3c_device_nand,

(3)禁止Flash ECC校验

内核一般都是通过UBOOT写到Nand Flash的。UBOOT则通过软件ECC算法来产生ECC校验码,这与内核校验的ECC码不一样,内核中的ECC码是由S3C2410中Nand Flash控制器产生的。所以,这里选择禁止内核ECC校验。

修改drivers/mtd/nand/s3c2410.C 下的s3c2410_nand_init_chip ()函数,可在该函数体最后加上如下一条语句:

chip->eccmode=NAND_ECC_NONE

谢谢!

Linux内核配置系统由三部组别:

?Makefile:布 Linux 内核源代码 Makefile定义 Linux 内核编译规则;

?配置文件(config.in):给用户提供配置选择功能;

?配置工具:包括配置命令解释器(配置脚本使用配置命令进行解释)配置用户界面(提供基于字符界面、基于 Ncurses 图形界面及基于 Xwindows 图形界面用户配置界面各自应于 Make config、Make menuconfig make xconfig)

些配置工具都使用脚本语言 Tcl/TK、Perl 编写(包含些用 C 编写代码)本文并配置系统本身进行析介绍何使用配置系统所除非配置系统维护者般内核发者须解原理需要知道何编写 Makefile 配置文件所本文我 Makefile 配置文件进行讨论另外凡涉及与具体 CPU 体系结构相关内容我都 ARM 例仅讨论问题明确化且内容本身产影响

2. Makefile

2.1 Makefile 概述

Makefile 作用根据配置情况构造需要编译源文件列表别编译并目标代码链接起终形 Linux 内核二进制文件

由于 Linux 内核源代码按照树形结构组织所 Makefile 布目录树Linux 内核 Makefile 及与 Makefile 直接相关文件:

?Makefile:顶层 Makefile整内核配置、编译总体控制文件

?.config:内核配置文件包含由用户选择配置选项用存放内核配置结( make config)

?arch/*/Makefile:位于各种 CPU 体系目录 Makefile arch/arm/Makefile针特定平台 Makefile

?各目录 Makefile:比 drivers/Makefile负责所目录源代码管理

?Rules.make:规则文件所 Makefile 使用

用户通 make config 配置产 .config顶层 Makefile 读入 .config 配置选择顶层 Makefile 两主要任务:产 vmlinux 文件内核模块(module)达目顶层 Makefile 递归进入内核各目录别调用位于些目录 Makefile至于底进入哪些目录取决于内核配置顶层 Makefile 句:include arch/$(ARCH)/Makefile包含特定 CPU 体系结构 Makefile Makefile 包含平台相关信息

位于各目录 Makefile 同根据 .config 给配置信息构造前配置需要源文件列表并文件 include $(TOPDIR)/Rules.make

Rules.make 文件起着非重要作用定义所 Makefile 共用编译规则比需要本目录所 c 程序编译汇编代码需要 Makefile 编译规则:

%.s: %.c

$(CC) $(CFLAGS) -S $<-o $@

目录都同要求需要各自 Makefile 包含编译规则比较麻烦 Linux 内核则类编译规则统放置 Rules.make 并各自 Makefile 包含进 Rules.make(include Rules.make)避免 Makefile 重复同规则于面例 Rules.make 应规则:

%.s: %.c

$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(*F)) $(CFLAGS_$@) -S $<-o $@

2.2 Makefile 变量

顶层 Makefile 定义并向环境输许变量各目录 Makefile 传递些信息些变量比 SUBDIRS仅顶层 Makefile 定义并且赋初值且 arch/*/Makefile 作扩充

用变量几类:

1) 版本信息

版本信息:VERSIONPATCHLEVEL, SUBLEVEL, EXTRAVERSIONKERNELRELEASE版本信息定义前内核版本比 VERSION=2PATCHLEVEL=4SUBLEVEL=18EXATAVERSION=-rmk7共同构内核发行版本KERNELRELEASE:2.4.18-rmk7

2) CPU 体系结构:ARCH

顶层 Makefile 用 ARCH 定义目标 CPU 体系结构比 ARCH:=arm 等许目录 Makefile 要根据 ARCH 定义选择编译源文件列表

3) 路径信息:TOPDIR, SUBDIRS

TOPDIR 定义 Linux 内核源代码所根目录例各目录 Makefile 通 $(TOPDIR)/Rules.make 找 Rules.make 位置

SUBDIRS 定义目录列表编译内核或模块顶层 Makefile 根据 SUBDIRS 决定进入哪些目录SUBDIRS 值取决于内核配置顶层 Makefile SUBDIRS 赋值 kernel drivers mm fs net ipc lib;根据内核配置情况 arch/*/Makefile 扩充 SUBDIRS 值参见4)例

4) 内核组信息:HEAD, CORE_FILES, NETWORKS, DRIVERS, LIBS

Linux 内核文件 vmlinux 由规则产:

vmlinux: $(CONFIGURATION) init/main.o init/version.o linuxsubdirs

$(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o

--start-group

$(CORE_FILES)

$(DRIVERS)

$(NETWORKS)

$(LIBS)

--end-group

-o vmlinux

看vmlinux 由 HEAD、main.o、version.o、CORE_FILES、DRIVERS、NETWORKS LIBS 组些变量( HEAD)都用定义连接 vmlinux 目标文件库文件列表其HEADarch/*/Makefile 定义用确定先链接进 vmlinux 文件列表比于 ARM 系列 CPUHEAD 定义:

HEAD := arch/arm/kernel/head-$(PROCESSOR).o

arch/arm/kernel/init_task.o

表明 head-$(PROCESSOR).o init_task.o 需要先链接 vmlinux PROCESSOR armv 或 armo取决于目标 CPU CORE_FILESNETWORKDRIVERS LIBS 顶层 Makefile 定义并且由 arch/*/Makefile 根据需要进行扩充 CORE_FILES 应着内核核文件 kernel/kernel.omm/mm.ofs/fs.oipc/ipc.o看些组内核重要文件同arch/arm/Makefile CORE_FILES 进行扩充:

# arch/arm/Makefile

# If we have a machine-specific directory, then include it in the build.

MACHDIR := arch/arm/mach-$(MACHINE)

ifeq ($(MACHDIR),$(wildcard $(MACHDIR)))

SUBDIRS += $(MACHDIR)

CORE_FILES := $(MACHDIR)/$(MACHINE).o $(CORE_FILES)

endif

HEAD := arch/arm/kernel/head-$(PROCESSOR).o

arch/arm/kernel/init_task.o

SUBDIRS += arch/arm/kernel arch/arm/mm arch/arm/lib arch/arm/nwfpe

CORE_FILES := arch/arm/kernel/kernel.o arch/arm/mm/mm.o $(CORE_FILES)

LIBS := arch/arm/lib/lib.a $(LIBS)

5) 编译信息:CPP, CC, AS, LD, ARCFLAGSLINKFLAGS

Rules.make 定义编译通用规则具体特定场合需要明确给编译环境编译环境变量定义针交叉编译要求定义 CROSS_COMPILE比:

CROSS_COMPILE = arm-linux-

CC = $(CROSS_COMPILE)gcc

LD = $(CROSS_COMPILE)ld

......

CROSS_COMPILE 定义交叉编译器前缀 arm-linux-表明所交叉编译工具都 arm-linux- 所各交叉编译器工具前都加入 $(CROSS_COMPILE)组完整交叉编译工具文件名比 arm-linux-gcc

CFLAGS 定义传递给 C 编译器参数

LINKFLAGS 链接 vmlinux 由链接器使用参数LINKFLAGS arm/*/Makefile 定义比:

# arch/arm/Makefile

LINKFLAGS :=-p -X -T arch/arm/vmlinux.lds

6) 配置变量CONFIG_*

.config 文件许配置变量等式用说明用户配置结例 CONFIG_MODULES=y 表明用户选择 Linux 内核模块功能

.config 顶层 Makefile 包含形许配置变量每配置变量具确定值:y 表示本编译选项应内核代码静态编译进 Linux 内核;m 表示本编译选项应内核代码编译模块;n 表示选择编译选项;根本没选择配置变量值空

2.3 Rules.make 变量

前面讲Rules.make 编译规则文件所 Makefile 都包括 Rules.makeRules.make 文件定义许变量重要些编译、链接列表变量

O_OBJSL_OBJSOX_OBJSLX_OBJS:本目录需要编译进 Linux 内核 vmlinux 目标文件列表其 OX_OBJS LX_OBJS "X" 表明目标文件使用 EXPORT_SYMBOL 输符号

M_OBJSMX_OBJS:本目录需要编译装载模块目标文件列表同MX_OBJS "X" 表明目标文件使用 EXPORT_SYMBOL 输符号

O_TARGETL_TARGET:每目录都 O_TARGET 或 L_TARGETRules.make 首先源代码编译 O_OBJS OX_OBJS 所目标文件使用 $(LD) -r 链接 O_TARGET 或 L_TARGETO_TARGET .o 结尾 L_TARGET .a 结尾


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7486517.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-06
下一篇2023-04-06

发表评论

登录后才能评论

评论列表(0条)

    保存