移植嵌入式Linux到ARM处理器S3C2410:操作系统

发布者:自由思考最新更新时间:2016-12-03 来源: eefocus关键字:移植  Linux  ARM处理器  S3C2410  操作系统 手机看文章 扫描二维码
随时随地手机看文章

在笔者撰写的《C语言嵌入式系统编程修炼之道》一文中,主要陈诉的软件架构是单任务无操作系统平台的,而本文的侧重点则在于讲述操作系统嵌入的软件架构,二者的区别如下图:

 

  嵌入式操作系统并不总是必须的,因为程序完全可以在裸板上运行。尽管如此,但对于复杂的系统,为使其具有任务管理、定时器管理、存储器管理、资源管理、事件管理、系统管理、消息管理、队列管理和中断处理的能力,提供多任务处理,更好的分配系统资源的功能,很有必要针对特定的硬件平台和实际应用移植操作系统。鉴于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的组成及其关系:

 

  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++) != '\0')
/* 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] = '\0';
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("= http://www.arm9.net =\n");
printk("= http://www.arm9.com.cn =\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. =
= http://www.arm9.net =
= http://www.arm9.com.cn =
========================================

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:http://www.busybox.net,当前最新版本为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工具:http://sourceforge.net/projects/cramfs/

  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。


关键字:移植  Linux  ARM处理器  S3C2410  操作系统 引用地址:移植嵌入式Linux到ARM处理器S3C2410:操作系统

上一篇:S3C2410 内存连接方法的深入研究
下一篇:ARM-Linux 中断分析

推荐阅读最新更新时间:2024-03-16 15:23

MPLAB 工程移植到MPLAB X注意事项
随着这两年Microchip对MPLAB X和XC系列编译器的主推,MPLAB和Hi-tech编译器渐渐停止了更新和维护,所以建议你之前建立在MPLAB和Hi-tech底下的工程移植到MPLAB X和XC编译器下,当然为了兼容,MPLAB X也支持Hi-tech编译器,你可以在MPLAB X下编辑,编译继续使用Hi-tech,但是小猿不建议你这样做。在确保不影响产品功能和性能的前提下,怎么样将之前老的工程移植到新的开发环境和编译器下呢,因为两个平台的头文件不一样, 配置字语法也不一样,所以经过小猿亲身实践,移植时候需要注意两点即头文件和配置字 例如我们以基于PIC18F46K22芯片的一个工程为例,则涉及需要更换的头文件有pi
[单片机]
基于嵌入式ARM处理器的M2M终端总体设计
引言 目前,对输油管道、电力装置、油井等进行远程监控主要采用人工巡逻的方式,这种方式存在实时性差、成本高、浪费人力资源、无法对环境恶劣的地区进行监控、可能出现误报等缺点。随着工业领域现代化水平的提高和通信技术的发展,这种生产方式亟待得到改善。 M2M是指应用无线移动通信技术,实现机器与机器、机器与人之间数据通信和交流的一系列技术及其组合的总称。GPRS具有覆盖地域广、通信距离远、网络 可靠性高等优点。随着GPRS的推广和应用,以及基于GPRS的M2M产品的推出,采用GPRS技术来解决上述问题成为一种较好的方案。 嵌入式系统是当前国内外研究的热点之一。采用嵌入式系统技术设计一种可以解决远程监控领域数据传输
[单片机]
基于嵌入式<font color='red'>ARM处理器</font>的M2M终端总体设计
苹果公司发布新一代移动操作系统iOS 8
    苹果公司最新一代移动操作系统iOS 8   新浪手机讯 北京时间6月3日凌晨消息,苹果公司在美国旧金山召开2014年度全球开发者大会。苹果公司发布了最新一代移动操作系统iOS 8,对短信、输入法、通知中心、搜索等多款应用的功能进行了大幅升级。iOS 8正式版将在今年秋天发布,支持iPhone 4s及以后的设备。   最新一代移动操作系统iOS 8与上一代iOS 7的界面基本相同,但是对一些常用功能进行了大幅改进。   首先,iOS 8系统中的顶部通知栏增强了互动性。以短信应用为例,用户在收到一条短信时,可以直接在通知栏里进行回复,而不用再进入短信应用界面。其他应用也是类似。   由于短
[手机便携]
ARMLinux驱动移植Watch Dog Timer(看门狗)驱动移植
硬件平台:FL2440 (S3C2440) 内核版本:2.6.28 软件平台:Ubuntu 11.04 内核版本:2.6.39 交叉编译器:arm-linux-gcc 3.4.1 原创作品,转载请标明出处 1、加载看门狗驱动 insmod wdt.ko wdt.ko为驱动文件名,不加任何参数如果不喂狗,则计数器到0时执行中断函数(设置LED的状态,然后喂狗,重新设置WTCNT的值) 可选的参数 module_param(tmr_margin, int, 0); module_param(tmr_atboot, int, 0); module_param(nowayout, int, 0); module_para
[单片机]
ARMLinux驱动<font color='red'>移植</font>Watch Dog Timer(看门狗)驱动<font color='red'>移植</font>
S3C2440,Linux,LCD驱动
到了神秘的LCD驱动了,信息还真有点胆怯,但是还是不得不走下去。对刚刚学习的linux驱动坐一下总结,毕竟是Linux内核当中的东东,而且是那么的繁琐。做一总结,等用笔记把学过东西几下来,这样就不会忘了。哈哈! 那就开始!!! 在编写裸机LCD程序的时候,首先就是硬件初始化操作。有一个寄存器当中存放了帧缓冲的起始地址。这个参数是非常重要的。当配置好硬件后,帧缓冲中的数据能够脱离CPU不停地将真缓冲当中的数据写入到LCD屏。如果我们要现实一个图片的话只需要将图片数据放到帧缓冲当中,这样就非常的方便了。 在linux当中,把整个LCD驱动分为两层:LCD帧缓冲区层和LCD硬件驱动层。LCD帧缓冲区层其实就是将内核中的一部分空间当作一个
[单片机]
OK6410A 开发板 (八) 5 linux-5.11 OK6410A usb 移植
s3c6410 有两个USB实例(板子也都引出来了), 分别是 USB host 和 USB OTG , 这里说的是 usb host 代码 : https://github.com/lisider/linux/tree/ok6410a-linux-5.11 提交id : dc485e937e8bccc1fc01b5e6d9025bf83b2b6f83 defconfig : arch/arm/configs/ok6410A_sdboot_mini_net_lcd_x11_usb_defconfig CONFIG_USB_NET_DRIVERS=y CONFIG_USB_HID=y CONFIG_USB_OHCI_LI
[单片机]
OK6410A 开发板 (八) 5 <font color='red'>linux</font>-5.11 OK6410A usb <font color='red'>移植</font>
Linux操作系统网络驱动程序编写
作需要写了我们公司一块网卡的Linux驱动程序。经历一个从无到有的过程,深感技术交流的重要。Linux作为挑战微软垄断的强有力武器,日益受到大家的喜爱。真希望她能在中国迅速成长。把程序文档贴出来,希望和大家探讨Linux技术和应用,促进Linux在中国的普及。   Linux操作系统网络驱动程序编写一.Linux系统设备驱动程序概述1.1 Linux设备驱动程序分类1.2 编写驱动程序的一些基本概念二.Linux系统网络设备驱动程序2.1 网络驱动程序的结构2.2 网络驱动程序的基本方法2.3 网络驱动程序中用到的数据结构2.4 常用的系统支持三.编写Linux网络驱动程序中可能遇到的问题3.1 中断共享3.2 硬件发送忙时的处理
[嵌入式]
基于ARM9-Linux平台的车载导航系统设计
1. 前言 近年来,随着国民经济的迅速发展,人民生活水平的日益提高,各种机动车辆的数量急剧增加,同时对汽车导航系统的需求数量也急剧增加。本文采用了基于ARM9-Linux 平台的嵌入式系统作为系统的控制平台,提高系统的性能、集成度以及可扩展性;运用GPS 定位技术和先进的GPRS 无线通信技术相结合的方案,以实现车辆电子地图导航和短消息报警;通过LCD 模块的设计实现了车辆各种信息的灵活显示,丰富了人机交互界面,使得系统更加智能化。本文所研究的车载GPS 导航系统是智能交通系统(ITS,Intelligent Transportation System)的一个重要分支,对解决城市交通问题具有重要意义。 2. GPS 全球定位系统(
[单片机]
基于ARM9-<font color='red'>Linux</font>平台的车载导航系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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