基于ARM的嵌入式Linux移植真实体验(3)――操作系统

发布者:PeacefulOasis最新更新时间:2016-06-23 来源: eefocus关键字:ARM  Linux移植  操作系统 手机看文章 扫描二维码
随时随地手机看文章
在笔者撰写的《C语言嵌入式系统编程修炼之道》一文中,主要陈诉的软件架构是单任务无操作系统平台的,而本文的侧重点则在于讲述操作系统嵌入的软件架构,二者的区别如下图:



    		    基于ARM的嵌入式Linux移植真实体验(3)――操作系统
嵌入式操作系统并不总是必须的,因为程序完全可以在裸板上运行。尽管如此,但对于复杂的系统,为使其具有任务管理、定时器管理、存储器管理、资源管理、事件管理、系统管理、消息管理、队列管理和中断处理的能力,提供多任务处理,更好的分配系统资源的功能,很有必要针对特定的硬件平台和实际应用移植操作系统。鉴于Linux的源代码开放性,它成为嵌入式操作系统领域的很好选择。国内外许多知名大学、公司、研究机构都加入了嵌入式Linux的研究行列,推出了一些著名的版本:
Ø RT-Linux提供了一个精巧的实时内核,把标准的Linux核心作为实时核心的一个进程同用户的实时进程一起调度。RT-Linux已成功地应用于航天飞机的空间数据采集、科学仪器测控和电影特技图像处理等广泛的应用领域。如NASA(美国国家宇航局)将装有RT-Linux的设备放在飞机上,以测量Georage咫风的风速;
Ø uCLinux(Micro-Control-Linux,u表示Micro,C表示Control)去掉了MMU(内存管理)功能,应用于没有虚拟内存管理的微处理器/微控制器,它已经被成功地移植到了很多平台上。
本章涉及的mizi-linux由韩国mizi公司根据Linux 2.4内核移植而来,支持S3C2410A处理器。
1.Linux内核要点
和其他操作系统一样,Linux包含进程调度与进程间通信(IPC)、内存管理(MMU)、虚拟文件系统(VFS)、网络接口等,下图给出了Linux的组成及其关系:



    		    基于ARM的嵌入式Linux移植真实体验(3)――操作系统
Linux内核源代码包括多个目录:
(1)arch:包括硬件特定的内核代码,如arm、mips、i386等;
(2)drivers:包含硬件驱动代码,如char、cdrom、scsi、mtd等;
(3)include:通用头文件及针对不同平台特定的头文件,如asm-i386、asm-arm等;
(4)init:内核初始化代码;
(5)ipc:进程间通信代码;
(6)kernel:内核核心代码;
(7)mm:内存管理代码;
(8)net:与网络协议栈相关的代码,如ipv4、ipv6、ethernet等;
(9)fs:文件系统相关代码,如nfs、vfat等;
(10)lib:库文件,与平台无关的strlen、strcpy等,如在string.c中包含:
char * strcpy(char * dest,const char *src)
{
char *tmp = dest;
 
while ((*dest++ = *src++) != '')
/* nothing */;
return tmp;
}
(11)Documentation:文档。
在Linux内核的实现中,有一些数据结构使用非常频繁,对研读内核的人来说至为关键,它们是:
1.task_struct
Linux内核利用task_struct数据结构代表一个进程,用task_struct指针形成一个task数组。当建立新进程的时候,Linux为新的进程分配一个task_struct结构,然后将指针保存在task数组中。调度程序维护current指针,它指向当前正在运行的进程。
2.mm_struct
每个进程的虚拟内存由mm_struct结构代表。该结构中包含了一组指向vm-area_struct结构的指针,vm-area_struct结构描述了虚拟内存的一个区域。
3.inode
Linux虚拟文件系统中的文件、目录等均由对应的索引节点(inode)代表。
2.Linux移植项目
mizi-linux已经根据Linux 2.4内核针对S3C2410A这一芯片进行了有针对性的移植工作,包括:
(1)修改根目录下的Makefile文件
a.指定目标平台为ARM:
#ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
ARCH := arm
b.指定交叉编译器:
CROSS_COMPILE = arm-linux-
(2)修改arch目录中的文件
根据本章第一节可知,Linux的arch目录存放硬件相关的内核代码,因此,在Linux内核中增加对S3C2410的支持,最主要就是要修改arch目录中的文件。
a.在arch/arm/Makefile文件中加入:
ifeq ($(CONFIG_ARCH_S3C2410),y)
TEXTADDR = 0xC0008000
MACHINE = s3c2410
Endif
b.在arch\arm\config.in文件中加入:
if [ "$CONFIG_ARCH_S3C2410" = "y" ]; then
comment 'S3C2410 Implementation'
dep_bool ' SMDK (MERI TECH BOARD)' CONFIG_S3C2410_SMDK $CONFIG_ARCH_S3C2410
dep_bool ' change AIJI' CONFIG_SMDK_AIJI
dep_tristate 'S3C2410 USB function support' CONFIG_S3C2410_USB $CONFIG_ARCH_S3C2100
dep_tristate ' Support for S3C2410 USB character device emulation' CONFIG_S3C2410_USB_CHAR $CONFIG_S3C2410_USB
fi # /* CONFIG_ARCH_S3C2410 */
arch\arm\config.in文件还有几处针对S3C2410的修改。
c.在arch/arm/boot/Makefile文件中加入:
ifeq ($(CONFIG_ARCH_S3C2410),y)
ZTEXTADDR = 0x30008000
ZRELADDR = 0x30008000
endif
d.在linux/arch/arm/boot/compressed/Makefile文件中加入:
ifeq ($(CONFIG_ARCH_S3C2410),y)
OBJS += head-s3c2410.o
endif
加入的结果是head-s3c2410.S文件被编译为head-s3c2410.o。
e.加入arch\arm\boot\compressed\ head-s3c2410.S文件
#include
#include
#include
 
.section ".start", #alloc, #execinstr
 
__S3C2410_start:
 
@ Preserve r8/r7 i.e. kernel entry values
@ What is it?
@ Nandy
 
@ Data cache, Intstruction cache, MMU might be active.
@ Be sure to flush kernel binary out of the cache,
@ whatever state it is, before it is turned off.
@ This is done by fetching through currently executed
@ memory to be sure we hit the same cache
 
bic r2, pc, #0x1f
add r3, r2, #0x4000 @ 16 kb is quite enough...
1: ldr r0, [r2], #32
teq r2, r3
bne 1b
mcr p15, 0, r0, c7, c10, 4 @ drain WB
mcr p15, 0, r0, c7, c7, 0 @ flush I & D caches
 
#if 0
@ disabling MMU and caches
mrc p15, 0, r0, c1, c0, 0 @ read control register
bic r0, r0, #0x05 @ disable D cache and MMU
bic r0, r0, #1000 @ disable I cache
mcr p15, 0, r0, c1, c0, 0
#endif
 
/*
* Pause for a short time so that we give enough time
* for the host to start a terminal up.
*/
mov r0, #0x00200000
1: subs r0, r0, #1
bne 1b
该文件中的汇编代码完成S3C2410特定硬件相关的初始化。
f.在arch\arm\def-configs目录中增加配置文件
g.在arch\arm\kernel\Makefile中增加对S3C2410的支持
no-irq-arch := $(CONFIG_ARCH_INTEGRATOR) $(CONFIG_ARCH_CLPS711X) \
$(CONFIG_FOOTBRIDGE) $(CONFIG_ARCH_EBSA110) \
$(CONFIG_ARCH_SA1100) $(CONFIG_ARCH_CAMELOT) \
$(CONFIG_ARCH_S3C2400) $(CONFIG_ARCH_S3C2410) \
$(CONFIG_ARCH_MX1ADS) $(CONFIG_ARCH_PXA)
obj-$(CONFIG_MIZI) += event.o
obj-$(CONFIG_APM) += apm2.o
h.修改arch/arm/kernel/debug-armv.S文件,在适当的位置增加如下关于S3C2410的代码:
#elif defined(CONFIG_ARCH_S3C2410)
 
.macro addruart,rx
mrc p15, 0, \rx, c1, c0
tst \rx, #1 @ MMU enabled ?
moveq \rx, #0x50000000 @ physical base address
movne \rx, #0xf0000000 @ virtual address
.endm
 
.macro senduart,rd,rx
str \rd, [\rx, #0x20] @ UTXH
.endm
 
.macro waituart,rd,rx
.endm
 
.macro busyuart,rd,rx
1001: ldr \rd, [\rx, #0x10] @ read UTRSTAT
tst \rd, #1 << 2 @ TX_EMPTY ?
beq 1001b
.endm
i.修改arch/arm/kernel/setup.c文件
此文件中的setup_arch非常关键,用来完成与体系结构相关的初始化:
void __init setup_arch(char **cmdline_p)
{
struct tag *tags = NULL;
struct machine_desc *mdesc;
char *from = default_command_line;
 
ROOT_DEV = MKDEV(0, 255);
 
setup_processor();
mdesc = setup_machine(machine_arch_type);
machine_name = mdesc->name;
 
if (mdesc->soft_reboot)
reboot_setup("s");
 
if (mdesc->param_offset)
tags = phys_to_virt(mdesc->param_offset);
 
/*
* Do the machine-specific fixups before we parse the
* parameters or tags.
*/
if (mdesc->fixup)
mdesc->fixup(mdesc, (struct param_struct *)tags,
&from, &meminfo);
 
/*
* If we have the old style parameters, convert them to
* a tag list before.
*/
if (tags && tags->hdr.tag != ATAG_CORE)
convert_to_tag_list((struct param_struct *)tags,
meminfo.nr_banks == 0);
 
if (tags && tags->hdr.tag == ATAG_CORE)
parse_tags(tags);
 
if (meminfo.nr_banks == 0) {
meminfo.nr_banks = 1;
meminfo.bank[0].start = PHYS_OFFSET;
meminfo.bank[0].size = MEM_SIZE;
}
 
init_mm.start_code = (unsigned long) &_text;
init_mm.end_code = (unsigned long) &_etext;
init_mm.end_data = (unsigned long) &_edata;
init_mm.brk = (unsigned long) &_end;
 
memcpy(saved_command_line, from, COMMAND_LINE_SIZE);
saved_command_line[COMMAND_LINE_SIZE-1] = '';
parse_cmdline(&meminfo, cmdline_p, from);
bootmem_init(&meminfo);
paging_init(&meminfo, mdesc);
request_standard_resources(&meminfo, mdesc);
 
/*
* Set up various architecture-specific pointers
*/
init_arch_irq = mdesc->init_irq;
 
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
conswitchp = &vga_con;
#elif defined(CONFIG_DUMMY_CONSOLE)
conswitchp = &dummy_con;
#endif
#endif
}
j.修改arch/arm/mm/mm-armv.c文件(arch/arm/mm/目录中的文件完成与ARM相关的MMU处理)
修改
init_maps->bufferable = 0;
init_maps->bufferable = 1;
要轻而易举地进行上述马拉松式的内核移植工作并非一件轻松的事情,需要对Linux内核有很好的掌握,同时掌握硬件特定的知识和相关的汇编。幸而mizi公司的开发者们已经合力为我们完成了上述工作,这使得小弟们在将mizi-linux移植到自身开发的电路板的过程中只需要关心如下几点:
(1)内核初始化:Linux内核的入口点是start_kernel()函数。它初始化内核的其他部分,包括捕获,IRQ通道,调度,设备驱动,标定延迟循环,最重要的是能够fork“init”进程,以启动整个多任务环境。
我们可以在init中加上一些特定的内容。
(2)设备驱动:设备驱动占据了Linux内核很大部分。同其他操作系统一样,设备驱动为它们所控制的硬件设备和操作系统提供接口。
本文第四章将单独讲解驱动程序的编写方法。
(3)文件系统:Linux最重要的特性之一就是对多种文件系统的支持。这种特性使得Linux很容易地同其他操作系统共存。文件系统的概念使得用户能够查看存储设备上的文件和路径而无须考虑实际物理设备的文件系统类型。Linux透明的支持许多不同的文件系统,将各种安装的文件和文件系统以一个完整的虚拟文件系统的形式呈现给用户。
我们可以在K9S1208 NAND FLASH上移植cramfs、jfss2、yaffs等FLASH文件系统。
3. init进程
在init函数中“加料”,可以使得Linux启动的时候做点什么,例如广州友善之臂公司的demo板在其中加入了公司信息:
static int init(void * unused)
{
lock_kernel();
do_basic_setup();
 
prepare_namespace();
 
/*
* Ok, we have completed the initial bootup, and
* we're essentially up and running. Get rid of the
* initmem segments and start the user-mode stuff..
*/
free_initmem();
unlock_kernel();
 
if (open("/dev/console", O_RDWR, 0) < 0)
printk("Warning: unable to open an initial console.\n");
 
(void) dup(0);
(void) dup(0);
 
/*
* We try each of these until one succeeds.
*
* The Bourne shell can be used instead of init if we are
* trying to recover a really broken machine.
*/
 
printk("========================================\n");
printk("= Friendly-ARM Tech. Ltd. =\n");
printk("= [url]http://www.arm9.net [/url] =\n");
printk("= [url]http://www.arm9.com.cn [/url] =\n");
printk("========================================\n");
 
if (execute_command)
execve(execute_command,argv_init,envp_init);
execve("/sbin/init",argv_init,envp_init);
execve("/etc/init",argv_init,envp_init);
execve("/bin/init",argv_init,envp_init);
execve("/bin/sh",argv_init,envp_init);
panic("No init found. Try passing init= option to kernel.");
}
这样在Linux的启动过程中,会额外地输出:
========================================
= Friendly-ARM Tech. Ltd. =
= [url]http://www.arm9.net [/url] =
= [url]http://www.arm9.com.cn [/url] =
========================================
4.文件系统移植
文件系统是基于被划分的存储设备上的逻辑上单位上的一种定义文件的命名、存储、组织及取出的方法。如果一个Linux没有根文件系统,它是不能被正确的启动的。因此,我们需要为Linux创建根文件系统,我们将其创建在K9S1208 NAND FLASH上。
Linux的根文件系统可能包括如下目录(或更多的目录):
(1)/bin (binary):包含着所有的标准命令和应用程序;
(2)/dev (device):包含外设的文件接口,在Linux下,文件和设备采用同种地方法访问的,系统上的每个设备都在/dev里有一个对应的设备文件;
(3)/etc (etcetera):这个目录包含着系统设置文件和其他的系统文件,例如/etc/fstab(file system table)记录了启动时要mount 的filesystem;
(4)/home:存放用户主目录;
(5)/lib(library):存放系统最基本的库文件;
(6)/mnt:用户临时挂载文件系统的地方;
(7)/proc:linux提供的一个虚拟系统,系统启动时在内存中产生,用户可以直接通过访问这些文件来获得系统信息;
(8)/root:超级用户主目录;
(9)/sbin:这个目录存放着系统管理程序,如fsck、mount等;
(10)/tmp(temporary):存放不同的程序执行时产生的临时文件;
(11)/usr(user):存放用户应用程序和文件。
采用BusyBox是缩小根文件系统的好办法,因为其中提供了系统的许多基本指令但是其体积很小。众所周知,瑞士军刀以其小巧轻便、功能众多而闻名世界,成为各国军人的必备工具,并广泛应用于民间,而BusyBox也被称为嵌入式Linux领域的“瑞士军刀”。
此地址可以下载BusyBox:[url]http://www.busybox.net[/url],当前最新版本为1.1.3。编译好busybox后,将其放入/bin目录,若要使用其中的命令,只需要建立link,如:
ln -s ./busybox ls
ln -s ./busybox mkdir
4.1 cramfs
在根文件系统中,为保护系统的基本设置不被更改,可以采用cramfs格式,它是一种只读的闪存文件系统。制作cramfs文件系统的方法为:建立一个目录,将需要放到文件系统的文件copy到这个目录,运行“mkcramfs 目录名 image名”就可以生成一个cramfs文件系统的image文件。例如如果目录名为rootfs,则正确的命令为:
mkcramfs rootfs rootfs.ramfs
我们使用下面的命令可以mount生成的rootfs.ramfs文件,并查看其中的内容:
mount -o loop -t cramfs rootfs.ramfs /mount/point
此地址可以下载mkcramfs工具:[url]http://sourceforge.net/projects/cramfs/[/url]。
4.2 jfss2
对于cramfs闪存文件系统,如果没有ramfs的支持则只能读,而采用jfss2(The Journalling Flash File System version 2)文件系统则可以直接在闪存中读、写数据。jfss2 是一个日志结构(log-structured)的文件系统,包含数据和原数据(meta-data)的节点在闪存上顺序地存储。jfss2记录了每个擦写块的擦写次数,当闪存上各个擦写块的擦写次数的差距超过某个预定的阀值,开始进行磨损平衡的调整。调整的策略是,在垃圾回收时将擦写次数小的擦写块上的数据迁移到擦写次数大的擦写块上以达到磨损平衡的目的。
与mkcramfs类似,同样有一个mkfs.jffs2工具可以将一个目录制作为jffs2文件系统。假设把/bin目录制作为jffs2文件系统,需要运行的命令为:
mkfs.jffs2 -d /bin -o jffs2.img
4.3 yaffs
yaffs 是一种专门为嵌入式系统中常用的闪存设备设计的一种可读写的文件系统,它比jffs2 文件系统具有更快的启动速度,对闪存使用寿命有更好的保护机制。为使Linux支持yaffs文件系统,我们需要将其对应的驱动加入到内核中fs/yaffs/,并修改内核配置文件。使用我们使用mkyaffs工具可以将NAND FLASH中的分区格式化为yaffs格式(如/bin/mkyaffs /dev/mtdblock/0命令可以将第1个MTD块设备分区格式化为yaffs),而使用mkyaffsimage(类似于mkcramfs、mkfs.jffs2)则可以将某目录生成为yaffs文件系统镜像。
嵌入式Linux还可以使用NFS(网络文件系统)通过以太网挂接根文件系统,这是一种经常用来作为调试使用的文件系统启动方式。通过网络挂接的根文件系统,可以在主机上生成ARM 交叉编译版本的目标文件或二进制可执行文件,然后就可以直接装载或执行它,而不用频繁地写入flash。
采用不同的文件系统启动时,要注意通过第二章介绍的BootLoader修改启动参数,如广州友善之臂的demo提供如下三种启动方式:
(1)从cramfs挂接根文件系统:root=/dev/bon/2();
(2)从移植的yaffs挂接根文件系统:root=/dev/mtdblock/0;
(3)从以太网挂接根文件系统:root=/dev/nfs。
5.小结
本章介绍了嵌入式Linux的背景、移植项目、init进程修改和文件系统移植,通过这些步骤,我们可以在嵌入式系统上启动一个基本的Linux。

关键字:ARM  Linux移植  操作系统 引用地址:基于ARM的嵌入式Linux移植真实体验(3)――操作系统

上一篇:基于ARM的嵌入式Linux移植真实体验(5)――应用实例
下一篇:arm linux 下中断流程简要分析注册中断

推荐阅读最新更新时间:2024-03-16 14:58

非移动市场需求飙升ARM预计50亿片出货量
ARM核产品覆盖了MCU应用的每一个领域,从消费娱乐、无线移动、到网络和家庭应用等。而在便携式移动产品领域,以低功耗著称的ARM处理器占绝对优势。ARM公司于3月份宣称截至2007第四季度已累计“出货”100亿片MCU,而自2007年Q4至今又有10亿片基于ARM核的处理器出货。因此说ARM产品无处不在并不为过。而正当人们惊讶于ARM公司的快速成长与其低功耗产品在移动领域所取得的成就的同时,ARM已经将目光投向了非移动领域。 2008年6月11日,在深圳举办了ARM第一届家庭应用创新研讨会暨合作伙伴中国峰会上,ARM公司中国总裁谭军博士表示,ARM预计2010年的年出货量将达50亿片,而ARM也将在家庭应用上捕获更多的
[焦点新闻]
非移动市场需求飙升<font color='red'>ARM</font>预计50亿片出货量
ARM9中断与PC
1, 假设当前是PC,PC-4,PC-8。当前 取指PC =当前PC,当前 译码PC =当前PC-4, 当前 执行PC =当前PC-8。例如,如下图所示,当前 取值PC =16,当前 解码PC =12,当前 执行PC =8。 2, 发生IRQ异常,执行保护操作,LR中保存由于FIQ或IRQ占先而没有被执行完的指令的地址的下一条地址(LR中保存的是当前PC的值,也就是取值的指令地址),即LR指向了指令地址=16的指令,但指令地址=12的指令还没有执行完,中断返回后还要继续执行 3, 进入中断服务程序 4, 中断返回前,对LR处理,LR=LR-4,指向之前已译码但没被执行的指令的地址(如果返回的时候直接返回PC,那么中
[单片机]
<font color='red'>ARM</font>9中断与PC
ARM牵手香港科技大学,提供嵌入式系统设计培训
位于广东南沙信息科技园的香港科技大学嵌入式系统设计院和ARM公司共同宣布:嵌入式系统设计院成为ARM认证培训中心。嵌入式系统设计院将向大学生和专业人员提供培训课程,帮助他们提高基于ARM技术的设计和开发能力。 作为中国乃至世界最受欢迎的嵌入式系统架构之一,ARM正在成为越来越多的中国设计师在开发系统级芯片(SoC)解决方案时的首选。通过ARM认证培训中心,中国电子工程师可以获得基于ARM技术的片上系统设计和开发的培训,从而促进本地电子设计的创新。 嵌入式系统设计院院长K. David Young博士表示:“珠江三角洲是中国电子制造业的中心。很多公司现在都在开发基于ARM技术的产品,增强产品的竞争力。然而对他们来说最大的挑战之一
[焦点新闻]
基于ARM的指纹识别门禁系统设计
摘要:传统的身份识别技术已经不能满足现代社会需要,因而指纹识别技术得到了广泛应用。文章介绍了指纹识别原理与处理方法,指出了一种基于嵌入式ARM9体系结构的指纹识别门禁系统的软硬件设计方法。 关键词:ARM;指纹识别;S3C2440AL;TFS-D0303 0 引言 现代社会高速发展,很多场合需要身份确认,传统的身份识别技术已经不能满足社会要求。人的身体特征具有不可复制性,因此人们开始研究生物识别技术,而指纹具有唯一性、终生不变性、难于伪造等特点,安全性高,因而得到了广泛应用。在一些机要部门,如银行、宾馆、机房等一般都安装有门禁系统,门禁系统是为保障人们生活、工作及财产安全, 对重要通道的出入口进行管理与控制的系统,基于指纹识
[工业控制]
基于<font color='red'>ARM</font>的指纹识别门禁系统设计
飞思卡尔推首款基于ARM Cortex-M0+处理器的5V 32位MCU
飞思卡尔半导推出业界首款基于ARM Cortex-M0+处理器的5V 32位MCU。全新Kinetis E系列MCU具有强大的系统电磁抗噪能力(过去只有8位和16位MCU具有这种能力),如白色家电和工业应用,同时提供高效率和最佳代码密度。 全新的Kinetis E系列产品是洗碗机、冰箱、家庭和楼宇控制系统、电机控制风机、工业转换器以及通常在高噪声环境中运行的其他设备等应用的理想选择。利用这些器件的耐用设计和32位处理能力,系统设计人员可以只采用一个器件,而不是以前所需的多个MCU。此外,大间距封装选件和高静电放电保护性能支持单层板设计,减少其他电路保护组件的需求,从而降低系统成本。 Kinetis 飞思卡尔MCU业
[单片机]
ARM进军服务器处理器 与Intel相互进入
    10月31日,移动芯片领域的幕后巨头ARM公司在北京正式发布了两款64位处理器产品Cortex A50系列。这是ARM公布的首批64位处理器,意图在移动领域进一步扩大自己相对于英特尔的领先地位,同时进军英特尔占优的服务器市场。 ARM公司首席商务官Mike Inglis将此形容为“公司成立25年以来最重要的发布”。据记者了解,包括三星、意法半导体,以及中国芯片厂商海思半导体在内的6家芯片厂商成为首批公开授权的合作伙伴。 据Mike Inglis预计,合作伙伴基于ARM架构的64位处理器将会于2014年正式面向市场销售。“PC市场花了八年的时间从32位过渡到64位,我相信手机或者移动市场转变会快得多,但是也不会一蹴而就的。”M
[手机便携]
基于3c2410的linux2.6.22移植(1)
经历近2周的时间,查阅大量的参考资料和贴子,终于成功将linux2.6.22移植到ARM2410上。中间走了不少弯路,不过走弯路也是一种收获,因为可以碰到和解决许多问题,增长知识。因为linux版本问题以及开发平台的不同,网上的很多文章并不完全适合自己的板子,需要自己摸索和修改。写这点东西算是对前一阶段工作的总结,以免将来忘记。 移植大体的步骤主要有: (1) 交叉编译环境的建立(我的主机系统是ubuntu7.04); (2) 开发板(我用的是博创的2410)NAND flash 分区管理; (3) LCD、网卡驱动的移植; (4) linux内核配置和编译; (5) ro
[单片机]
基于linux系统ARM学习步骤
很多人学完单片机就想学arm,但不知如何去学习~现在凌阳教育 ARM培训 网为大家列出一下学习这方面的步骤-----基于linux系统的学习步骤如下: 1、Linux 基础 安装Linux操作系统 Linux文件系统 Linux常用命令 Linux启动过程详解 熟悉Linux服务 能够独立安装Linux操作系统 能够熟练使用Linux系统的基本命令 认识Linux系统的常用服务 安装Linux操作系统 Linux基本命令实践 设置Linux环境变量 定制Linux的服务 Shell 编程基础使用vi编辑文件 使用Emacs编辑文件
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved